硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1104|回复: 5
收起左侧

[技术讨论] 串口DMA-HardFault

[复制链接]

4

主题

17

回帖

29

积分

新手上路

积分
29
发表于 2023-2-8 00:42:16 | 显示全部楼层 |阅读模式
硬件平台:STM32H750XBH6
软件平台:STM32CubeIDE 1.9
语言:C++(带类的C,少量使用继承和重载特性)
描述问题:
程序状况较为复杂,可能有多处指针越界的隐患。
功能1:使用UART1的空闲中断+DMA 来接收上位机的Modbus数据帧
功能2:使用SPI获取ADC的采集数据
问题描述1:使用c串口空闲中断+DMA的方式,程序正常跑时(调试不添加任何断点)能够正常运行的不会陷入Hardfault,但当程序添加断点后,程序陷入Hardfault,通过CubeIDE的故障检测器定位至调用HAL_WritePin时形参异常,
image.png image.png
初始赋值为GPIOE-Pin15(观测正常),但在此位置打断点后,单步调试进入该函数前数值正常,进入该函数后变量刷新,地址越界且PIn数值异常引起HardFallt
相关思考1:很多人说,当断点拉住MCU时,主函数会停止,但仍会进入中断,但我实际测试过,根本不会进入中断(断点可以打到中断里)。想问一下是我配置的原因还是其他人的说法有误。
相关思考2:断点前数据正常,断点后单步运行数据刷新后异常,(不太了解这个GCC或者GDB工具的实时性,CubeIDE-现场表达式的更新速率有多快 但我猜想由于其他程序的地址越界导致无意中修改了该变量的数值)SPI中拉高引脚只是诱发进入Hardfault的原因,可能程序早已跑飞了。
相关思考3:当前设置DMA为接收循环的模式,当断点拉住主程序运行时,DMA会仍旧接收上位机的数据吗?DMA会仍旧循环填充的方式运行吗?  实际测试,串口接收和断点维持的时间是能否触发进入Hardfault的关键因素(可能断点停止3s内不会进入,10s有90%可能会进入错误)
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-2-8 01:07:28 | 显示全部楼层
各位大哥 帮忙讲讲 实在不会 代码打马赛克是由于变量命名太过醒目
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-8 02:17:38 | 显示全部楼层
1、首先串口空闲中断做Modbus数据接是不合理的,空闲中断是1个字符间隔就触发了,而Modbus是3.5字符,一定波特率以上固定间隔时间。
2、打断点后,会CPU会停止执行,自然也不会执行中断程序,但是已经开启的外设不会停止执行,会触发中断。
3、同上,DMA接收不会停止的。
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-2-8 08:08:15 | 显示全部楼层
eric2013 发表于 2023-2-8 02:17
1、首先串口空闲中断做Modbus数据接是不合理的,空闲中断是1个字符间隔就触发了,而Modbus是3.5字符,一定 ...

感谢您的指导
1.使用空闲中断进行Modbus,触发空闲中断后进行计时操作,进一步区分数据帧
2.您这边的意思是说:假如当前我设置断点在主函数(当前中断有DMA,串口1,定时器),程序停止运行后,只要我不添加新的断点至串口中断,定时器中断函数内部,定时器/串口中断服务程序仍在运行是吗(单步调试在不添加断点的情况下,不会主动进入中断函数)?
3.按照您之前的思路:添加断点停止运行后,DMA接收仍在运行,之前有点怀疑程序卡死(其他程序修改了这个变量中GPIO地址导致操作时地址越界)和DMA循环接收有关。
(学艺不精哈 不好意思 )
3.1 DMA循环接收设置寄存器到内存 当前只对空闲中断标志位进行处理 不太清楚将这个串口接收数据更新,DMA循环搬运是否可能配置等其他原因导致搬运到非法(意料之外)的地址区域
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-2-8 08:35:04 | 显示全部楼层
您好,您说的是这个意思吗?假如当前有个程序,通过设置分频系数和周期等等,每3s才会进入一次定时器中断(触发UpdateIT),对全局变量进行递增。
情况1:当前只打断点在主函数,断点维持的非常短,比如1s,此时的单步是有效的(因为前后定时器用时不到3s)。
情况2:当前只打断点在主函数,未添加断点至定时器中断服务程序,断点维持的稍长,比如4s,此时的单步是无效的,定时器全局变量仍会递增,只是在单步主函数前已经执行完定时器中断服务函数。
情况3:当前只打断点在主函数,3s内添加断点至定时器中断服务程序,断点维持的稍长,比如4s,,定时时间到,步入定时器中断服务程序,此时能够观察到程序流向。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-8 11:24:05 | 显示全部楼层
风沙盗影 发表于 2023-2-8 08:08
感谢您的指导
1.使用空闲中断进行Modbus,触发空闲中断后进行计时操作,进一步区分数据帧
2.您这边的意 ...

1. 这个用法无法有效区分,无谓的增加系统负担。H7系列自带串口超时中断可以用起来
2. 理解不全面,CPU已经暂停,无法执行,是否执行程序,就看CPU是否还可以干活即可,而定时器等硬件外设还工作中。
3.1 只要你的程序配置没问题,不会,除非芯片有硬件bug,或者外部强磁干扰等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 05:15 , Processed in 0.256352 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表