目录
在实时操作系统(RTOS)中,事件(Event)、信号量(Semaphore)、互斥锁(Mutex)和消息队列(Message Queue)是常用的同步和通信机制。下面是这些机制的相关函数及其功能介绍,以 CMSIS-RTOS v2 API 为例:
1. 事件(Event)
创建事件
osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr);
- 功能:创建一个新的事件标志组。
- 参数:
attr
:事件标志组的属性,可以为NULL
或包含名称等信息。
- 返回值:事件标志组的 ID,如果创建失败则返回
NULL
。
设置事件
osStatus_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags);
- 功能:设置一个或多个事件标志位。
- 参数:
ef_id
:事件标志组的 ID。flags
:要设置的标志位。
- 返回值:操作的状态,成功返回
osOK
。
清除事件
osStatus_t osEventFlagsClear(osEventFlagsId_t ef_id, uint32_t flags);
- 功能:清除一个或多个事件标志位。
- 参数:
ef_id
:事件标志组的 ID。flags
:要清除的标志位。
- 返回值:操作的状态,成功返回
osOK
。
等待事件
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);
- 功能:等待一个或多个事件标志位被设置。
- 参数:
ef_id
:事件标志组的 ID。flags
:要等待的标志位。options
:等待选项(如osFlagsWaitAny
或osFlagsWaitAll
)。timeout
:超时时间(毫秒),osWaitForever
表示无限期等待。
- 返回值:当前设置的标志位。
获取事件
uint32_t osEventFlagsGet(osEventFlagsId_t ef_id);
- 功能:获取当前设置的事件标志位。
- 参数:
ef_id
:事件标志组的 ID。
- 返回值:当前设置的标志位。
2. 信号量(Semaphore)
创建信号量
osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);
- 功能:创建一个新的信号量。
- 参数:
max_count
:信号量的最大计数值。initial_count
:信号量的初始计数值。attr
:信号量的属性,可以为NULL
或包含名称等信息。
- 返回值:信号量的 ID,如果创建失败则返回
NULL
。
获取信号量
osStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id, uint32_t timeout);
- 功能:获取一个信号量令牌。
- 参数:
semaphore_id
:信号量的 ID。timeout
:超时时间(毫秒),osWaitForever
表示无限期等待。
- 返回值:操作的状态,成功返回
osOK
。
释放信号量
osStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id);
- 功能:释放一个信号量令牌。
- 参数:
semaphore_id
:信号量的 ID。
- 返回值:操作的状态,成功返回
osOK
。
3. 互斥锁(Mutex)
创建互斥锁
osMutexId_t osMutexNew(const osMutexAttr_t *attr);
- 功能:创建一个新的互斥锁。
- 参数:
attr
:互斥锁的属性,可以为NULL
或包含名称等信息。
- 返回值:互斥锁的 ID,如果创建失败则返回
NULL
。
获取互斥锁
osStatus_t osMutexAcquire(osMutexId_t mutex_id, uint32_t timeout);
- 功能:获取一个互斥锁。
- 参数:
mutex_id
:互斥锁的 ID。timeout
:超时时间(毫秒),osWaitForever
表示无限期等待。
- 返回值:操作的状态,成功返回
osOK
。
释放互斥锁
osStatus_t osMutexRelease(osMutexId_t mutex_id);
- 功能:释放一个互斥锁。
- 参数:
mutex_id
:互斥锁的 ID。
- 返回值:操作的状态,成功返回
osOK
。
4. 消息队列(Message Queue)
创建消息队列
osMessageQueueId_t osMessageQueueNew(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
- 功能:创建一个新的消息队列。
- 参数:
msg_count
:消息队列中的最大消息数。msg_size
:每条消息的最大大小(字节)。attr
:消息队列的属性,可以为NULL
或包含名称等信息。
- 返回值:消息队列的 ID,如果创建失败则返回
NULL
。
发送消息
osStatus_t osMessageQueuePut(osMessageQueueId_t mq_id, const void *msg_ptr, uint32_t msg_prio, uint32_t timeout);
- 功能:将一条消息放入消息队列。
- 参数:
mq_id
:消息队列的 ID。msg_ptr
:指向消息的指针。msg_prio
:消息的优先级。timeout
:超时时间(毫秒),osWaitForever
表示无限期等待。
- 返回值:操作的状态,成功返回
osOK
。
接收消息
osStatus_t osMessageQueueGet(osMessageQueueId_t mq_id, void *msg_ptr, uint32_t *msg_prio, uint32_t timeout);
- 功能:从消息队列中接收一条消息。
- 参数:
mq_id
:消息队列的 ID。msg_ptr
:用于存储接收到的消息的指针。msg_prio
:用于存储接收到的消息的优先级的指针(可选)。timeout
:超时时间(毫秒),osWaitForever
表示无限期等待。
- 返回值:操作的状态,成功返回
osOK
。
删除消息队列
osStatus_t osMessageQueueDelete(osMessageQueueId_t mq_id);
- 功能:删除一个消息队列。
- 参数:
mq_id
:消息队列的 ID。
- 返回值:操作的状态,成功返回
osOK
。
总结
- 事件:用于简单的状态通知和条件检查。
- 信号量:用于控制对共享资源的访问,确保一次只有一个任务可以访问某个资源。
- 互斥锁:用于保护共享资源,确保同一时间只有一个任务可以访问该资源。
- 消息队列:用于在任务之间传递结构化的数据,实现任务间的通信。
选择哪种机制取决于你的具体需求。如果你只需要简单的状态通知,事件可能就足够了;如果你需要控制对共享资源的访问,信号量是一个很好的选择;如果你需要保护共享资源并避免竞争条件,互斥锁会更合适;如果你需要在任务之间传递数据,那么消息队列会更合适。