【LiteOS】小白进阶之 LiteOS 队列、任务、定时器综合实验

举报
产品人卫朋 发表于 2021/10/30 00:46:06 2021/10/30
4.7k+ 0 0
【摘要】 1、功能说明 创建一个打印队列和 3 个任务,其中两个 Task 负责写入数据 1/2,另外一个用于输出字符串。 同时还在 Tick 任务每触发 200 次,向打印队列(首部)写入数据 3。 2、代码讲解 1)创建队列、定时器、任务 UINT32 Example15_Entry(VOID) {    UIN...

1、功能说明

创建一个打印队列和 3 个任务,其中两个 Task 负责写入数据 1/2,另外一个用于输出字符串。

同时还在 Tick 任务每触发 200 次,向打印队列(首部)写入数据 3。

2、代码讲解

1)创建队列、定时器、任务


      UINT32 Example15_Entry(VOID) {
          UINT32 uwRet = LOS_OK;
          TSK_INIT_PARAM_S stInitParam = {0};
          puts("Example15_Entry\r\n");
          // 创建队列
          uwRet = LOS_QueueCreate(
                      "queue",                // 队列名称
                      3,                      // 队列大小
                      &s_uwQueueID,           // 队列ID
                      0,                      // 不使用
                      sizeof(UINT32)          // 队列消息大小
                      );
          if (uwRet != LOS_OK) {
              printf("create queue failure!,error:%x\n", uwRet);
              return LOS_NOK;
          }
          // 创建定时器
          uwRet = LOS_SwtmrCreate(
                      PERIODIC_TIMER_VALUE,
                      LOS_SWTMR_MODE_PERIOD,
                      Timer_Callback,
                      &s_usSwTmrID,
                      (UINT32)s_pStringsToPrint[2]
                      #if (LOSCFG_BASE_CORE_SWTMR_ALIGN == YES)
                      , OS_SWTMR_ROUSES_ALLOW,
                      OS_SWTMR_ALIGN_SENSITIVE
                      #endif
                      );
          if(LOS_OK != uwRet)
          {
              printf("create Timer failed.\r\n");
              return LOS_NOK;
          }
          // 创建发送任务
          stInitParam.pfnTaskEntry = Example_TaskSend;
          stInitParam.usTaskPrio = TASK_PRIO_SEND;
          stInitParam.pcName = "TaskSend1";
          stInitParam.uwStackSize = TASK_STK_SIZE;
          stInitParam.uwArg = (UINT32)s_pStringsToPrint[0];
          uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
          if (uwRet != LOS_OK) {
              printf("Example_TaskSend create Failed!\r\n");
              return LOS_NOK;
          }
          stInitParam.pcName = "TaskSend2";
          stInitParam.uwArg = (UINT32)s_pStringsToPrint[1];
          uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
          if (uwRet != LOS_OK) {
              printf("Example_TaskSend create Failed!\r\n");
              return LOS_NOK;
          }
          // 创建接收任务
          stInitParam.pfnTaskEntry = Example_TaskRecv;
          stInitParam.usTaskPrio = TASK_PRIO_RECV;
          stInitParam.pcName = "TaskRecv";
          stInitParam.uwStackSize = TASK_STK_SIZE;
          uwRet = LOS_TaskCreate(&s_uwTskHiID, &stInitParam);
          if (uwRet != LOS_OK) {
              printf("Example_TaskRecv create Failed!\r\n");
              return LOS_NOK;
          }
          // 启动定时器
          uwRet = LOS_SwtmrStart(s_usSwTmrID);
          if(LOS_OK != uwRet)
          {
              printf("Start Timer failed.\r\n");
              return LOS_NOK;
          }
          return uwRet;
      }
  
 

2)发送任务将 Task1、Task2 字符串发送到队列,接收任务从队列中读取数据


      static VOID *Example_TaskRecv(UINT32 uwArg) {
          UINT32 uwRet = LOS_OK;
          UINT32 uwReadbuf = NULL;
          UINT32 uwBufferSize = sizeof(UINT32*);
          for (;;) {
              uwRet = LOS_QueueRead(s_uwQueueID, (VOID*)&uwReadbuf, uwBufferSize, LOS_WAIT_FOREVER);
              if (LOS_OK != uwRet) {
                  printf("recv value failure,error:%x\r\n", uwRet);
              } else {
                  if (uwBufferSize == sizeof(UINT32)) {
                      puts((const CHAR*)uwReadbuf);
                  }
              }
          }
      }
      static VOID * Example_TaskSend(UINT32 uwArg) {
          UINT32 uwRet = LOS_OK;
          for (;;) {
              uwRet = LOS_QueueWrite(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
              if (LOS_OK != uwRet) {
                  printf("send value failure,error:%x\r\n", uwRet);
              }
              LOS_TaskDelay(2000);
          }
      }
  
 

3)周期定时器回调任务将数据写入到队列头部


      static void Timer_Callback(UINT32 uwArg)
      {
          UINT32 uwRet = LOS_OK;
          uwRet = LOS_QueueWriteHead(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
          if (LOS_OK != uwRet) {
              printf("send value failure,error:%x\r\n", uwRet);
          }
      }
  
 

4)效果演示

refer:

https://liteos.github.io/tutorials/kernel/example15.html#代码讲解

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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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