资源管理
对于共享资源的访问或者一些非原子操作的保护,有几种常用方法:
1. 通过挂起中断创建临界区
2. 通过挂起调度器
3. 通过互斥量
1. 挂起中断
taskENTER_CRITICAL();
taskEXIT_CRITICAL();
对于临界区的内容处理短、快速的代码,可以使用中断挂起,但是,该套函数挂起的中断仅仅是优先级在
configMAX_SYSCAL_INTERRUPT_PRIORITY (包含)以下的中断。
这两个函数接口配对使用
这两个函数支持嵌套使用
2. 挂起任务调度器
void vTaskSuspendAll( void ); portBASE_TYPE xTaskResumeAll( void );
这个主要是临界区中的代码处理比较长,将调度器挂起,暂时独占CPU进行处理这段代码
3. 互斥信号量
互斥信号量保证资源被安全的访问,但是,当低优先级任务占有资源时,高优先级任务也要等待低优先级任务释放资源才能进行访问。这是要避免死锁问题。
对于互斥信号量导致的优先级倒挂问题,优先级继承可以对齐进行优化。
守护进程;
对于死锁和优先级倒挂问题,另一个解决方法是: 对于共享资源,仅由唯一一个任务(称作守护进程)进行操作,通过队列进行数据传递,此时,需要此进程有一个较高的优先级,保证能够及时相应,形成生产者消费者模式。