Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DMA
FIFO
串口V2中关于FIFO接收部分不理解
发布于 2022-09-02 10:07:31 浏览:647
订阅该版
硬件:STM32F429IGT6核心板 操作系统:RTT V4.1.5 串口框架:使用串口V2。配置如下 / 以 DMA 接收及轮询发送方式打开串口设备 / rt_device_open(serial, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); **DEBUG的时候,打断点停止程序运行,让上位机一直发送数据。然后在恢复程序运行。会发现线程被挂起了。。。。 这个线程使用串口V2,在接收回调函数中使用消息队列发送。线程阻塞接收。** **打断点运行了一下,发现DMA的半满中断,全满中断,和空闲中断都进了一次后,线程才会进入一次去接收读到的长度。导致RINGBUFFER缓冲长度与接收消息长度不一致。 估计是中断进入太快,线程来不及响应。等到线程响应时,DMA的半满中断,全满中断,和空闲中断都进去过了。这个时候的RINGBUFFER缓冲长度是第三个中断处理完运算的长度了,而线程接收到的长度却是第一个中断运算后的缓存长度,导致长度不一致,挂起线程** **裸机使用时,dma+串口接收+fifo缓冲区。我放入中断进入时就做判断处理。这样就不会有问题的。** ***是不是可以做个啥判断,保证线程处理的长度值一定是最新运算后的呢? 比如记录一下运算后的缓存长度是进入哪个中断处理的,线程接收时判断一下缓存长度的进入中断与线程接收时的进入中断是否一致。不一致在怎么处理之类的*** 代码如下 ```c /** * @brief MODBUS线程 * @param p:无用,不定义创建线程有警告 * @retval None. * @note None. */ static void modbus_thread(void* p) { //初始化modbusRTU,从站地址为0x01,波特率为115200,无校验。 eMBRTUInit(&ucRTU_DCB,&ucMB_RTU_PORT,SLAVE_ADDRESS,BAUD_RATE,MB_PAR_NONE); eMBRTUStart(&ucRTU_DCB); //F4使能空闲中断不会立马进入中断函数进行状态转换,手动切换 ucRTU_DCB.eRcvState = STATE_RX_IDLE; while(1) { struct rx_msg msg; rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息 */ rt_err_t result = rt_mq_recv(rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /* 从串口读取数据 */ rt_uint32_t rx_length = rt_device_read(msg.dev, 0,(CHAR *)ucRTU_DCB.ucBuffer, msg.size); if(rx_length != msg.size) { LOG_W("Incorrect receive length"); break; } else { ucRTU_DCB.ucBufferCount = rx_length; //写入读取大小 xMBPortEventPost(&ucRTU_DCB,EV_FRAME_RECEIVED); //改变事件状态为接收事件 rt_mutex_take(mb_slave_mutex, RT_WAITING_FOREVER);//保存内存 eMBRTUPoll(&ucRTU_DCB); //读写内存 rt_mutex_release(mb_slave_mutex); //允许操作内存 rt_sem_release(mb_buff_sem); //释放MB处理线程信号量 } } } } /*******************************************串口收发处理函数*********************************************************************/ /** * @brief This function will set the reception indication callback function. This callback function * is invoked when this device receives data. * * @param dev is the pointer of device driver structure. * * @param rx_ind is the indication callback function. * * @return RT_EOK */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(rx_mq, &msg, sizeof(msg)); if (result == -RT_EFULL) { /* 消息队列满 */ LOG_E("message queue full!"); } return 1; } ``` 挂起代码如下,这段代码在serial_v2.c的_serial_fifo_rx函数中 ```c if (recv_len < size) { /* When recv_len is less than size, rx_cpt_index is updated to the size * and rt_current_thread is suspend until rx_cpt_index is equal to 0 */ rx_fifo->rx_cpt_index = size; rt_completion_wait(&(rx_fifo->rx_cpt), RT_WAITING_FOREVER); } ``` 不理解为什么要这样做,如果发生了我该怎么操作去恢复线程运行呢?
查看更多
出出啊
2022-09-02
恃人不如自恃,人之为己者不如己之自为也
放弃 v2 吧。~~说多了好像我是来拆台的~~
2
个回答
默认排序
按发布时间排序
用户名由3_15位
2022-09-13
这家伙很懒,什么也没写!
修改串口打开方式为不阻塞。 `rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING);` 解决了串口线程挂掉问题。虽然还有时会报错“Incorrect receive length” ```c if(rx_length != msg.size) { LOG_W("Incorrect receive length"); continue; } ``` 但是这样处理,线程起码不会假死
撰写答案
登录
注册新账号
关注者
0
被浏览
647
关于作者
用户名由3_15位
这家伙很懒,什么也没写!
提问
62
回答
229
被采纳
32
关注TA
发私信
相关问题
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
stm32L4 lpuart1DMA下不能打开的问题
4
UART驱动开启DMA后编译报错,UART DMA配置中加入了没有定义的域
5
UART DMA 设计问题
6
UART DMA 拆包问题
7
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
8
串口接收使用方式问题
9
在studio中打开串口的DMA后,编译出错
10
官方DMA串口例程,使用时数据打印错误
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
4
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部