Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
RTT消息队列的使用问题
发布于 2018-12-22 17:35:56 浏览:2926
订阅该版
* 本帖最后由 吉帅虎 于 2018-12-22 17:38 编辑 * 刚开始使用RT_thread,一直跑独立的线程。现在进行到需要做一个带触摸的串口屏,因此需要接受屏的数据并执行相应的指令。 我的思路是这样的,当然主要是参考了编程手册里关于串口设备的使用方法: 在串口的回调函数里发送一个消息。在串口的进程中一致接受这个消息队列,然后执行相应的处理。现在的问题是消息队列使用方法可能不正确,无法正常工作。 提示这样的错误,(mq != RT_NULL) assertion failed at function:rt_mq_init, line number:1802 代码如下: ```/* * 程序清单:HMI显示 * * * * */ #include
#include
#include "StructDefine.h" #include "sys_thread.h" #include "GlobalVar.h" struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 用于接收消息的消息队列*/ static rt_mq_t rx_mq; rt_uint8_t mempool[512]; /*****************************************************************************/ //开关量输入处理相关的代码 /*****************************************************************************/ void RamCopy(rt_uint8_t *Tp,rt_uint8_t *Sp,rt_uint8_t len) { while(len--) { *Tp++ = *Sp++; } } static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; msg.dev = dev; msg.size = size; /* 发送消息到消息队列中*/ rt_mq_send(rx_mq, &msg, sizeof(struct rx_msg)); return RT_EOK; } //****************************************************************************** // 函数名称: static void kr_thread_entry(void *parameter) // 功能描述: 开关量输入处理线程 // // 输 入: void *parameter,参数指针无 // 输 出: 无 // 返 回: 无 //------------------------------------------------------------------------------ // 作 者: JSH // 日 期: 2018-10-10 //------------------------------------------------------------------------------ // 修改人: // 日 期: //****************************************************************************** ALIGN(RT_ALIGN_SIZE) rt_uint8_t hmi_stack[HMI_STACK_LENGTH]; struct rt_thread hmi_thread;// 线程的TCB控制块 ,句柄 void hmi_thread_entry(void *parameter) { struct rx_msg msg; rt_err_t result = RT_EOK; rt_device_t HMI_uart; rt_uint8_t HMI_tx_buffer[64]; rt_mq_init(rx_mq,"HMI_mq",&mempool[0],256,sizeof(mempool),RT_IPC_FLAG_FIFO); HMI_uart = rt_device_find("uart4"); if (HMI_uart != RT_NULL) { rt_device_set_rx_indicate(HMI_uart, uart_input); //设置回调函数 rt_device_open(HMI_uart, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM); //打开设备 } while (1) { /* 从消息队列中读取消息*/ result = rt_mq_recv(rx_mq, &msg, sizeof(struct rx_msg), RT_TICK_PER_SECOND); if (result == RT_EOK) { while(1); } else { HMI_tx_buffer[0] = 0x5A; HMI_tx_buffer[1] = 0xA5; //帧头 RamCopy(&HMI_tx_buffer[2],(rt_uint8_t *)&MeasureData.Data[0],48); rt_device_write(HMI_uart, 0,&HMI_tx_buffer[0], 50); rt_thread_delay(RT_TICK_PER_SECOND); //1s钟刷新一次 } } } //********************************************************************************************* // end the file //********************************************************************************************* ``` 断言错误是在这一句遇到的 rt_mq_init(rx_mq,"HMI_mq",&mempool[0],256,sizeof(mempool),RT_IPC_FLAG_FIFO);具体的行的代码是这一句 RT_ASSERT(mq != RT_NULL); 第一次在项目中使用RTT,也是第一次使用消息队列。不知道是哪儿的问题,希望大神给指导一下,谢谢!!
查看更多
3
个回答
默认排序
按发布时间排序
yqiu
2018-12-22
这家伙很懒,什么也没写!
消息队列示例可以参考:[https://github.com/RT-Thread-packages/kernel-sample/blob/459edecb8df1f9123398c87fa2eff05b08ca8db1/msgq_sample.c](https://github.com/RT-Thread-packages/kernel-sample/blob/459edecb8df1f9123398c87fa2eff05b08ca8db1/msgq_sample.c)
yqiu
2018-12-22
这家伙很懒,什么也没写!
一些常见的示例代码都可以从 [https://github.com/RT-Thread-packages/samples](https://github.com/RT-Thread-packages/samples) 找到
吉帅虎
2018-12-28
这家伙很懒,什么也没写!
问题找到了,原因是这样的 定义消息队列的时候是这样定义的。static rt_mq_t rx_mq;但是后来仔细查看了一下rt_mq_t 只是一个指针,这样肯定就没有消息队列的实体了,这样肯定会有问题了。改成static struct rt_messagequeue rx_mq;就可以了。 消息队列的定义是这样的: struct rt_messagequeue { struct rt_ipc_object parent; /**< inherit from ipc_object */ void *msg_pool; /**< start address of message queue */ rt_uint16_t msg_size; /**< message size of each message */ rt_uint16_t max_msgs; /**< max number of messages */ rt_uint16_t entry; /**< index of messages in the queue */ void *msg_queue_head; /**< list head */ void *msg_queue_tail; /**< list tail */ void *msg_queue_free; /**< pointer indicated the free node of queue */ }; typedef struct rt_messagequeue *rt_mq_t;
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
吉帅虎
这家伙很懒,什么也没写!
提问
12
回答
12
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部