实时操作系统(RTOS)中Event、 Semaphore、 Mutex 、 MessageQueue相关函数汇总及功能介绍

目录

1. 事件(Event)

创建事件

设置事件

清除事件

等待事件

获取事件

2. 信号量(Semaphore)

创建信号量

获取信号量

释放信号量

3. 互斥锁(Mutex)

创建互斥锁

获取互斥锁

释放互斥锁

4. 消息队列(Message Queue)

创建消息队列

发送消息

接收消息

删除消息队列

总结


        在实时操作系统(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

总结

  • 事件:用于简单的状态通知和条件检查。
  • 信号量:用于控制对共享资源的访问,确保一次只有一个任务可以访问某个资源。
  • 互斥锁:用于保护共享资源,确保同一时间只有一个任务可以访问该资源。
  • 消息队列:用于在任务之间传递结构化的数据,实现任务间的通信。

选择哪种机制取决于你的具体需求。如果你只需要简单的状态通知,事件可能就足够了;如果你需要控制对共享资源的访问,信号量是一个很好的选择;如果你需要保护共享资源并避免竞争条件,互斥锁会更合适;如果你需要在任务之间传递数据,那么消息队列会更合适。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值