【LiteOS】LiteOS消息队列-实战
阅读原文时间:2023年07月10日阅读:2

目录


链接

参考

  • 上面链接

  • 最近工作有点忙,远吗阅读推迟了哈哈

  • 采用传地址方式

    • 其实这些组件的应用是很简单的,没太在意,很快就搭建好看见,准备测试并看源码,
    • 但是,今天下午却花了两小时,仅仅为了测试非拷贝方式通信失败问题
    • bug就是我在函数里创建一个局部存放消息内容的缓冲区,采用函数 LOS_QueueWrite 发送出去
    • 接收时却出现各种问题,很明显就是地址错误,但是我一丢丢都没想起消息内容被改写的注意点,唉
    • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
    • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
    • 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
  • 本任务用于 LiteOS 消息队列测试

  • 步骤

部分源码

  • 创建消息队列任务函数

    /**

    • @brief 创建vMsgQueueTask任务

    • @param

    • @retval

    • @author lzm
      */
      static UINT32 Creat_vMsgQueue_Task()
      {
      //定义一个创建任务的返回类型,初始化为创建成功的返回值
      UINT32 uwRet = LOS_OK;

      TSK_INIT_PARAM_S task_init_param;

      task_init_param.usTaskPrio = lssConfigvMsgQueueTaskPRIO;
      task_init_param.pcName = "MsgQueue Task";
      task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)vMsgQueueTask;
      task_init_param.uwStackSize = lssConfigvMsgQueueTaskSIZE;

      uwRet = LOS_TaskCreate(&MsgQueueTask_Handle, &task_init_param);
      return uwRet;
      }

  • 消息队列测试任务源文件

    /**



    */
    #include "MsgQueueTask.h"
    #include "bsp_usart.h"

    /*


    • FUNCTION

    / /*

    /**

    • @brief 任务函数

    • @param

    • @retval

    • @author lzm
      */
      void vMsgQueueTask( void )
      {
      UINT32 uwRet = LOS_OK;
      UINT32 msgLen = 30;
      // 接收消息
      UINT32 uwReadbuf;

      msgQueueInit();
      WaitAllTaskInitOk(evMsgQueueTaskNum); // 系统就绪检测及等待

      while(1)
      {
      /* 等待消息 */
      uwRet = LOS_QueueRead(TestAQue_Handle, // 消息队列 ID
      &uwReadbuf, // 保存消息的位置
      msgLen, // 接收消息的长度
      LOS_WAIT_FOREVER); // 等待 - 一直等
      if(uwRet != LOS_OK)
      {
      dbgPrintf("read message failure,error:%x\n",uwRet);
      }
      else
      {
      dbgPrintf("\r\nLOS_QueueRead is [%s]!",(char *)uwReadbuf);
      }

      }
      }

  • 消息队列测试任务头文件

    /**



    / #ifndef _MSG_QUEUE_TASK_H
    #define _MSG_QUEUE_TASK_H
    #include "LssAppConfig.h"
    #include "ipcConfig.h"
    /


    • API

    / / function */
    void vMsgQueueTask( void );
    #endif

  • 队列测试函数A

    /**

    • @brief

    • 命令 [$QA#] 的回调函数。

    • 消息队列测试 A

    • @param

    • @retval

    • @author lzm
      */
      void IPCAppMsgQueueA(msgIpc_t *msg)
      {
      static UINT32 i = 0;
      static CHAR ABuf[] = "Test is message x";
      UINT32 msgLen = sizeof(ABuf);

      LOS_QueueWrite( TestAQue_Handle, /* 消息队列的句柄 / ABuf, / 发送的消息内容 发送字符串的地址/ msgLen, 0); / 消息大小 */
      }

  • 队列测试函数B

    /**

    • @brief

    • 命令 [$QB#] 的回调函数。

    • 消息队列测试 B

    • @param

    • @retval

    • @author lzm
      */
      void IPCAppMsgQueueB(msgIpc_t *msg)
      {
      static UINT32 i = 0;
      static CHAR BBuf[] = "Test is message n";
      UINT32 msgLen = sizeof(BBuf);

      LOS_QueueWrite( TestAQue_Handle, /* 消息队列的句柄 / BBuf, / 发送的消息内容 发送字符串的地址/ msgLen, 0); / 消息大小 */
      }

  • 命令处理添加部分源码


    else if(msg->data[msg->index + 1] == 'Q')
    {
    if(msg->data[msg->index + 2] == 'A')
    {
    MALLOC_REGISTER_INSTEREND_CBFUN_LIST(cmd, cmdItem, 2, msg, callbackFunctionList, xCBFunListSem_Handle, IPCAppMsgQueueA);

            // ¸æÖªÖ´ÐÐÈÎÎñ
            uwRet = LOS_SemPost(ListApp_Handle);
            if (uwRet != LOS_OK){;}
        }
        else if(msg->data[msg->index + 2] == 'B')
        {
            MALLOC_REGISTER_INSTEREND_CBFUN_LIST(cmd, cmdItem, 3, msg, callbackFunctionList, xCBFunListSem_Handle, IPCAppMsgQueueB);        
        // ¸æÖªÖ´ÐÐÈÎÎñ
        uwRet = LOS_SemPost(ListApp_Handle);
        if (uwRet != LOS_OK){;}
    }
    }

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章