高级会员
- 积分
- 762
- 金钱
- 762
- 注册时间
- 2021-5-18
- 在线时间
- 28 小时
|
一、临界区
使用taskENTER_CRITICAL和taskEXIT_CRITICAL将共享资源操作部分包裹起来,其本质上是使得任务不再切换,并且只有优先级高于configMAX_SYSCAL_INTERRUPT_PRIORITY的中断才能打断该部分操作。
二、挂起调度器
也可以通过挂起调度器的方式来避免任务切换,从而达到独占资源的目的。
相关函数为vTaskSuspendAll()和xTaskResumeAll()
三、互斥量
通过互斥量的方式,要求在访问共享资源前,都需获得该资源的令牌,并在使用后归还令牌。
相关函数xSemaphoreCreateMutex()、xSemaphoreTake()、xSemaphoreGive()
四、守护任务
所谓守护任务即是对某个资源具有唯一所有权的任务,例如对于所有需要打印的地方,由单独一个任务去负责执行,其它任务通过队列的方式与之通信,这样就能保证对打印操作的“原子性”。而这个负责执行打印的任务即是守护任务。
总结
可以看到,上面所有的方法其实都需要编程者本身对资源的所有被使用的方式和地方有清晰的认识,并且严格执行所设定的规避资源竞争的规则。本质上来看,还是得依赖编程者自身对整个任务资源设计的清晰认识,操作系统只是提供了几个方式加以辅助。这么看来,还是优先级最高的中断操作最保险,不用想着资源竞争问题,其余所有中断和任务在操作资源时,还是都得想想的~
原文链接:https://www.yunduoketang.com/article/jiaoxuejq.html
|
|