前言

链接

参考

  • 上面链接

笔录草稿

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

创建测试任务

  • 本任务用于 LiteOS 消息队列测试
  • 步骤
    1. 创建任务相关值及函数

      1. 在 LssAppConfig.h 中添加

        1. 任务优先级宏 lssConfigvMsgQueueTaskPRIO (5)
        2. 任务堆栈宏 lssConfigvMsgQueueTaskSIZE 512u
        3. 任务初始化完成枚举 evMsgQueueTaskNum = 0x0D,
        4. 消息队列外部句柄 extern UINT32 MsgQueueTask_Handle;
      2. 在 main.c 中添加
        1. 添加任务头文件 #include "MsgQueueAppTask.h"
        2. 添加句柄
          1. 任务句柄 UINT32 MsgQueueTask_Handle = NULL;
          2. 消息队列测试句柄 UINT32 TestAQue_Handle = NULL;
          3. 创建消息队列任务函数
          4. 在启动任务中
            1. 添加 uwRet = Creat_vMsgQueue_Task();,以表示创建该任务
            2. 添加 uwRet = LOS_QueueCreate("Msg Queue", 20, &TestAQue_Handle, 0, 10); , 以表示创建消息
    2. 创建任务文件 MsgQueueTask.c 和 MsgQueueTask.h
      1. 主要用于消息队列的业务测试
      2. 编写任务函数 void vMsgQueueTask( void )
      3. 消息队列测试任务源文件
      4. 消息队列测试任务头文件
    3. 在 IPCApp.c 文件中添加两个测试函数(框架需要)
      1. void IPCAppMsgQueueA(msgIpc_t *msg) 函数

        1. 就是消息的发送端
        2. 队列测试函数A
      2. void IPCAppMsgQueueB(msgIpc_t *msg) 函数
        1. 就是消息的发送端
        2. 队列测试函数B
      3. 头文件 PCApp.h 也要做外置函数处理
    4. 在 IPCCoreTask.c 文件中 void msgDecode(msgIpc_t * msg) 函数中添加两条处理命令(框架需要)
      1. $QA#
      2. $QB#
      3. 命令处理添加部分源码

部分源码

  • 创建消息队列任务函数
/**
* @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;
}
  • 消息队列测试任务源文件
/**
******************************************************************************
* @file MsgQueueTask.c
* @author lzm
* @version V1.0
* @date 2020-10-28
* @brief
* @attention
*
* 实验平台:LZM
*
*
*
******************************************************************************
*/
#include "MsgQueueTask.h"
#include "bsp_usart.h" /*
*********************************************************************************************************
* FUNCTION
*********************************************************************************************************
*/
/**
* @brief 该任务的软硬件配置初始化
* @param
* @retval
* @author lzm
*/
static void msgQueueInit(void)
{
;
} /**
* @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);
} }
}
  • 消息队列测试任务头文件
/**
******************************************************************************
* @file MsgQueueTask.h
* @author lzm
* @version V1.0
* @date 2020-10-28
* @brief
* @attention
*
* 实验平台:LZM
*
******************************************************************************
*/
#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){;}
}
}
...

【LiteOS】LiteOS消息队列-实战的更多相关文章

  1. LINUX消息队列实战之一

    前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...

  2. Java服务器端消息队列实战

    服务端口监听--报文接收--报文解码--业务处理--报文编码--写回客户端 从服务端与客户端成功握手并产生一个socket后,为了提高吞吐能力,接下来的事情就可以交给多线程去处理. 为了对接入的请求做 ...

  3. MSMQ消息队列

    MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一 ...

  4. 【LiteOS】LiteOS消息队列

    目录 前言 链接 参考 笔录草稿 基本概念 队列运作机制 队列运作原理 消息队列传输方式 消息队列的阻塞机制 出队阻塞 入队阻塞 任务相关函数 任务开发流程 注意事项 * 实战 前言 链接 LiteO ...

  5. C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)

    前言 在使用MSMQ之前,我们需要自行安装消息队列组件!(具体安装方法大家自己搜一下吧) 采用MSMQ带来的好处是:由于是异步通信,无论是发送方还是接收方都不用等待对方返回成功消息,就可以执行余下的代 ...

  6. Redis和消息队列使用实战

    消息队列是在乐视这边非常普遍使用的技术.在我们部门内部,不同的项目使用的消息队列实现也不一样.下面是支付系统的流转图(部门兄弟画的,借用一下): 从图中可以看到,里面用到了kafka消息队列.作用是做 ...

  7. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

  8. Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ

    文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...

  9. 消息队列1:RabbitMQ解析并基于Springboot实战

    RabbitMQ简介 AMQP:Advanced Message Queue,高级消息队列协议.它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产 ...

随机推荐

  1. 二维码 : QRcode

    1 1 1 ★什么是二维码 通俗解释: 二维码是一种能存储信息的特定格式图片. 技术解释: 二维码(2-dimensional bar code) ,又称二维条码, 是用某种特定的几何图形按一定规律在 ...

  2. JavaScript 注释规范

    JavaScript 注释规范 总原则 As short as possible(如无必要,勿增注释).尽量提高代码本身的清晰性.可读性. As long as necessary(如有必要,尽量详尽 ...

  3. styled-components all in one

    styled-components all in one CSS in JS https://www.styled-components.com/ https://github.com/styled- ...

  4. DNS & TXT recode & Google Search Console

    DNS & TXT recode & Google Search Console domain name verification / 域名验证 demo DNS TXT recode ...

  5. 以代码为剑、数学为犁,SPC构建NGK算力生态体系

    人类创造工具,工具反过来也改变着人类.以区块链为核心的货币革命率先吹响了对金融世界重塑的号角.以代码为剑.数学为犁,区块链构建了新的网路信任体系,这是一切的开始.基于此,NGK区块链技术将赋能实体产业 ...

  6. Union international INC评德意志联邦投入十亿欧元重启文化娱乐产业

    当地时间6月4日,德国联邦政府宣布了一项名为"重启文化"(Neustart Kultur)的计划,将投入总计10亿欧元,用以支持德国文化及创意产业的恢复和重建. Union int ...

  7. 如何在数据库中进行RBAC权限应用

    上周我们发了一篇关于"删库跑路"引发了大家对于数据安全的思考,而权限管理又跟数据安全密不可分.权限管理作为数据系统的重要组成部分,通过控制账号的可支配能力,防止因用户操作不当导致的 ...

  8. 数据序列化工具——flatbuffer

    flatbuffer是一款类似于protobuf的数据序列化工具.所有数据序列化,简单来说,就是将某程数据结构按照一定的格式进行编码与解码,以方便在不同的进程间传递后,能够正确的还原成之前的数据结构. ...

  9. Python算法_两数之和(01)

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...

  10. synchronized语法

    synchronized( ){ } synchronized 关键字是加锁的意思,用它来修饰方法就表示给该方法加了锁,从而达到线程同步的效果;用它来修饰代码块就表示给该代码块加了锁,从而达到线程同步 ...