FreeRTOS中共享资源的保护
- 共享资源
- 1、关中断、开中断(临界区)
- 2、给调度器上锁、解锁
- 3、信号量
- 4、互斥型信号量
共享资源
\quad 典型的共享资源有:变量(静态或全局)、数据结构体、I/O设备中的寄存器、多个任务访问的函数等。
\quad 共享资源的可靠访问,任务必须对数据具有独享权变得极其重要,否则将可能导致任务间的竞争与数据损坏。
\quad 最常用的独占共享资源的方法有以下几种:
- 关中断
- 禁止任务调度(给调度器上锁)
- 使用信号量(计数型的型号量、二值信号量)
- 使用互斥型信号量(互斥锁)
独占共享资源的方法,取决于代码访问共享资源的速度,即占用共享资源的时间,具体使用说明如下:
1、关中断、开中断(临界区)
-
前提条件:
- 当访问共享资源的速度很快(读取或写入极少量数据时、需要和中断服务程序共享变量或数据结构、喂狗操作等)
- 关于可靠访问也得使用开关中断的方法:如FLASH写数据。就算FLASH访问比较耗时,都得使用开关中断的方法,保证数据的可靠写入和访问,因为数据是无价的。
-
影响:
- 由于使用该方法会影响中断延迟,所以极度不推荐使用该方法。
2、给调度器上锁、解锁
- 前提条件:
- 当访问共享资源如访问全局变量缓冲区数据,甚至全局变量值自加/自减。
- 影响:
- 给调度器上锁同样有缺点,会导致给调度器上锁的任务成为最高优先级。
- 这已经有悖于RTOS的初衷,所以同样不推荐使用该方法,当然该方法比关中断要好些,起码不会影响系统的中断延迟。
3、信号量
- 前提条件:
- 当所有的任务可以无限等待对共享资源(常见于硬件的访问,而该硬件的时候也比较耗时间)的访问时。
- 影响:
- 使用信号量可能导致优先级反转的问题,这样会破坏任务的预期顺序;然而其优点在于它的速度使用互斥型信号量要略快一些。
4、互斥型信号量
- 前提条件:
- 这是访问共享资源的首选方法。特别是当某些任务对共享资源(常见于硬件的访问,而该硬件的时候也比较耗时间)访问有时间要求时。
- 影响:
- RTOS的互斥型信号量具有一套内建的优先级继承机制,用来避免优先级翻转的问题。然而正如上文提到的,该方法相对于普通信号量来说要稍慢一些,因为占有互斥型信号量的任务的优先级可能需要改变,这要占用CPU的时间。