参考链接
简介
CMSIS-OS(Common Microcontroller Software Interface Standard - Operating System)是一种通用的嵌入式操作系统接口标准。它旨在简化微控制器软件开发,为使用Cortex-M和入门级Cortex-A处理器的开发人员提供一致且高效的接口。
接口标准:CMSIS-OS与各种芯片和软件供应商紧密合作,提供了一种通用的接口,用于与外设、实时操作系统和中间件组件进行交互。它旨在实现来自多个供应商的软件组件的互操作性。
目标:CMSIS-OS的目标是为嵌入式系统提供一致的编程接口,使开发人员能够轻松地在不同的RTOS系统之间移植代码。它还促进了软件模板、中间件、库和其他组件的跨RTOS系统的共享。
功能:CMSIS-OS定义了一组API,用于线程管理、定时器、信号量、消息队列、内存池等。这些API可在支持CMSIS-OS的不同RTOS系统之间进行移植。
封装:CMSIS-RTOS2 的统一功能集减少了学习工作量并简化了软件组件的共享。使用 CMSIS-RTOS2 的中间件组件与 RTOS 无关,并且更容易适应。
例程:CMSIS-RTOS2 的标准项目模板可以随免费提供的 CMSIS-RTOS2 实现一起提供。
内存管理
内存管理相关API
osMemoryPoolNew
API | Function |
---|---|
osMemoryPoolNew (uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr) | 创建新的内存池 |
Params | Description |
---|---|
block_count | 内存池内包含内存块的数量 |
block_size | 每个内存块的字节数 |
attr | 附加参数属性,属性中可定义内存池名称 |
return | 返回osMemoryPoolId_t类型的指针,指向内存池 |
介绍:
- 函数
osMemoryPoolNew
创建并初始化内存池对象,并返回指向内存池对象标识符的指针,如果出现错误,则返回NULL
。之后可以使用osMemoryPoolAlloc
对内存块进行取用分配。
注意:
- 它可以在 RTOS 启动之前(调用
osKernelStart
)安全地调用,但不能在初始化之前(调用osKernelInitialize
)。 - 不可在中断服务中调用
- 所需的内存总量至少为
block_count * block_size
。池中的内存只能以block_size
的固定部分分配/释放。
消息队列
消息队列相关API
osMessageQueueNew
API | Function |
---|---|
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); | 创建新的消息队列 |
Params | Description |
---|---|
msg_count | 队列中最大消息数 |
msg_size | 每个消息最大字节数,按4的倍数取整以满足32位字节对齐 |
return | 返回osMessageQueueId_t类型指针,指向消息队列控制块 |
Attrs | Description |
---|---|
name | 消息队列名称 |
attr_bits | 保留,默认为0 |
cb_mem | 内存控制块指针,使用NULL自动分配 |
cb_size | 内存控制块大小 |
mq_mem | 数据存储区指针,使用NULL自动分配 |
mq_size | 数据存储区字节数,最小为msg_count * msg_size |
osMessageQueuePut
API | Function |
---|---|
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) | 创建新的消息队列 |
Params | Description |
---|---|
mq_id | 消息队列控制块 |
msg_ptr | 指向消息缓冲区的指针 |
msg_prio | 指向消息优先级的指针/NULL |
timeout | 超时时间 |
osMessageQueueGet
API | Function |
---|---|
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) | 从消息队列中获取1个消息,如果队列为空,则等待至超时 |
Params | Description |
---|---|
mq_id | 消息队列控制块 |
msg_ptr | 指向消息缓冲区的指针 |
msg_prio | 指向消息优先级的指针/NULL |
timeout | 超时时间 |
Params | Description |
---|---|
osOK | 已从队列中取得消息 |
osErrorTimeout | 给定时间内未能取得消息 |
osErrorResource | 队列中没有消息 |
osErrorParameter | mq_id为空指针或无效/中断中指定了非零超时 |