前言
链接
参考
笔录草稿
- 最近工作有点忙,远吗阅读推迟了哈哈
- 采用传地址方式
- 其实这些组件的应用是很简单的,没太在意,很快就搭建好看见,准备测试并看源码,
- 但是,今天下午却花了两小时,仅仅为了测试非拷贝方式通信失败问题
- bug就是我在函数里创建一个局部存放消息内容的缓冲区,采用函数
LOS_QueueWrite
发送出去
- 接收时却出现各种问题,很明显就是地址错误,但是我一丢丢都没想起消息内容被改写的注意点,唉
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
- 采用地址方式时,必须保该地址内容没有被修改,且不推荐使用局部变量
创建测试任务
- 本任务用于 LiteOS 消息队列测试
- 步骤
- 创建任务相关值及函数
- 在
LssAppConfig.h
中添加
- 任务优先级宏
lssConfigvMsgQueueTaskPRIO (5)
- 任务堆栈宏
lssConfigvMsgQueueTaskSIZE 512u
- 任务初始化完成枚举
evMsgQueueTaskNum = 0x0D,
- 消息队列外部句柄
extern UINT32 MsgQueueTask_Handle;
- 在
main.c
中添加
- 添加任务头文件
#include "MsgQueueAppTask.h"
- 添加句柄
- 任务句柄
UINT32 MsgQueueTask_Handle = NULL;
- 消息队列测试句柄
UINT32 TestAQue_Handle = NULL;
- 创建消息队列任务函数
- 在启动任务中
- 添加
uwRet = Creat_vMsgQueue_Task();
,以表示创建该任务
- 添加
uwRet = LOS_QueueCreate("Msg Queue", 20, &TestAQue_Handle, 0, 10);
, 以表示创建消息
- 创建任务文件
MsgQueueTask.c
和 MsgQueueTask.h
- 主要用于消息队列的业务测试
- 编写任务函数
void vMsgQueueTask( void )
- 消息队列测试任务源文件
- 消息队列测试任务头文件
- 在
IPCApp.c
文件中添加两个测试函数(框架需要)
void IPCAppMsgQueueA(msgIpc_t *msg)
函数
- 就是消息的发送端
- 队列测试函数A
void IPCAppMsgQueueB(msgIpc_t *msg)
函数
- 就是消息的发送端
- 队列测试函数B
- 头文件
PCApp.h
也要做外置函数处理
- 在
IPCCoreTask.c
文件中 void msgDecode(msgIpc_t * msg)
函数中添加两条处理命令(框架需要)
$QA#
$QB#
- 命令处理添加部分源码
部分源码
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"
static void msgQueueInit(void)
{
;
}
void vMsgQueueTask( void )
{
UINT32 uwRet = LOS_OK;
UINT32 msgLen = 30;
UINT32 uwReadbuf;
msgQueueInit();
WaitAllTaskInitOk(evMsgQueueTaskNum);
while(1)
{
uwRet = LOS_QueueRead(TestAQue_Handle,
&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"
void vMsgQueueTask( void );
#endif
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);
}
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){;}
}
}
...
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现