5.中断和临界区的保护

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38245860/article/details/80692573

临界区:访问公共资源的代码,在某一个时刻,只能有一个任务能访问公共资源,独占CPU

任务1
funca()
{
value++;
value+=10;
}
任务2
funcb()
{
value++;
}

在以上2个任务中,如果任务1运行过程中任务2也运行了,那么得到的value值可能是错误的。
//RT-Thread使用pend_sv中断来进行任务的切换
任务1
funca()
{	
rt_hw_interrupt_disable;//rt_enter_critical();//关闭系统中断可以禁止任务调度
value++; 
value+=10; rt_hw_interrupt_enable();//rt_exit_critical();
rt_enter_critical
}
任务2
funcb()
{
value++;
}//以上代码正确,value值不会在计算过程中被临时篡改
rt_hw_interrupt_disable()//关闭所有的中断响应
rt_enter_critial()//只是禁止任务中断,并不会关闭中断响应      这2种方式都可以进入临界区        


使用临界区时的注意事项:

临界区中代码不要过度占用CPU时间,临界区中任务是不会调度的,如果占用太多时间,实时操作系统的必要性就体现不出来了

中断服务如何写:

/**
 * This is the timer interrupt service routine.
 *
 */
void SysTick_Handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter(); //进入中断服务之前调用此API
    HAL_IncTick();
    rt_tick_increase();
    /* leave interrupt */
    rt_interrupt_leave();//退出中断服务之前调用此API
}




猜你喜欢

转载自blog.csdn.net/sinat_38245860/article/details/80692573