本文共 807 字,大约阅读时间需要 2 分钟。
临界区:访问公共资源的代码,在某一个时刻,只能有一个任务能访问公共资源,独占CPU
任务1funca(){value++;value+=10;}任务2funcb(){value++;}在以上2个任务中,如果任务1运行过程中任务2也运行了,那么得到的value值可能是错误的。
//RT-Thread使用pend_sv中断来进行任务的切换任务1funca(){ rt_hw_interrupt_disable;//rt_enter_critical();//关闭系统中断可以禁止任务调度value++; value+=10; rt_hw_interrupt_enable();//rt_exit_critical();rt_enter_critical}任务2funcb(){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}
转载地址:http://uswsi.baihongyu.com/