资源管理
资源管理,其实就是前面介绍过的通知方式中的队列信号量互斥量等是如何访问临界资源的,如何做到完全互斥。
在之前举过一个例子:当我们使用全局变量来进行互斥操作时,有可能在改写全局变量时被切换使得不再互斥,这个过程如下图:
在进行bCanuse--的操作时需要分为三步:1.将原值存入寄存器 2.改写寄存器值 3.将寄存器值写入变量中,如果在执行第一步后立刻切换就会导致失去互斥性,而互斥量的实现的最大问题就是如何防止错误的切换。
那么互斥量如何保证互斥访问的呢?总的而言其实也就是两个方法:当有其他任务要 争夺运行权时就关闭调度器防止切换,有其他中断抢夺时就保存现场并关闭中断,结束后恢复现场并开启中断。
对于队列、信号量/互斥量和任务通知来说,根据调用位置的不同分别关闭中断或调度器但是对于时间组来说只需要关闭调度器即可,因为在中断中调用写事件组函数时他的操作为先写timer队列唤醒timertask任务,在任务中写事件组,所以实际上还是调用任务,无需中断
屏蔽中断
暂停调度器
/* 暂停调度器
*在此函数中使得一个变量--
*在调度器中每次切换时会判断这个变量
*/void vTaskSuspendAll( void );/* 恢复调度器
* 返回值: pdTRUE 表示在暂定期间有更高优先级的任务就绪了
* 可以不理会这个返回值
*/
BaseType_t xTaskResumeAll( void );