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 5 UINT32 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, 不要试图挂起软件定时器任务 |