【翻译CMSIS_RTOS2 API v2】鸿蒙CMSIS-RTOS2接口之互斥锁
RTOS互斥锁接口的使用以及问题
·
文章目录
鸿蒙在CMSIS-RTOS2接口中封装了LiteOS-M的内核代码。因此当需要使用CMSIS-RTOS2接口时,只需要调用相应接口就行了。本篇文章将会记录官网API的使用方法以及使用案例,记录自己学习的想法和使用技巧会保持持续更新哟!!!
CMSIS-RTOS API v2
接口顺序将会按照小熊派官网视频讲解的顺序记录以便自己学习和使用。
互斥锁
外文名称:Mutex Management
源接口地址:Mutex Management
HarmonyOS_PPT:HarmonyOS内核开发-互斥锁.pdf
用于保护共享资源的访问,互斥体可以在任务中传递。
- 任何时刻只能有一个任务访问具有互斥锁的资源
结构体(数据类型)
osMutexAttr_t
所属函数:osMutexNew
数据类型 | 属性名称 | 描述 | 默认值 | 备注 |
---|---|---|---|---|
const char * | name | 互斥锁名称 | NULL | |
uint32_t | attr_bits | 属性位 | 0U | |
void * | cb_mem | 互斥锁块指针 | NULL | |
uint32_t | cb_size | 互斥锁块指针大小 | 0U |
osMutexRecursive
所属结构体:osMutexAttr_t
attr_bits 设置为 osMutexRecursive。
- 同一任务使用多个互斥锁且不会自锁
- 拥有这个互斥锁的任务lock数会递增
- 互斥锁需要释放多次直至lock数为0
- 互斥锁lock数为0时,其他任务可以获得这个互斥锁
osMutexPrioInherit
所属结构体:osMutexAttr_t
attr_bits 设置为 osMutexPrioInherit。
- 如果设置优先级继承策略,那么优先级翻转问题会得到解决
- 如果没有优先级继承策略,那么可能高优先级任务会被低优先级任务给阻塞
osMutexRobust
所属结构体:osMutexAttr_t
attr_bits 设置为 osMutexRobust。
- 如果互斥锁里面的任务处于TERMINATED状态,那么互斥锁将会自动释放
- 如果没有设置这个属性,互斥锁不会自动释放需要手动
osMutexId_t
所属函数:[ osMutexGetName| osMutexAcquire|osMutexRelease| osMutexGetOwner| osMutexDelete]
所属函数返回值:osMutexNew
互斥锁ID,即互斥锁唯一标识符
功能(函数)
osMutexNew:新建互斥锁
参数名称 | 数据类型 | 描述 |
---|---|---|
attr | const osMutexAttr_t* | 互斥锁的属性 |
返回值 | osMutexId_t | 互斥锁ID |
注意事项
- 互斥锁只有在 osMutexNew 使用后,才能被调用
- 可以在RTOS开始前进行调用
- 出错返回NULL
osMutexAcquire:阻塞互斥锁
参数名称 | 数据类型 | 描述 |
---|---|---|
mutex_id | osMutexId_t | 互斥锁ID |
timeout | uint32_t | 超时值,默认值为0U |
返回值 | osStatus_t | 操作结果 |
- timeout设置系统多久获取互斥锁,在此期间任务属于BLOCKED状态
timeout
超时值 | 描述 |
---|---|
0U | 互斥锁立即返回 |
osWaitForever | 互斥锁无限等待,直至互斥锁可用 |
uint32_t | 超时值 |
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 互斥锁ID为NULL |
osErrorResource | 没有指定超时值 |
osErrorISR | 不能被终止 |
osErrorTimeout | 互斥锁无法获取 |
osMutexRelease: 释放互斥锁
参数名称 | 数据类型 | 描述 |
---|---|---|
mutex_id | osMutexId_t | 互斥锁ID |
返回值 | osStatus_t | 操作结果 |
- 等待当前互斥锁的任务的状态变为READY状态
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 互斥锁ID为NULL或无效 |
osErrorResource | 互斥锁不能释放 |
osErrorISR | 不能被终止 |
osMutexDelete:删除互斥锁
参数名称 | 数据类型 | 描述 |
---|---|---|
mutex_id | osMutexId_t | 互斥锁ID |
返回值 | osStatus_t | 操作结果 |
- 释放互斥锁获得的内存
- 互斥锁ID不可使用,需通过osMutexNew再次创建
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 互斥锁ID为NULL或无效 |
osErrorResource | 无状态 |
osErrorISR | 不能被终止 |
osMutexGetName:获取互斥锁名称
参数名称 | 数据类型 | 描述 |
---|---|---|
mutex_id | osMutexId_t | 互斥锁ID |
返回值 | const char * | 互斥锁名称,默认值为 " " |
注意事项
- 出错返回NULL
osMutexGetOwner:获取互斥锁里面任务ID
参数名称 | 数据类型 | 描述 |
---|---|---|
mutex_id | osMutexId_t | 互斥锁ID |
返回值 | osThreadId_t | 任务ID |
注意事项
- 没有互斥锁返回NULL
- 出错返回NULL
更多推荐
已为社区贡献4条内容
所有评论(0)