一、进程间通信
在使用RTOS的系统中,有多个任务,还可以有多个中断的ISR,任务和ISR可以统称为进程。任务与任务之间,或任务与ISR之间,有时需要进行通信或同步,这称为进程间通信。
FreeRTOS提供了多种进程间通信技术,各种技术有各自的特点和用途。
1.队列:将进程间需要传递的数据存在其中,所以队列又称为邮箱。
向队列写入数据的三种方式:(1)FIFO先进先出,写入后端(2)LIFO后进先出,写入前端(3)尾端覆盖,在队列满时。
从队列读取数据:(1)读取后删除(2)读取后不删除
2.信号量
二值信号量:就是只有一个项的队列,这个队列要么是空的,要么是满的,适合用于进程间的同步的通信,可能会出现优先级翻转的问题。
计数信号量:比二值信号量的队列多,队列里的项的个数可以自己设定。
但是信号量会出现优先级翻转的问题。
3.互斥量
互斥信号量是对信号量的一种改进,增加了优先级继承机制,虽不能完全消除优先级翻转问题,但是可以缓解该问题。
但是互斥量不能在ISR中使用。因为ISR里不能有长时间的延时,而使用互斥量时,经常需要等待释放互斥量。
4.事件组:适用于多个事件触发一个或多个任务运行,可以实现事件的广播,还可以实现多个任务的同步运行。
任务在等待事件时会进入阻塞状态,在等待的事件条件成立时解除阻塞状态。
5.任务通知
还没学到.......
6.流缓冲区
还没学到.......
二、消息队列
向队列写入数据:在队列未满时,可以向队列写入数据;在队列已满时,函数返回错误。
从队列读取数据:读取数据总是从队列首端读取,读出后删除这个单元的数据(也可以不删...),如果后面还有未读取的数据,就依次向队列首端移动。
如果设置了等待节拍数并且队列里没有数据,任务就会进入阻塞状态并等待指定的时间。如果在此等待时间内,队列里有了数据,就会退出阻塞状态,进入就绪状态。如果超过了等待时间,队列里还是没有数据,函数返回错误,任务退出阻塞状态,进入就绪状态。