打印
[技术问答]

小华HC32F170的串口DMA溢出Hardfault问题[13楼已解决]

[复制链接]
1314|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerkoh|  楼主 | 2023-2-13 10:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jerkoh 于 2023-2-13 15:25 编辑

DMA串口设置了 如下
stcDmaCfg.u16BlockSize = 1;         
stcDmaCfg.u16TransferCnt =500;      
      
当串口大数据压力测试时,第一次故意给它发800字节就hartfault了,确定没有memcpy问题导致。
请问还有什么配合清除 重置的操作吗?


使用特权

评论回复
沙发
wubangmi| | 2023-2-13 10:42 | 只看该作者
我敢肯定你直接把栈放大就没啥问题了,出现这个问题的根本原因是你栈被冲了

使用特权

评论回复
板凳
jerkoh|  楼主 | 2023-2-13 10:54 | 只看该作者
wubangmi 发表于 2023-2-13 10:42
我敢肯定你直接把栈放大就没啥问题了,出现这个问题的根本原因是你栈被冲了 ...

是的,0x200 调到0x400  会好一些
但还是无法阻止压力测试大数据,按理说应该可以任意大数据进来都能抵挡。
其他MCU,也DMA压力测试是不会harffault的,觉得还是哪个关机的配置错
或者清某个寄存器 未操作
最多溢出回到头覆盖或者到底不动了,不能hardfault呀

使用特权

评论回复
地板
jerkoh|  楼主 | 2023-2-13 10:55 | 只看该作者
wubangmi 发表于 2023-2-13 10:42
我敢肯定你直接把栈放大就没啥问题了,出现这个问题的根本原因是你栈被冲了 ...

有什么彻底的办法,让DMA接收的数据 不影响栈吗?

使用特权

评论回复
5
wubangmi| | 2023-2-13 10:57 | 只看该作者
jerkoh 发表于 2023-2-13 10:54
是的,0x200 调到0x400  会好一些
但还是无法阻止压力测试大数据,按理说应该可以任意大数据进来都能抵挡 ...

那就是你DMA触发搬运数据没控制好,由于DMA出错,导致DMA失控一直在搬数据又把栈给冲掉了

使用特权

评论回复
6
wubangmi| | 2023-2-13 11:01 | 只看该作者
jerkoh 发表于 2023-2-13 10:55
有什么彻底的办法,让DMA接收的数据 不影响栈吗?

是你代码写的有问题,不是DMA接收的数据影响栈。
你需要仔细研究DMA和UART的配合问题

使用特权

评论回复
7
jerkoh|  楼主 | 2023-2-13 11:05 | 只看该作者
wubangmi 发表于 2023-2-13 10:57
那就是你DMA触发搬运数据没控制好,由于DMA出错,导致DMA失控一直在搬数据又把栈给冲掉了 ...

代码已经直接屏蔽了搬数据,也是这样harddault

我理解不去搬运  应该DMA自己收到rxbuff指定的数据组,即使rxbuff就500字节,那来2000字节也不能溢出hardfault, 因该最大就是500个设置的stcDmaCfg.u16TransferCnt =500;   

使用特权

评论回复
8
chenqianqian| | 2023-2-13 12:07 | 只看该作者
数据溢出引出的hardfault

使用特权

评论回复
9
yang377156216| | 2023-2-13 14:04 | 只看该作者

这个压力测试未发生进入 HardFault 的问题。 DMA 的配置与你的一样,栈的配置也是默认的 0x200,另外第一次发送 500个字节回了500个字节,后面每 500ms 发送1000字节回了500字节,如此循环往复正常收发。应该是接收数组开辟的空间不够导致的,而与 DMA、栈的配置无关。

使用特权

评论回复
评论
jerkoh 2023-2-13 14:43 回复TA
接收数组开辟的空间不够导致的 这个说法我觉得有问题,串口对接方发什么异常都可能的 我这边接收应该去适应它,偶不是开个足够大的串口,比如15K这么大 那要是对方一次发1000K字节,照样溢出的。 我仍觉得应该DMA有什么方法设置了最大比如500,就不数据溢出 
10
jerkoh|  楼主 | 2023-2-13 14:35 | 只看该作者
yang377156216 发表于 2023-2-13 14:04
这个压力测试未发生进入 HardFault 的问题。 DMA 的配置与你的一样,栈的配置也是默认的 0x200,另外第一 ...

谢谢,500ms间隔这种长间隔的没问题的,测试几天都正常
我是1ms间隔,发大数据包,故意模拟串口对方异常发,要HC32L不进hardfault
也就是1ms间隔不停发500字节, 让DMA配合超时定时器无法断开包导致溢出,但这个肯定有什么方案解决的
都在对方异常干扰连续发了一大堆数据,那 我必须复位的话不合理。

使用特权

评论回复
11
jerkoh|  楼主 | 2023-2-13 14:39 | 只看该作者
chenqianqian 发表于 2023-2-13 12:07
数据溢出引出的hardfault

是的,溢出,0x2000000里看也是溢出数据一大堆,堆栈溢出。

但问题是要知道DMA这种 连续1ms间隔的压力测试,如何让它不溢出?

长见的hardfault, 一般都是指针错,或和for copy    memcpy越界,
这个已经排除,因为代码就没这样的操作, 只有DMA串口配置定时超时。

使用特权

评论回复
12
jerkoh|  楼主 | 2023-2-13 14:51 | 只看该作者
本帖最后由 jerkoh 于 2023-2-13 14:52 编辑

问题的核心总结下,应该如下
1. 设置了DMA接收的  stcDmaCfg.u16TransferCnt =500;
2. 发送模拟1ms间隔这种一次发大几K数据,远超500字节的压力值
3. 由于本身DMA关联了定时器TIM6 坐空闲中断,但由于1ms间隔发几K,不会出现空闲中断,一直收数据,导致内存溢出
4. 对于stcDmaCfg.u16TransferCnt =500; 我理解最大DMA收这么多,超过的覆盖或不收‘; 而实际应该是对着sbuf缓冲数据
    Rxbuff这个指定数据不停向下越界了。  
5. 应该有方案解决4的问题,否则任何大数据异常的过来都会hardfault了。(其它实测没这问题,如GD,ST基于库的)
6. HC32系列<HC32L17x_DDL_Rev1.2.0> 刚用一周多,还不太熟悉。

使用特权

评论回复
13
jerkoh|  楼主 | 2023-2-13 15:24 | 只看该作者
已解决
还是DMA配置问题,不熟悉。希望有对碰到同样问题的有所帮助。
stcDmaCfg.enTransferMode = DmaMskContinuousTransfer;   
改成
stcDmaCfg.enTransferMode = DmaMskOneTransfer;   
就可以任意串口数据洪水攻击不hardfault了

使用特权

评论回复
14
lvanping| | 2023-3-3 08:14 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

116

主题

1401

帖子

2

粉丝