使用计数型信号量设计:生产者和消费者模型
总结今天学习的API函数,写出函数参数和返回值的意思,并且说明函数功能
创建队列
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size,
const osMessageQueueAttr_t *attr);
uint32_t msg_count:队列中消息的最大数量
uint32_t msg_size:消息的大小
const osMessageQueueAttr_t *attr:队列的属性
返回消息队列的ID
队列写入函数
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr,
uint8_t msg_prio, uint32_t timeout);
osMessageQueueId_t:消息队列的ID
const void *msg_ptr:存储发送消息的指针
uint8_t msg_prio:消息的优先级
uint32_t timeout:超时时间
返回值:
osOK : 如果消息成功发送到队列。
osErrorTimeoutResource : 如果在超时时间内未能将消息放入队列。
osErrorResource : 如果由于其他原因未能将消息放入队列。
读队列函数
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t
*msg_prio, uint32_t timeout);
mq_id : 目标消息队列的标识符。
msg_ptr : 指向接收消息的缓冲区的指针。
msg_prio : 指向用于存储接收到的消息的优先级的指针,可以为NULL。
timeout : 在等待队列中可用消息时的超时时间,以毫秒为单位。如果设置为0,则表示无限等待。
创建信号量
osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count,
const osSemaphoreAttr_t *attr);
max_count :信号量的最大计数。它表示同一时间内可以有多少个任务能够同时获取该信号
量。
initial_count :信号量的初始计数。表示在创建信号量时,初始的可用资源数量。
返回值:
该函数返回一个类型为 osSemaphoreId_t 的信号量句柄,该句柄用于后续的信号量操作。
获取信号量
osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);
sem_id :信号量的句柄,通过 osSemaphoreNew 返回。
timeout :等待信号量的超时时间,可以是一个时间值或特定的宏值,如 osWaitForever
表示一直等待, osNoWait 表示不等待,立即返回。
返回值:
如果成功获取信号量,则返回 osOK 。
osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count,
const osSemaphoreAttr_t *attr);
osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);如果等待超时,则返回 osErrorTimeout 。
如果因为其他原因无法获取信号量,则返回相应的错误码。
释放信号量
osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id);
参数:
sem_id :信号量的句柄,通过 osSemaphoreNew 返回。
返回值:
如果成功释放信号量,则返回 osOK 。
如果释放失败,则返回相应的错误码。
创建互斥量
osMutexId_t osMutexNew(const osMutexAttr_t *attr);
返回值:
osMutexId_t :互斥量的标识符,用于后续对互斥量的操作。
参数:
attr :互斥量的属性,包括优先级、名称等。可以为 NULL ,表示使用默认属性。
获取互斥量
osStatus_t osMutexAcquire(osMutexId_t mutex_id, uint32_t timeout);
返回值:
osStatus_t :表示互斥量获取的状态,可能的取值包括 osOK 、 osErrorResource (资源不可
用)、 osErrorTimeout (超时)等。
参数:
mutex_id :要获取的互斥量的标识符。
timeout :等待互斥量的最大时间,通常以毫秒为单位。可以为 osWaitForever 表示无限等待,
也可以是一个具体的时间值。
释放互斥量
osStatus_t osMutexRelease(osMutexId_t mutex_id);
返回值:
osStatus_t :表示互斥量释放的状态,通常为 osOK 。
参数:
mutex_id :要释放的互斥量的标识符。
创建事件组函数
返回值: 返回一个事件标志组的标识符(ID),用于后续对事件标志组的操作。
参数:
attr :事件标志组的属性,可以为 NULL 或者包含有关事件标志组的一些配置信息的指针。
如果为 NULL ,则使用默认属性。
设置事件组
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags);
返回值: 返回设置之前的事件标志状态。
参数:
ef_id :事件标志组的标识符,是由 osEventFlagsNew 返回的。
flags :要设置的事件标志位,可以使用按位或操作符 | 设置多个标志位。
等待事件组
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t
options, uint32_t timeout);
返回值: 返回实际发生的事件标志位,或者在超时时返回错误代码。
参数:
ef_id :事件标志组的标识符,是由 osEventFlagsNew 返回的。
flags :要等待的事件标志位,可以使用按位或操作符 | 等待多个标志位。
options :等待标志的选项,例如等待所有标志或者只等待任意一个标志。具体取值取决于
RTOS的实现。
timeout :等待的超时时间,单位是毫秒。如果设置为 osWaitForever ,则表示一直等
待,如果设置为0,则表示不等待。