【翻译CMSIS_RTOS2 API v2】鸿蒙CMSIS-RTOS2接口之任务(线程)管理

鸿蒙在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_tattr_bits设置 osThreadJoin0U
void *cb_mem任务块指针NULL
uint32_tcb_size任务块指针大小0U
void *stack_mem任务栈指针NULL
uint32_tstack_size任务栈指针大小0U
osPriority_tpriority任务优先级osPriorityNormal
TZ_ModuleId_ttz_moduleTrustZone模块标识0U
uint32_treserved保留字段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预留给空闲任务(不可使用)
osPriorityLow8个低级优先级
osPriorityBelowNormal8个低于正常优先级
osPriorityNormal8个正常优先级
osPriorityAboveNormal8个高于正常优先级
osPriorityHigh8个高级优先级
osPriorityRealtime8个实时优先级
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:新建任务(线程)

参数名称数据类型描述
funcosThreadFunc_t任务入口函数
argumentvoid *任务入口函数的参数
attrconst osThreadAttr_t任务的属性
返回值osThreadId_t任务ID

将任务添加到active任务列表中,将任务状态设置为READY

osThreadTerminate:终止任务(线程)

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osStatus_t操作结果

将任务从active任务列表中移除掉。

如果任务当前状态为RUNNING时被该函数终止,这让下一个任务状态为READY的任务开始RUNNING

如果任务不存在则不会终止该任务,而是返回osErrorResource

osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效或没有其他任务存在
osErrorISR任务不能被终止

osThreadSuspend:挂起任务(线程)

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osStatus_t操作结果

如果当前作用域下有一个任务状态设置为BLOCKED,那么下一个任务状态为READY的任务开始RUNNING

如果任务状态为BLOCKED的任务通过 osThreadResume 函数将其恢复,那么任务状态改为READY

osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效或没有其他任务存在
osErrorISR任务不能被终止

osThreadResume:恢复任务(线程)

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osStatus_t操作结果

将状态变为BLOCKED的任务重新回到READY状态。

通过该函数恢复的任务在当前作用域下,如果其优先级高于某个状态为RUNNING的任务,那么其任务状态直接切换为RUNNIG

建议:不提倡将不是通过osThreadSuspend函数终止的任务,直接通过该函数进行恢复。

osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效或没有其他任务存在
osErrorISR任务不能被终止

osThreadGetName:获取任务名

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值name任务名称,默认值为 " "

osThreadGetId:获取当前任务状态为RUNNING的任务ID(线程号)

参数名称数据类型描述
返回值osThreadId_t任务ID

osThreadGetState:获取任务状态

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osThreadState_t任务状态

如果任务被ISR调用则会返回osThreadError

osThreadState_t

所属函数返回值:osThreadGetState_t

状态描述
osThreadInactive任务未工作
osThreadReady任务就绪,随时准备工作
osThreadRunning任务开始运行
osThreadBlocked任务阻塞,任务等待中
osThreadTerminated任务终止,任务停止运行
osThreadError任务出错,任务不存在或没有scheduled
osThreadReserved保留字段

osThreadSetPriority:设置或改变任务优先级

参数名称数据类型描述
thread_idosThreadId_t任务ID
priorityosPriority_t任务优先级
返回值osStatus_t操作结果
osPriority_t

所属结构体:osThreadAttr_t

属性名称priority,默认值osPriorityNormal

优先级描述
osPriorityNone
osPriorityIdle预留给空闲任务(不可使用)
osPriorityLow8个低级优先级
osPriorityBelowNormal8个低于正常优先级
osPriorityNormal8个正常优先级
osPriorityAboveNormal8个高于正常优先级
osPriorityHigh8个高级优先级
osPriorityRealtime8个实时优先级
osPriorityISR预留给ISR延迟任务(不可使用)
osPriorityError优先级错误
osPriorityReserved保留字段
osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效或没有其他任务存在
osErrorISR任务不能被终止

osThreadGetPriority:获取任务优先级

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osPriority_t任务优先级
osPriority_t

所属结构体:osThreadAttr_t

属性名称priority,默认值osPriorityNormal

优先级描述
osPriorityNone
osPriorityIdle预留给空闲任务(不可使用)
osPriorityLow8个低级优先级
osPriorityBelowNormal8个低于正常优先级
osPriorityNormal8个正常优先级
osPriorityAboveNormal8个高于正常优先级
osPriorityHigh8个高级优先级
osPriorityRealtime8个实时优先级
osPriorityISR预留给ISR延迟任务(不可使用)
osPriorityError优先级错误
osPriorityReserved保留字段

osThreadYield:切换任务流

如果由相同优先级的READY状态的任务,那么就开始执行它;如果没有那么继续执行当前任务。

注意事项

  • 被切换的任务状态不会设置为BLOCKED状态
  • 低优先级的READY状态的任务不会被切换到
osStatus_t
参数名称描述
osOK操作成功
osError未知错误
osErrorISR任务不能被终止

osThreadDetach:将任务改变为osThreadDetached

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osPriority_t任务优先级

当某个任务该函数执行,那么该任务状态为TERMINATED时将会归还所有资源给系统。

任务定义为osThreadDetached时,将不会有任何改变。

osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效状态
osErrorISR任务不能被终止

osThreadJoin:任务已经运行完成的信号

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值osPriority_t任务优先级

注意事项

  • 任务状态不为TERMINATED时,会一直等待结果
  • 任务状态为TERMINATED时,立马返回结果
osStatus_t
参数名称描述
osOK操作成功
osErrorParameter任务ID为NULL或无效
osErrorResource任务无效状态
osErrorISR任务不能被终止

osThreadExit:终止调用任务

不是很懂,应该是可以将结果同步到 osThreadJoin

osThreadGetStackSize:获取任务栈大小

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值uint32_t任务栈大小,Bytes

osThreadGetStackSpace:获取剩余任务栈空间

参数名称数据类型描述
thread_idosThreadId_t任务ID
返回值uint32_t任务栈大小,Bytes

注意事项

  • 出错会返回0
  • 似乎只能在Stack watermark recording期间才能使用(参考 Thread Configuration

osThreadGetCount:获取active任务数量

注意事项

  • 出错会返回0

osThreadEnumerate:枚举任务数

参数名称数据类型描述
thread_arrayosThreadId_t任务数组
array_itemsuint32_t接收任务ID的数量
返回值uint32_t枚举的任务数

注意事项

  • 出错会返回0

问题

哪些因素影响任务变为BLOCKED状态?

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值