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

举报
产品人卫朋 发表于 2021/10/30 00:46:06 2021/10/30
【摘要】 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)创建队列、定时器、任务


  
  1. UINT32 Example15_Entry(VOID) {
  2.     UINT32 uwRet = LOS_OK;
  3.     TSK_INIT_PARAM_S stInitParam = {0};
  4.     
  5.     puts("Example15_Entry\r\n");
  6.     // 创建队列
  7.     uwRet = LOS_QueueCreate(
  8.                 "queue",                // 队列名称
  9.                 3,                      // 队列大小
  10.                 &s_uwQueueID,           // 队列ID
  11.                 0,                      // 不使用
  12.                 sizeof(UINT32)          // 队列消息大小
  13.                 );
  14.     if (uwRet != LOS_OK) {
  15.         printf("create queue failure!,error:%x\n", uwRet);
  16.         return LOS_NOK;
  17.     }
  18.     // 创建定时器
  19.     uwRet = LOS_SwtmrCreate(
  20.                 PERIODIC_TIMER_VALUE
  21.                 LOS_SWTMR_MODE_PERIOD,
  22.                 Timer_Callback,
  23.                 &s_usSwTmrID,
  24.                 (UINT32)s_pStringsToPrint[2]
  25.                 #if (LOSCFG_BASE_CORE_SWTMR_ALIGN == YES)
  26.                 , OS_SWTMR_ROUSES_ALLOW,
  27.                 OS_SWTMR_ALIGN_SENSITIVE 
  28.                 #endif
  29.                 );
  30.     if(LOS_OK != uwRet)
  31.     {
  32.         printf("create Timer failed.\r\n");
  33.         return LOS_NOK;
  34.     }
  35.     // 创建发送任务
  36.     stInitParam.pfnTaskEntry = Example_TaskSend;
  37.     stInitParam.usTaskPrio = TASK_PRIO_SEND;
  38.     stInitParam.pcName = "TaskSend1";
  39.     stInitParam.uwStackSize = TASK_STK_SIZE;
  40.     stInitParam.uwArg = (UINT32)s_pStringsToPrint[0];
  41.     uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
  42.     if (uwRet != LOS_OK) {
  43.         printf("Example_TaskSend create Failed!\r\n");
  44.         return LOS_NOK;
  45.     }
  46.     
  47.     stInitParam.pcName = "TaskSend2";
  48.     stInitParam.uwArg = (UINT32)s_pStringsToPrint[1];
  49.     uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
  50.     if (uwRet != LOS_OK) {
  51.         printf("Example_TaskSend create Failed!\r\n");
  52.         return LOS_NOK;
  53.     }
  54.     // 创建接收任务
  55.     stInitParam.pfnTaskEntry = Example_TaskRecv;
  56.     stInitParam.usTaskPrio = TASK_PRIO_RECV;
  57.     stInitParam.pcName = "TaskRecv";
  58.     stInitParam.uwStackSize = TASK_STK_SIZE;
  59.     uwRet = LOS_TaskCreate(&s_uwTskHiID, &stInitParam);
  60.     if (uwRet != LOS_OK) {
  61.         printf("Example_TaskRecv create Failed!\r\n");
  62.         return LOS_NOK;
  63.     }
  64.     // 启动定时器
  65.     uwRet = LOS_SwtmrStart(s_usSwTmrID);
  66.     if(LOS_OK != uwRet)
  67.     {
  68.         printf("Start Timer failed.\r\n");
  69.         return LOS_NOK;
  70.     }
  71.     return uwRet;
  72. }

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


  
  1. static VOID *Example_TaskRecv(UINT32 uwArg) {
  2.     UINT32 uwRet = LOS_OK;
  3.     UINT32 uwReadbuf = NULL;
  4.     UINT32 uwBufferSize = sizeof(UINT32*);
  5.        
  6.     for (;;) {        
  7.         uwRet = LOS_QueueRead(s_uwQueueID, (VOID*)&uwReadbuf, uwBufferSize, LOS_WAIT_FOREVER);
  8.         if (LOS_OK != uwRet) {
  9.             printf("recv value failure,error:%x\r\n", uwRet);
  10.         } else {
  11.             if (uwBufferSize == sizeof(UINT32)) {
  12.                 puts((const CHAR*)uwReadbuf);
  13.             }
  14.         }
  15.     }
  16. }
  17. static VOID * Example_TaskSend(UINT32 uwArg) {
  18.     UINT32 uwRet = LOS_OK;
  19.     
  20.     for (;;) {
  21.         uwRet = LOS_QueueWrite(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
  22.         if (LOS_OK != uwRet) {
  23.             printf("send value failure,error:%x\r\n", uwRet);
  24.         }
  25.         LOS_TaskDelay(2000);
  26.     }
  27. }

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


  
  1. static void Timer_Callback(UINT32 uwArg)
  2. {
  3.     UINT32 uwRet = LOS_OK;
  4.     
  5.     uwRet = LOS_QueueWriteHead(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
  6.     if (LOS_OK != uwRet) {
  7.         printf("send value failure,error:%x\r\n", uwRet);
  8.     }
  9. }

4)效果演示

 

 

refer:

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

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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