信号量 :只通知接收方某个事件标志的发生,但不传递具体事件内容。该方式属于OS的API调用,可以引起任务的挂起和恢复。
消息队列:通知接收方某个事件的发生,并且告知接收方事件的内容。该方式属于OS的API调用,可以引起任务的挂起和恢复。
全局变量:可通知事件标志的发生,也可通知事件发生且传递事件内容。但该方式不属于OS的API调用,不会引起任务的挂起和恢复。任务对事件的获知,一般需要不断查询该全局变量的值是否发生变化。
相对来说,使用信号量和消息队列进行任务间通信要比使用全局变量更加安全,对任务间通信联系变量的隔离要高。
1. 信号量:
二值信号量:属于一种同步机制,用于任务同步(信号传递)。允许在一个任务中申请,在另外一个任务中释放。
- 任务间同步,通知某个事件发生。
- 有且仅有两个状态:获取(Take)信号或释放(Give)信号。
互斥信号量:申请与释放要在同一个任务中进行,不能在一个任务中申请而在另一个任务中释放。用于保护共享资源。
- 用于保护共享资源,确保在同一时刻只有一个任务能访问资源。
- 支持任务间互斥访问,避免同时访问导致数据冲突。
- 具有优先级继承机制,避免优先级反转问题,确保高优先级任务能够顺利获取资源。
2. 相关函数接口:
xSemaphoreCreateBinary() 动态创建一个二值信号量。
xSemaphoreCreateBinaryStatic() 静态创建一个二值信号量。(需要预分配信号量内存,适用于内存受限条件下)
xSemaphoreGive() 释放信号量,允许其他任务或中断获取该信号量。
xSemaphoreGiveFromISR() 中断服务例程中释放信号量,使等待该信号量的任务可以被唤醒或继续执行。
xSemaphoreTake() 获取信号量,若信号量已被其他任务获取,则该任务挂起,等待信号量可用。
xSemaphoreTakeFromISR() 从中断服务例程中获取信号量。适用于从 ISR 中访问信号量或进行中断处理。
vSemaphoreDelete() 删除信号量,释放相关资源。