一、调度锁
1、概念:
调度锁即 禁止任务调度 ,调度锁开和调度锁关之间的代码在执行期间不会被高优先级的任务抢占。
在获取调度锁期间,任务调度器将被禁用,因此任务都无法被调度。
注意调度锁只能在任务上下文中使用。
2、API:
vTaskSuspendAll
开启调度锁
xTaskResumeAll ()
关闭调度锁
3、注意:
- 调度锁函数只是禁止了任务调度,并没有关闭任何中断。(临界段进行了开关中断操作)
- 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
- 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。
二、中断锁
1、概念:
中断锁即 中断开关 ,FreeRTOS 没有专门的中断锁函数,可以使用中断服务程序里面临界段的处理。
2、API:
taskENTER_CRITICAL_FROM_ISR()
进入临界段
taskEXIT_CRITICAL_FROM_ISR( x )
退出临界段
三、任务锁
1、概念:
任务锁即为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制。 FreeRTOS 也没有专门的任务锁函数。
2、实现方式
(1)使用调度器加锁实现
vTaskSuspendAll()
开启调度锁
xTaskResumeAll ()
关闭调度锁
(2) 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
利用 FreeRTOS 的 任务代码临界段处理函数 就可以关闭 PendSV 中断和 Systick 中断。
因为进入临界段前,操作寄存器 basepri 关闭了所有小于等于宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级( 实现任务切换功能 的 PendSV 中断和滴答定时器中断是最低优先级中断,所以也是被关闭的 ),这样低优先级任务在执行临界段代码期间是不会被高优先级任务打断的,从而就实现了任务锁的效果。
taskENTER_CRITICAL()
进入临界段
taskEXIT_CRITICAL()
退出临界段