【LiteOS】小白进阶之如何创建 LiteOS 任务(三)

举报
产品人卫朋 发表于 2021/10/29 23:24:09 2021/10/29
5.2k+ 0 0
【摘要】 1、任务结构体 typedef struct tagTskInitParam{   TSK_ENTRY_FUNC       pfnTaskEntry;        &nbs...

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:

是指任务入口参数,比如任务入口参数为 void Task1(UINT32 arg);

在创建任务时将xx.auwArgs[0]=0,在刚开始调取任务时就会将 0 传到 Task1 函数。

pcName:

任务名称,这个是不能给空的

uwResved:

这个并不是保留的,而是定义在任务执行完后要不要自删除,LOS_TASK_STATUS_DETACHED

2、任务创建


      UINT32 g_uwTskLoID;
      UINT32 g_uwTskHiID;
      #define TSK_PRIOR_HI 4
      #define TSK_PRIOR_LO 5
  
 

2.1、创建两个任务

创建任务时要锁任务调度。


      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;
      }
  
 

2.2、高优先级任务


      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");
      }
  
 

2.3、低优先级任务
 


      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");
      }
  
 

文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/liwei16611/article/details/86580941

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。