文章目录
- CMSIS-RTOS API v2
- 任务(线程)管理
- 结构体(数据类型)
- 功能(函数)
- osThreadNew:新建任务(线程)
- osThreadTerminate:终止任务(线程)
- osThreadSuspend:挂起任务(线程)
- osThreadResume:恢复任务(线程)
- osThreadGetName:获取任务名
- osThreadGetId:获取当前任务状态为RUNNING的任务ID(线程号)
- osThreadGetState:获取任务状态
- osThreadSetPriority:设置或改变任务优先级
- osThreadGetPriority:获取任务优先级
- osThreadYield:切换任务流
- osThreadDetach:将任务改变为osThreadDetached
- osThreadJoin:任务已经运行完成的信号
- osThreadExit:终止调用任务
- osThreadGetStackSize:获取任务栈大小
- osThreadGetStackSpace:获取剩余任务栈空间
- osThreadGetCount:获取active任务数量
- osThreadEnumerate:枚举任务数
- 问题
鸿蒙在CMSIS-RTOS2接口中封装了LiteOS-M的内核代码。因此当需要使用CMSIS-RTOS2接口时,只需要调用相应接口就行了。本篇文章将会记录官网API的使用方法以及使用案例,记录自己学习的想法和使用技巧会保持持续更新哟!!!
CMSIS-RTOS API v2
接口顺序将会按照小熊派官网视频讲解的顺序记录以便自己学习和使用。
任务(线程)管理
外文名称:Thread Management
源接口地址:Thread Management
HarmonyOS_PPT:HarmonyOS内核开发-任务管理.pdf
任务管理可以规划函数的运行次序,非常方便地对任务运行的状态进行掌控。
结构体(数据类型)
osThreadAttr_t
所属函数:osThreadNew
数据类型 | 属性名称 | 描述 | 默认值 | 备注 |
---|---|---|---|---|
const char * | name | 任务名称 | NULL | |
uint32_t | attr_bits | 设置 osThreadJoin | 0U | |
void * | cb_mem | 任务块指针 | NULL | |
uint32_t | cb_size | 任务块指针大小 | 0U | |
void * | stack_mem | 任务栈指针 | NULL | |
uint32_t | stack_size | 任务栈指针大小 | 0U | |
osPriority_t | priority | 任务优先级 | osPriorityNormal | |
TZ_ModuleId_t | tz_module | TrustZone模块标识 | 0U | |
uint32_t | reserved | 保留字段 | 0U |
osThreadJoinable
所属结构体:osThreadAttr_t
通过属性名称attr_bits
设置,attr_bits = 1U
任务与资源的关联
osThreadDetached
所属结构体:osThreadAttr_t
属性名称attr_bits
的默认值,attr_bits = 0U
断开任务与资源的关联,并在任务Terminated后资源将会重新归还系统给其他任务使用。
osPriority_t
所属结构体:osThreadAttr_t
属性名称priority
,默认值osPriorityNormal
优先级 | 描述 |
---|---|
osPriorityNone | 无 |
osPriorityIdle | 预留给空闲任务(不可使用) |
osPriorityLow | 8个低级优先级 |
osPriorityBelowNormal | 8个低于正常优先级 |
osPriorityNormal | 8个正常优先级 |
osPriorityAboveNormal | 8个高于正常优先级 |
osPriorityHigh | 8个高级优先级 |
osPriorityRealtime | 8个实时优先级 |
osPriorityISR | 预留给ISR延迟任务(不可使用) |
osPriorityError | 优先级错误 |
osPriorityReserved | 保留字段 |
osThreadFunc_t
所属函数:osThreadNew
任务入口函数,即任务去执行的函数。
如果函数不是osThreadFunc_t
类型,使用时需要给函数转换类型为osThreadFunc_t
。
osThreadId_t
所属函数:[ osThreadTerminate | osThreadSuspend | osThreadResume ]
所属函数返回值:[ osThreadNew | osThreadGetId | osThreadEnumerate | osMutexGetOwner ]
任务ID,即线程号。
可以定位到一个具体任务上面。
osThreadState_t
所属函数返回值:osThreadGetState_t
状态 | 描述 |
---|---|
osThreadInactive | 任务未工作 |
osThreadReady | 任务就绪,随时准备工作 |
osThreadRunning | 任务开始运行 |
osThreadBlocked | 任务阻塞,任务等待中 |
osThreadTerminated | 任务终止,任务停止运行 |
osThreadError | 任务出错,任务不存在或没有scheduled |
osThreadReserved | 保留字段 |
功能(函数)
osThreadNew:新建任务(线程)
参数名称 | 数据类型 | 描述 |
---|---|---|
func | osThreadFunc_t | 任务入口函数 |
argument | void * | 任务入口函数的参数 |
attr | const osThreadAttr_t | 任务的属性 |
返回值 | osThreadId_t | 任务ID |
将任务添加到active任务列表中,将任务状态设置为READY。
osThreadTerminate:终止任务(线程)
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osStatus_t | 操作结果 |
将任务从active任务列表中移除掉。
如果任务当前状态为RUNNING时被该函数终止,这让下一个任务状态为READY的任务开始RUNNING。
如果任务不存在则不会终止该任务,而是返回osErrorResource。
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效或没有其他任务存在 |
osErrorISR | 任务不能被终止 |
osThreadSuspend:挂起任务(线程)
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osStatus_t | 操作结果 |
如果当前作用域下有一个任务状态设置为BLOCKED,那么下一个任务状态为READY的任务开始RUNNING。
如果任务状态为BLOCKED的任务通过 osThreadResume 函数将其恢复,那么任务状态改为READY。
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效或没有其他任务存在 |
osErrorISR | 任务不能被终止 |
osThreadResume:恢复任务(线程)
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osStatus_t | 操作结果 |
将状态变为BLOCKED的任务重新回到READY状态。
通过该函数恢复的任务在当前作用域下,如果其优先级高于某个状态为RUNNING的任务,那么其任务状态直接切换为RUNNIG。
建议:不提倡将不是通过osThreadSuspend函数终止的任务,直接通过该函数进行恢复。
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效或没有其他任务存在 |
osErrorISR | 任务不能被终止 |
osThreadGetName:获取任务名
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | name | 任务名称,默认值为 " " |
osThreadGetId:获取当前任务状态为RUNNING的任务ID(线程号)
参数名称 | 数据类型 | 描述 |
---|---|---|
返回值 | osThreadId_t | 任务ID |
osThreadGetState:获取任务状态
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osThreadState_t | 任务状态 |
如果任务被ISR调用则会返回osThreadError。
osThreadState_t
所属函数返回值:osThreadGetState_t
状态 | 描述 |
---|---|
osThreadInactive | 任务未工作 |
osThreadReady | 任务就绪,随时准备工作 |
osThreadRunning | 任务开始运行 |
osThreadBlocked | 任务阻塞,任务等待中 |
osThreadTerminated | 任务终止,任务停止运行 |
osThreadError | 任务出错,任务不存在或没有scheduled |
osThreadReserved | 保留字段 |
osThreadSetPriority:设置或改变任务优先级
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
priority | osPriority_t | 任务优先级 |
返回值 | osStatus_t | 操作结果 |
osPriority_t
所属结构体:osThreadAttr_t
属性名称priority
,默认值osPriorityNormal
优先级 | 描述 |
---|---|
osPriorityNone | 无 |
osPriorityIdle | 预留给空闲任务(不可使用) |
osPriorityLow | 8个低级优先级 |
osPriorityBelowNormal | 8个低于正常优先级 |
osPriorityNormal | 8个正常优先级 |
osPriorityAboveNormal | 8个高于正常优先级 |
osPriorityHigh | 8个高级优先级 |
osPriorityRealtime | 8个实时优先级 |
osPriorityISR | 预留给ISR延迟任务(不可使用) |
osPriorityError | 优先级错误 |
osPriorityReserved | 保留字段 |
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效或没有其他任务存在 |
osErrorISR | 任务不能被终止 |
osThreadGetPriority:获取任务优先级
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osPriority_t | 任务优先级 |
osPriority_t
所属结构体:osThreadAttr_t
属性名称priority
,默认值osPriorityNormal
优先级 | 描述 |
---|---|
osPriorityNone | 无 |
osPriorityIdle | 预留给空闲任务(不可使用) |
osPriorityLow | 8个低级优先级 |
osPriorityBelowNormal | 8个低于正常优先级 |
osPriorityNormal | 8个正常优先级 |
osPriorityAboveNormal | 8个高于正常优先级 |
osPriorityHigh | 8个高级优先级 |
osPriorityRealtime | 8个实时优先级 |
osPriorityISR | 预留给ISR延迟任务(不可使用) |
osPriorityError | 优先级错误 |
osPriorityReserved | 保留字段 |
osThreadYield:切换任务流
如果由相同优先级的READY状态的任务,那么就开始执行它;如果没有那么继续执行当前任务。
注意事项
- 被切换的任务状态不会设置为BLOCKED状态
- 低优先级的READY状态的任务不会被切换到
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osError | 未知错误 |
osErrorISR | 任务不能被终止 |
osThreadDetach:将任务改变为osThreadDetached
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osPriority_t | 任务优先级 |
当某个任务该函数执行,那么该任务状态为TERMINATED时将会归还所有资源给系统。
任务定义为osThreadDetached时,将不会有任何改变。
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效状态 |
osErrorISR | 任务不能被终止 |
osThreadJoin:任务已经运行完成的信号
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | osPriority_t | 任务优先级 |
注意事项
- 任务状态不为TERMINATED时,会一直等待结果
- 任务状态为TERMINATED时,立马返回结果
osStatus_t
参数名称 | 描述 |
---|---|
osOK | 操作成功 |
osErrorParameter | 任务ID为NULL或无效 |
osErrorResource | 任务无效状态 |
osErrorISR | 任务不能被终止 |
osThreadExit:终止调用任务
不是很懂,应该是可以将结果同步到 osThreadJoin
osThreadGetStackSize:获取任务栈大小
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | uint32_t | 任务栈大小,Bytes |
osThreadGetStackSpace:获取剩余任务栈空间
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_id | osThreadId_t | 任务ID |
返回值 | uint32_t | 任务栈大小,Bytes |
注意事项
- 出错会返回0
- 似乎只能在Stack watermark recording期间才能使用(参考 Thread Configuration)
osThreadGetCount:获取active任务数量
注意事项
- 出错会返回0
osThreadEnumerate:枚举任务数
参数名称 | 数据类型 | 描述 |
---|---|---|
thread_array | osThreadId_t | 任务数组 |
array_items | uint32_t | 接收任务ID的数量 |
返回值 | uint32_t | 枚举的任务数 |
注意事项
- 出错会返回0