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

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

1、任务结构体


  
  1. typedef struct tagTskInitParam
  2. {
  3.    TSK_ENTRY_FUNC       pfnTaskEntry;               /**< Task entrance function               */
  4.    UINT16               usTaskPrio;                 /**< Task priority                 */
  5.    UINT32               auwArgs[4];                 /**< Task parameters, of which the maximum number is four          */
  6.    UINT32               uwStackSize;                /**< Task stack size               */
  7.    CHAR                 *pcName;                    /**< Task name                     */
  8.    UINT32               uwResved;                   /**< Reserved. It is automatically deleted if set to LOS_TASK_STATUS_DETACHED. It is unable to be deleted if set to 0.*/
  9. } TSK_INIT_PARAM_S;

auwArgs:

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

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

pcName:

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

uwResved:

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

2、任务创建


  
  1. UINT32 g_uwTskLoID;
  2. UINT32 g_uwTskHiID;
  3. #define TSK_PRIOR_HI 4
  4. #define TSK_PRIOR_LO 5

2.1、创建两个任务

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


  
  1. UINT32 Example_TskCaseEntry(VOID)
  2. {
  3.   UINT32 uwRet;
  4.   TSK_INIT_PARAM_S stInitParam;
  5.   
  6.   // 锁任务调度
  7.   LOS_TaskLock();
  8.   
  9.   printf("LOS_TaskLock() Success!\r\n");
  10.   
  11.   stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi;
  12.   stInitParam.usTaskPrio = TSK_PRIOR_HI;
  13.   stInitParam.pcName = "HIGH_NAME";
  14.   stInitParam.uwStackSize = 0x400;
  15.   stInitParam.uwResved   = LOS_TASK_STATUS_DETACHED;
  16.   
  17.   // 创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行
  18.   uwRet = LOS_TaskCreate(&g_uwTskHiID, &stInitParam);
  19.   if (uwRet != LOS_OK)
  20.   {
  21.       LOS_TaskUnlock();
  22.   
  23.       printf("Example_TaskHi create Failed!\r\n");
  24.       return LOS_NOK;
  25.   }
  26.   
  27.   printf("Example_TaskHi create Success!\r\n");
  28.   
  29.   stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo;
  30.   stInitParam.usTaskPrio = TSK_PRIOR_LO;
  31.   stInitParam.pcName = "LOW_NAME";
  32.   stInitParam.uwStackSize = 0x400;
  33.   stInitParam.uwResved   = LOS_TASK_STATUS_DETACHED;
  34.   
  35.   /*创建低优先级任务,由于锁任务调度,任务创建成功后不会马上执行*/
  36.   uwRet = LOS_TaskCreate(&g_uwTskLoID, &stInitParam);
  37.   if (uwRet != LOS_OK)
  38.   {
  39.       LOS_TaskUnlock();
  40.   
  41.       printf("Example_TaskLo create Failed!\r\n");
  42.       return LOS_NOK;
  43.   }
  44.   
  45.   printf("Example_TaskLo create Success!\r\n");
  46.   
  47.   // 解锁任务调度,此时会发生任务调度,执行就绪列表中最高优先级任务
  48.   LOS_TaskUnlock();
  49.   
  50.   while(1){};
  51.   
  52.   return LOS_OK;
  53. }

2.2、高优先级任务


  
  1. UINT32 Example_TaskHi()
  2. {
  3.   UINT32 uwRet;
  4.   UINT32 uwCurrentID;
  5.   TSK_INFO_S stTaskInfo;
  6.   
  7.   printf("Enter TaskHi Handler.\r\n");
  8.   // 延时 2 个 Tick,延时后该任务会挂起,执行剩余任务中最高优先级的任务(g_uwTskLoID任务)
  9.   uwRet = LOS_TaskDelay(2);
  10.   if (uwRet != LOS_OK)
  11.   {
  12.       printf("Delay Task Failed.\r\n");
  13.       return LOS_NOK;
  14.   }
  15.   
  16.   // 2 个 Tick 时间到了后,该任务恢复,继续执行
  17.   printf("TaskHi LOS_TaskDelay Done.\r\n");
  18.   
  19.   // 挂起自身任务
  20.   uwRet = LOS_TaskSuspend(g_uwTskHiID);
  21.   if (uwRet != LOS_OK)
  22.   {
  23.       printf("Suspend TaskHi Failed.\r\n");
  24.       return LOS_NOK;
  25.   }
  26.   
  27.   printf("TaskHi LOS_TaskResume Success.\r\n");
  28. }

2.3、低优先级任务
 


  
  1. UINT32 Example_TaskLo()
  2. {
  3.   UINT32 uwRet;
  4.   UINT32 uwCurrentID;
  5.   TSK_INFO_S stTaskInfo;
  6.   
  7.   printf("Enter TaskLo Handler.\r\n");
  8.   
  9.   // 延时2个Tick,延时后该任务会挂起,执行剩余任务中就高优先级的任务(背景任务)
  10.   uwRet = LOS_TaskDelay(2);
  11.   if (uwRet != LOS_OK)
  12.   {
  13.       printf("Delay TaskLo Failed.\r\n");
  14.       return LOS_NOK;
  15.   }
  16.   
  17.   printf("TaskHi LOS_TaskSuspend Success.\r\n");
  18.   
  19.   // 恢复被挂起的任务 g_uwTskHiID
  20.   uwRet = LOS_TaskResume(g_uwTskHiID);
  21.   if (uwRet != LOS_OK)
  22.   {
  23.       printf("Resume TaskHi Failed.\r\n");
  24.       return LOS_NOK;
  25.   }
  26.   
  27.   printf("TaskHi LOS_TaskDelete Success.\r\n");
  28. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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