Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内核学习营
个人分享心得(八)——线程间通信(消息队列)
发布于 2019-04-11 00:12:01 浏览:2621
订阅该版
[tocm] * 本帖最后由 家定不举棋 于 2019-4-11 00:25 编辑 * # 消息队列 消息队列 `messagequeue`:另一种线程间的通信方式,与邮箱不同的是能够接收的消息长度是不固定的。消息队列的结构体如下所示: ``` struct rt_messagequeue { struct rt_ipc_object parent; void *msg_pool; rt_uint16_t msg_size; rt_uint16_t max_msgs; rt_uint16_t entry; void *msg_queue_head; void *msg_queue_tail; void *msg_queue_free; }; ``` `msg_pool` 是指向存放消息的消息池的指针,它跟数组类似,指向的是消息池的首地址;`msg_size` 是一条消息的长度,后面对该消息队列发送的消息长度都不能超过该长度,若发送的消息长度超过该值则会返回错误标志 `-RT_ERROR`; `max_mags` 是消息池中最大能容纳的消息数,当发送的消息数量超过该值时,则会返回错误标志`-RT_EFULL`; `entry` 是消息队列中的消息数,通过该参数可以知道消息队列中消息的具体数量; `msg_queue_head` 是消息链表头;`msg_queue_tail` 是消息链表尾;`msg_queue_free` 是空闲消息链表。 消息队列的内存池大小即为每条消息的长度与消息队列中能存放的最大消息数和下一条的消息大小之和的乘积:`max_msgs` * (`msg_size` + `sizeof(struct rt_mq_message)`)。其中下一条消息的大小为4,即 `sizeof(struct rt_mq_message)` 的值为4。 第一步便是对创建初始化一个消息队列,这一过程的关键点便是对 `msg_size` 和 `max_msgs` 两个参数进行设置,而这之中又分为静态初始化消息队列 `rt_mq_init` 和动态创建消息队列 `rt_mq_create`。对于静态初始化而言需要注意以下几点: 1. `msg_size` 的值会自动4字节对齐; 2. 当 `msg_size` 的值比 `pool_size` 的值大时,准确的说是 `(mq->msg_size + sizeof(struct rt_mq_message))` 的值比 `pool_size` 的值大时,`max_msgs` 的值就会变为0; 3. `pool_size` 的值不能超过前面创建的消息队列内存大小,当该值超过了内存队列的大小的时候,初始化的时候可能不会产生错误,但是使用的时候会占用未初始化内存,从而产生未知的bug; 4. `flag` 的值可以设置为 `RT_IPC_FLAG_FIFO` 和 `RT_IPC_FLAG_PRIO`,对于这两者的区别在前面的帖子里写过; 而对于动态创建消息队列而言,通过 `msg_size` 和 `max_msgs` 的值动态分配内存,在动态创建的时候程序允许将 `msg_size` 设置为0,但是不允许将 `max_msgs`设置为0。(PS:在真正使用的时候都不允许将上述两个值设置为0,因为在创建的时候没有异常,但是在使用的时候会产生异常。) 而对于将 `msg_size` 设置为0时会自动4字节对齐,那么消息队列结构体中的 `msg_size` 的值对齐为4,那么如果内存空间有足够的空间进行分配,那么便可以进行分配;但是当 `max_msgs` 的值设置为0时,向内存空间申请的消息队列内存为 `RT_NULL`。 在正确初始化创建消息队列后便是对其进行使用,我们可以对其以下操作:发送普通消息 `rt_mq_send`、发送紧急消息 `rt_mq_urgent`、接收消息 `rt_mq_recv`。 不管发送紧急消息还是普通消息,`size` 的大小都不能超过 `msg_size` 的值,而对于接收消息没有这个限制的要求。因为当 `size` 的值大于 `msg_size` 时,接收的消息大小自动设置为 `msg_size`。
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
1
被浏览
2.6k
关于作者
家定不举棋
这家伙很懒,什么也没写!
提问
10
回答
6
被采纳
0
关注TA
发私信
相关问题
1
【内核学习】rtthread内核移植记录-STM32F103ZET6-HAL库
2
《内核学习营》+水一方+自用STM32F103VC 板RT-Thread内核移植分享
3
《内核学习营》+水一方+项目中创建标准的 RT-Thread工程
4
内核学习营+坦然+探索者stm32f407板子RT-thread循环点亮led灯
5
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口字符点灯
6
<内核学习营>+坦然+探索者stm32f407板子RT-thread的pwm点灯实验
7
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口实验
8
<内核学习营>+坦然+野火stm32f103板子RT-thread读写SD卡实验
9
<内核学习营>+坦然+探索者stm32f407板子RT-thread的RTC闹钟实验
10
【内核学习营】+王秀峰+led_rgb
推荐文章
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
如何在master上的BSP中添加配置yml文件
2
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
3
RT-Thread 发布 EtherKit开源以太网硬件!
4
rt-thread使用cherryusb实现虚拟串口
5
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部