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



0 0