1 调度锁
调度锁就是 RTOS 提供的调度器开关函数。
如果某个任务调用了调度锁,处于调度锁开和调度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了开关中断操作。
【资料图】
2 中断锁
FreeRTOS 没有专门的中断锁函数
中断服务程序临界段处理函数就可以实现同样效果。
3 任务锁
为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。
FreeRTOS 也没有专门的任务锁函数,但是使用 FreeRTOS 现有的功能有两种实现方法:
◆ 通过给调度器加锁实现
利用 FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能。
另外特别注意,调度锁只是禁止了调度器工作,并没有关闭任何中断。
◆ 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick
利用 FreeRTOS 的任务代码临界段处理函数就可以关闭 PendSV 中断和 Systick 中断。
因为进入临界段前,操作寄存器 basepri 关闭了所有小于等于宏定义
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级。
4 FreeRTOS 调度锁开启
使用这个函数要注意以下问题:
1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。
2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。
5 FreeRTOS 调度锁关闭
◆ 调度锁关闭后,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE。
taskYIELD()用于请求切换到另一个任务。
但是,如果没有其他任务的优先级高于或等于调用taskYIELD()的任务,则RTOS调度程序只需选择调用taskYILELD()任务即可再次运行。
如果configUSE_PREEMPTION设置为1,则RTOS调度程序将始终运行能够运行的最高优先级任务,因此调用taskYIELD()不会导致切换到更高优先级的任务。
注意:这样就是说可以切换到同优先级的任务,而FreeRTOS支持同优先级任务,这点需要注意,程序验证是可以切换到同优先级的,