一 禁止中断
通过函数taskENTER_CRITICAL() ,taskEXIT_CRITICAL()实现
更改就绪列表时,通常是通过禁止中断的方式,进入临界段,因为systick中断中有可以更改就绪列表的权利,
就绪列表(如 pxReadyTasksLists[]
数组)是全局共享的关键数据结构,存储了所有可运行任务的信息。多个任务或中断服务程序(ISR)可能并发访问该列表。若不进行保护,可能导致链表节点损坏、优先级错乱等数据竞争问题。
二 禁止任务调度器
通过函数vTaskSuspendAll(),xTaskResumeAll()实现
vTaskSuspendAll()函数的功能很简单,就是对全局变量uxSchedulerSuspended 的值进行自增.
其核心功能是暂停所有任务调度(但允许中断),确保当前任务独占执行权,直到调用xTaskResumeAll()恢复调度。如下图所示,就是不进行任何任务的寻找与切换。
与临界区(关中断)不同,vTaskSuspendAll()仅暂停调度器,中断仍可响应,适用于需长时间保护临界区但需响应中断的场景。
注意此函数须与xTaskResumeAll()成对使用;每调用一次vTaskSuspendAll(),uxSchedulerSuspended自增一次,说明有一个任务需要暂停其他所有任务,再调用一次vTaskSuspendAll(),uxSchedulerSuspended再自增一次,说明又一个任务需要暂停其他所有任务,使用xTaskResumeAll()自减的时候,直到减到0才能释放任务调度权。