目录
- 二值信号量
队列的状态不为空即为满,只有两个状态,就称为二值,这非常合适地表达了某个外部事件的状态,就是到达和未到,所以可以直接进行映射,二值信号量为满代表事件到达,二值信号量为空代表事件未到
二值信号量操作API:
API | 功能 |
xSemaphoreCreateBinary() | 创建二值信号量 |
xSemaphoreGive() | 任务状态下给出信号量 |
xSemaphoreTake() | 任务状态下得到信号量 |
xSemaphoreTakeFromISR() | 中断状态下给出信号量 |
xSemaphoreTakeFromISR() | 中断状态下得到信号量 |
vSemaphoreDelete() | 删除信号量 |
有了二值信号量,就可以使得中断和任务同步,并且把事件工作量转移到任务上,一般的使用过程是:创建二值信号量,某个任务与某个事件挂钩,事件的执行工作在任务的任务函数中,任务阻塞获得二值信号量(take操作),事件到达触发中断后,ISR中给出二值信号量(give操作),这样任务就会被解除阻塞,然后执行,执行完毕后再次阻塞等待二值信号量
- 计数信号量
FreeRTOS是多任务并发执行,任务阻塞态的解除其实需要一段时间,并不是二值信号量一旦给出,任务就能马上获得,所以如果事件发生比较频繁,在这段时间内有多个相同的事件到达,那么中断就会发生多次,但是二值信号量只能记录一个状态,于是后来的中断就会覆盖前面的中断,发生了中断丢失,即使多个中断到达了,但是任务依然只看见一个
如果某个中断比较频繁,为了能够记录多个同样中断的到达,需要使用计数信号量,可以认为是一个数组,数组内的每一个元素都是二值信号量,计数信号量能够记录多个状态,这样即使任务没有马上获得信号量,后来的中断也不会覆盖前面的中断,中断就不会丢失
计数信号量的API:
API | 功能 |
xSemaphoreCreateCounting() | 创建计数信号量 |