LiteOS学习第四篇——任务创建
来源:互联网 发布:北京行知园地址 编辑:程序博客网 时间:2024/05/21 06:40
1、创建任务首先看一下创建任务需要的数据,结构体如下
typedef struct tagTskInitParam
{
TSK_ENTRY_FUNC pfnTaskEntry; /**< Task entrance function */
UINT16 usTaskPrio; /**< Task priority */
UINT32 auwArgs[4]; /**< Task parameters, of which the maximum number is four */
UINT32 uwStackSize; /**< Task stack size */
CHAR *pcName; /**< Task name */
UINT32 uwResved; /**< Reserved. It is automatically deleted if set to LOS_TASK_STATUS_DETACHED. It is unable to be deleted if set to 0.*/
} TSK_INIT_PARAM_S;
其中难理解的是
auwArgs[4] :这个是指任务入口参数的,比如你的任务入口参数为void Task1(UINT32 arg);则在创建任务时将xx.auwArgs[0]=0;则在刚开始调取任务时就会将0传到Task1函数
pcName :任务名称,这个是不能给空的,暂时估计只是预留在里面,各个任务名称不要一样
uwResved:这个并不是保留的,而是定义在任务执行完后要不要自删除,LOS_TASK_STATUS_DETACHED,我们可以在osTaskEntry函数中他的用法
2、举例子说明任务创建
UINT32 g_uwTskLoID;UINT32 g_uwTskHiID;#define TSK_PRIOR_HI 4#define TSK_PRIOR_LO 5UINT32 Example_TaskHi(){ UINT32 uwRet; UINT32 uwCurrentID; TSK_INFO_S stTaskInfo; printf("Enter TaskHi Handler.\r\n"); /*延时2个Tick,延时后该任务会挂起,执行剩余任务中最高优先级的任务(g_uwTskLoID任务)*/ uwRet = LOS_TaskDelay(2); if (uwRet != LOS_OK) { printf("Delay Task Failed.\r\n"); return LOS_NOK; } /*2个Tick时间到了后,该任务恢复,继续执行*/ printf("TaskHi LOS_TaskDelay Done.\r\n"); /*挂起自身任务*/ uwRet = LOS_TaskSuspend(g_uwTskHiID); if (uwRet != LOS_OK) { printf("Suspend TaskHi Failed.\r\n"); return LOS_NOK; } printf("TaskHi LOS_TaskResume Success.\r\n");}/*低优先级任务入口函数*/UINT32 Example_TaskLo(){ UINT32 uwRet; UINT32 uwCurrentID; TSK_INFO_S stTaskInfo; printf("Enter TaskLo Handler.\r\n"); /*延时2个Tick,延时后该任务会挂起,执行剩余任务中就高优先级的任务(背景任务)*/ uwRet = LOS_TaskDelay(2); if (uwRet != LOS_OK) { printf("Delay TaskLo Failed.\r\n"); return LOS_NOK; } printf("TaskHi LOS_TaskSuspend Success.\r\n"); /*恢复被挂起的任务g_uwTskHiID*/ uwRet = LOS_TaskResume(g_uwTskHiID); if (uwRet != LOS_OK) { printf("Resume TaskHi Failed.\r\n"); return LOS_NOK; } printf("TaskHi LOS_TaskDelete Success.\r\n");}/*任务测试入口函数,在里面创建优先级不一样的两个任务*/UINT32 Example_TskCaseEntry(VOID){ UINT32 uwRet; TSK_INIT_PARAM_S stInitParam; /*锁任务调度*/ LOS_TaskLock(); printf("LOS_TaskLock() Success!\r\n"); stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi; stInitParam.usTaskPrio = TSK_PRIOR_HI; stInitParam.pcName = "HIGH_NAME"; stInitParam.uwStackSize = 0x400; stInitParam.uwResved = LOS_TASK_STATUS_DETACHED; /*创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行*/ uwRet = LOS_TaskCreate(&g_uwTskHiID, &stInitParam); if (uwRet != LOS_OK) { LOS_TaskUnlock(); printf("Example_TaskHi create Failed!\r\n"); return LOS_NOK; } printf("Example_TaskHi create Success!\r\n"); stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo; stInitParam.usTaskPrio = TSK_PRIOR_LO; stInitParam.pcName = "LOW_NAME"; stInitParam.uwStackSize = 0x400; stInitParam.uwResved = LOS_TASK_STATUS_DETACHED; /*创建低优先级任务,由于锁任务调度,任务创建成功后不会马上执行*/ uwRet = LOS_TaskCreate(&g_uwTskLoID, &stInitParam); if (uwRet != LOS_OK) { LOS_TaskUnlock(); printf("Example_TaskLo create Failed!\r\n"); return LOS_NOK; } printf("Example_TaskLo create Success!\r\n"); /*解锁任务调度,此时会发生任务调度,执行就绪列表中最高优先级任务*/ LOS_TaskUnlock(); while(1){}; return LOS_OK;}创建任务注意事项: 创建任务时记得锁任务调度
3、任务函数常用接口
功能分类 接口名 描述
任务的创建和删除
LOS_TaskCreateOnly
创建任务,并使该任务进入suspend状态,并不调度
LOS_TaskCreate
创建任务,并使该任务进入ready状态,并调度
LOS_TaskDelete
删除指定的任务
任务状态控制
LOS_TaskResume
恢复挂起的任务
LOS_TaskSuspend
挂起指定的任务
LOS_TaskDelay
任务延时等待
LOS_TaskYield
显式放权,调整指定优先级的任务调度顺序
任务调度的控制
LOS_TaskLock
锁任务调度
LOS_TaskUnlock
解锁任务调度
任务优先级的控制
LOS_CurTaskPriSet
设置当前任务的优先级
LOS_TaskPriSet
设置指定任务的优先级
LOS_TaskPriGet
获取指定任务的优先级
任务信息获取
LOS_CurTaskIDGet
获取当前任务的ID
LOS_TaskInfoGet
获取指定任务的信息
4、任务创建常见错误码
序号 定义 实际数值 描述 参考解决方案
1
LOS_ERRNO_TSK_NO_MEMORY
0x03000200
内存空间不足
分配更大的内存分区
2
LOS_ERRNO_TSK_PTR_NULL
0x02000201
任务参数为空
检查任务参数
3
LOS_ERRNO_TSK_STKSZ_NOT_ALIGN
0x02000202
任务栈大小未对齐
对齐任务栈
4
LOS_ERRNO_TSK_PRIOR_ERROR
0x02000203
不正确的任务优先级
检查任务优先级
5
LOS_ERRNO_TSK_ENTRY_NULL
0x02000204
任务入口函数为空
定义任务入口函数
6
LOS_ERRNO_TSK_NAME_EMPTY
0x02000205
任务名为空
设置任务名
7
LOS_ERRNO_TSK_STKSZ_TOO_SMALL
0x02000206
任务栈太小
扩大任务栈
8
LOS_ERRNO_TSK_ID_INVALID
0x02000207
无效的任务ID
检查任务ID
9
LOS_ERRNO_TSK_ALREADY_SUSPENDED
0x02000208
任务已经被挂起
等待这个任务被恢复后,再去尝试挂起这个任务
10
LOS_ERRNO_TSK_NOT_SUSPENDED
0x02000209
任务未被挂起
挂起这个任务
11
LOS_ERRNO_TSK_NOT_CREATED
0x0200020a
任务未被创建
创建这个任务
12
LOS_ERRNO_TSK_DELETE_LOCKED
0x0300020b
删除任务时,任务处于被锁状态
等待解锁任务之后再进行删除操作
13
LOS_ERRNO_TSK_MSG_NONZERO
0x0200020c
任务信息非零
暂不使用该错误码
14
LOS_ERRNO_TSK_DELAY_IN_INT
0x0300020d
中断期间,进行任务延时
等待退出中断后再进行延时操作
15
LOS_ERRNO_TSK_DELAY_IN_LOCK
0x0200020e
任务被锁的状态下,进行延时
等待解锁任务之后再进行延时操作
16
LOS_ERRNO_TSK_YIELD_INVALID_TASK
0x0200020f
将被排入行程的任务是无效的
检查这个任务
17
LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK
0x02000210
没有或者仅有一个可用任务能进行行程安排
增加任务数
18
LOS_ERRNO_TSK_TCB_UNAVAILABLE
0x02000211
没有空闲的任务控制块可用
增加任务控制块数量
19
LOS_ERRNO_TSK_HOOK_NOT_MATCH
0x02000212
任务的钩子函数不匹配
暂不使用该错误码
20
LOS_ERRNO_TSK_HOOK_IS_FULL
0x02000213
任务的钩子函数数量超过界限
暂不使用该错误码
21
LOS_ERRNO_TSK_OPERATE_IDLE
0x02000214
这是个IDLE任务
检查任务ID,不要试图操作IDLE任务
22
LOS_ERRNO_TSK_SUSPEND_LOCKED
0x03000215
将被挂起的任务处于被锁状态
等待任务解锁后再尝试挂起任务
23
LOS_ERRNO_TSK_FREE_STACK_FAILED
0x02000217
任务栈free失败
该错误码暂不使用
24
LOS_ERRNO_TSK_STKAREA_TOO_SMALL
0x02000218
任务栈区域太小
该错误码暂不使用
25
LOS_ERRNO_TSK_ACTIVE_FAILED
0x03000219
任务触发失败
创建一个IDLE任务后执行任务转换
26
LOS_ERRNO_TSK_CONFIG_TOO_MANY
0x0200021a
过多的任务配置项
该错误码暂不使用
27
LOS_ERRNO_TSK_CP_SAVE_AREA_NOT_ALIGN
0x0200021b
暂无
该错误码暂不使用
28
LOS_ERRNO_TSK_MSG_Q_TOO_MANY
0x0200021d
暂无
该错误码暂不使用
29
LOS_ERRNO_TSK_CP_SAVE_AREA_NULL
0x0200021e
暂无
该错误码暂不使用
30
LOS_ERRNO_TSK_SELF_DELETE_ERR
0x0200021f
暂无
该错误码暂不使用
31
LOS_ERRNO_TSK_STKSZ_TOO_LARGE
0x02000220
任务栈大小设置过大
减小任务栈大小
32
LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED
0x02000221
不允许挂起软件定时器任务
检查任务ID, 不要试图挂起软件定时器任务
- LiteOS学习第四篇——任务创建
- LiteOS学习第五篇——任务切换
- LiteOS学习第六篇——任务堆栈初始化
- LiteOS 学习第二篇——基本介绍
- LiteOS学习第七篇——系统滴答
- LiteOS学习第七篇——中断管理
- LiteOS学习第三篇——los_config.h 配置文件的理解
- LiteOS之任务管理
- Service学习——第四篇 在服务中执行重复的任务
- FreeRTOS学习笔记——创建任务
- Huawei LiteOS系列第1篇----Huawei LiteOS简介
- FreeRTOS 学习笔记 2 —— 创建任务
- 【汇编】学习笔记——第四篇
- MSDN学习DirectShow——第四章 使用DirectShow 第一节 用graphedit模拟创建Graph
- [dhtmlxGantt(甘特图)开发手册]第四篇——撤销/重做、提示消息、加载任务
- 第四届中兴通讯——中兴捧月任务
- activiti 手动创建定时任务——衍生定时任务
- ucos-ii学习笔记——首个多任务程序的创建
- 偏最小二乘回归(PLSR)算法原理
- 数组中出现次数超过一半的数字
- 【面试题】剑指Offer-40-数组中只出现一次的数字
- 如何在虚拟机中添加设备
- 课堂笔记
- LiteOS学习第四篇——任务创建
- JAVA第一周,信号报告
- Linux下用户组、文件权限复习
- jQueryUI中Datepicker(日历)插件的介绍和使用
- SSL P2646 线段树练习题三
- Lintcode 主元素 III
- js实现继承的几种方式
- AndroidStudio创建项目时的minimum SDK作用
- POJ 2057 The Lost House 树型dp+贪心思想在动态规划上的应用