1.1调度锁
处于调度锁开和调度锁关之间的代码在执行期间是不会被高优先级的任务抢占的。
调度锁只是禁止了任务调度,并没有关闭任何中断。
1.2中断锁
FreeRTOS 没有专门的中断锁函数,可以用临界段!
1.3任务锁
FreeRTOS 没有专门的任务锁函数
但是能有两种实现方法:
- 调度器加锁:FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能,从而高优先级任务也就无法 抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的
- 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick,利用 FreeRTOS 的任务代码临界段处理函数就可以关闭 PendSV 中断和 Systick 中断。因为进入临界 段前,操作寄存器 basepri 关闭了所有小于等于宏定义 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级,
这样低优先级任务在执 行临界段代码期间是不会被高优先级任务打断的,从而就实现了任务锁的效果。
1.4FreeRTOS 调度锁开启
FreeRTOS 的调度锁开启:vTaskSuspendAll(void)
使用注意:
- 调度锁函数只是禁止了任务调度,并没有关闭任何中断。
- 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
- 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引 起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。
1.5FreeRTOS 调度锁关闭
FreeRTOS 的调度锁关闭:vTaskResumeAll(void)
关闭调度锁,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
走着的小站
本文地址: freertos学习笔记五之调度锁,任务锁和中断锁
本文地址: freertos学习笔记五之调度锁,任务锁和中断锁