完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
是这样的,我想通过RTT实现一个下位机,它可以接收来自RS232、RS485和其它串口模块的数据,并给出响应。我的想法在串口中断中接收数据,然后通过消息队列发送到数据接收线程,然后将接收到的数据通过消息队列,发送到统一的数据处理线程对数据进行处理。大概的示意图如下: 用RS232的数据来举个例子,RS232数据来了以后触发串口中断,然后通过消息队列发送到RS232的数据接收线程,该线程按照我的交互协议格式对接收的数据进行接收,当一帧数据接收完成以后,就发送一个不定长度的消息给数据处理线程(使用动态内存分配),通知数据处理线程对RS232的数据进行处理,数据处理线程接收到不定长度的消息以后,将消息取出,然后释放消息的内存,最后对取出的消息进行处理给出响应结果。 不知道我这种思路是否合理呢?刚从裸机切换到RTOS,老感觉不放心,请大佬们指教。我将部分关键代码贴出来,如下: typedef struct |
|
相关推荐
8个回答
|
|
因为消息体内传送的是内存地址,所以,发送者和接收者不能同时访问这块内存。
由以上可以得出,发送消息时不能使用重复的内存。所以它必须申请新内存。 但是,如果发送比接收快,某些消息被丢弃,这个申请的内存也得释放掉。 |
|
|
|
谢谢解答,我就是不大确定这个共享内存的问题。但是我感觉消息的那一片内存应该不存在同时访问的情况,因为每次接收到一帧数据以后都是新分配的内存(不是上一次分配的),当数据接收线程发送完成以后,数据处理线程才会对这片内存进行访问,所以应该是不会同时访问的情况的。
另外关于发送比接收快的情况下,那个内存是有释放的,请看下面的代码,我在发送不定长消息的时候,如果发送失败了,就会释放这片申请的内存,应该是这么处理吧。 res = rt_mq_send(host_msg_mq, &msg_ptr, sizeof(msg_ptr)); /* 发送消息给数据处理线程 */ if (res != RT_EOK) { rt_free(msg_ptr.data_ptr); while (1) ; } |
|
|
|
看到你使用消息队列发送一个字节数据。这个有点儿压力。
加上 DMA ,中断里先检查一下多少字节,把字节数发出去,或者发消息队列,但是发消息队列的次数能明显降低。比如 1+11 这种,你的实现方式必须12次中断,发12次消息。但是可能只发两次消息就够了。 |
|
|
|
确实消息按照字节发送太频繁了,这个因为我们的协议是按照字节的方式进行设计的,有每个字节的超时要求,所以用DMA加IDLE好像不大合适,后面我再想下能否实现。不过对于消息队列发送一个字节的问题,我后面想到一个更好的方法来避免,那就是把数据帧的接收放到中断进行,帧的判断也在中断进行,其实也就是一些判断和接收逻辑,应该不会耗时很长时间,这样就不用每个硬件接口都开辟一个线程来接收了,示意图如下: 中断服务程序改成和线程接收差不多的方式:
|
|
|
|
|
|
|
|
while(1);那个语句吗?这个是我暂时用来检查我的代码的,因为还没有移植finsh,暂时还不能打印。 我在看官方文档的时候,无意中看到这么一段话,说是不能在中断中申请或者释放内存,请看下图: 那么,我这里的串口中断服务程序是不是有问题呢,因为我在中断中做了内存申请 msg_ptr.data_ptr = rt_malloc(msg_ptr.data_size); |
|
|
|
|
|
|
|
自己实现一个环形缓冲区,中断中入队。然后开一个线程定时解析缓冲区里面的数据后再用系统自带的消息队列转发到其它线程是否更好一点。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
772 浏览 0 评论
3946 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2493 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2911 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31260 浏览 11 评论
72848 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 02:25 , Processed in 0.842309 second(s), Total 87, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号