"); //-->
做项目时使用官方串口DMA例程,在跑数据接收压力测试时发现了一些细节问题,正是这些问题卡了我2天。现在终于得到解决,在此立个贴做记录。例程现象:
1. 串口DMA在接收过程中,是不定长接收的。就算你上位只发送了1次,例程接收端总会给你2 - N段不定长数据给你。论坛上也有类似的帖子说是底层驱动的某些特性。
2. 串口DMA在接收线程中serial_thread_entry里面不可以做协议数据解析,尽管这是个独立的线程,尽管你的数据解析函数没有任何阻塞线程的动作,都不行。你必须把接收到的数据通过其他途径转移到其他线程去处理(比如消息队列)。否则会产生意想不到异常,现象是在运行一段时间后tshell卡死,或者当前接收线程直接在ps列表消失,但是依然可以接收数据,无论哪样最终都会让tshell完全卡死加死机,就连cmTraceback也救不了(不能百分百触发异常播报),cmTraceback只会告诉你的shell串口在接收中断处有问题,但是具体什么问题我看不出。个人怀疑是 rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); 这个函数有隐藏阻塞,如果在下文加上长延时的数据解析会导致跟tshell冲突。
尝试过,提高或降低tshell 或 syswork或其他线程优先级,增大串口或线程缓冲区。都不行。
解决办法:
串口接收线程收到的数据只能再中转到其他线程去做处理。 以下是我串口生产者,和消费者代码。
小提示:
消费者线程的优先级要高于生产者线程的优先级(消息队列应用),否则会出现数据覆盖的现象。比如,高优先级生产者队列入了3次数据,低优先级消费者线程出队列只能取到最后一条数据。这个我也很纳闷。我觉得可能跟线程抢占有关或者优先级翻转之类的现象,解决办法也许把消费者和生产者加上互斥锁后应该就能解决,但是这样的话,因为被锁了,生产者线程有可能不能及时接受到外来数据导致丢包。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
相关推荐
电脑串口、并口连接线大全
STM32F103使用TIM+DMA驱动WS2812灯带
全球电子协会发布《双重重要性评估(DMA)工具包》 助力电子产业合规开展可持续发展报告
新系列串口EEPROM内置唯一ID码,适合设备识别、溯源和可持续性应用
vxworks中编写串口驱动?(老站转)
[转帖]Vxworks串口驱动编写实例解读
第21讲 DMA实验
超级串口调试器 V2.1.0
串口取电和232转换
PL2303 或PV8651 USB转串口原理图
手把手教你学ARM-STM32 第三十二讲 DMA的工作原理(库函数)
MSP430的外围模块介绍
串口问题!(老站转)
使用音频增强型 DMA 加速复杂的音频 DSP 算法
基于摄像头传感器的智能车循迹算法设计方案
请教VXWORKS中串口收发通讯程序的问题(老站转)
USB转并口、串口电路图(ch341)
USB转串口电路图
串口调试助手 V4.0
STM32视频-直接内存访问(DMA)
PXI总线中频数字化仪系统设计
学习STM32单片机,绕不开的串口
详解串口转换CAN模块“透明带标识转换”
串口转红外的电路
搞嵌入式,不懂DMA?笑死人
USB转并口、串口电路图(ch341).
使用DMA在低功耗可穿戴设备中加快外设监测
手把手教你学ARM-STM32 第三十一讲 DMA的工作原理
usb转232电路
[转帖]串口驱动编写实例解读(一)