打印

STM32 HardFault问题

[复制链接]
9188|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
silverpal|  楼主 | 2011-11-15 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序跑进了HardFault,获取入栈的PC,发现是一个偶数0x0802bf44,而我的.map文件显示在0x0802bf45处定义了一个函数(宏?),大小为0。这是否是我调用该函数(宏?)时出错了?该怎么解决?
另外,我调试时尝试添加一个全局变量来获取调试参数,结果发现不再进HardFault了,不明白问题出在哪,请高手指点一二。
沙发
silverpal|  楼主 | 2011-11-15 10:55 | 只看该作者
还有一个疑问:如果PC为偶数,应该是触发用法Fault,但我查看Fault状态寄存器却发现报的是总线Fault上访成HardFault,总线Fault的类型是非精确总线FAULT。

使用特权

评论回复
板凳
香水城| | 2011-11-15 13:09 | 只看该作者
HardFault多数情况是访问越界,LZ可以按照这个思路查找。

使用特权

评论回复
地板
mcuatmel| | 2011-11-15 17:48 | 只看该作者
我也曾遇过这样的问题,就是数组搞的,引用时元素值给错了。

使用特权

评论回复
5
shuaijing| | 2011-11-22 20:49 | 只看该作者
我认为是访问越界问题。

使用特权

评论回复
6
gabys| | 2011-11-27 21:42 | 只看该作者
数组是一个让人头疼的问题啊。

使用特权

评论回复
7
silverpal|  楼主 | 2011-12-2 11:48 | 只看该作者
今天又碰到一个问题,与之前的情况类似。
我在一个C文件中定义了一个unsigned short 型的全局变量,编译链接后发现
Program Size: Code=167538 RO-data=4818 RW-data=1316 ZI-data=48348
如果不定义这个全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1312 ZI-data=48344
如果定义一个unsigned int型的全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1320 ZI-data=48344

unsigned short型变量为什么同时占用了RW-data和ZI-data?而且,如果我定义了这个unsigned short型变量,即使完全不使用它,系统启动一会后就会进hardfault,而不定义或者定义为unsigned int型变量则不会.
我的编程环境是Keil uVision V3.90,MCU为STM32F103RCT6,跑ucos-ii,堆栈是默认四字节对齐。哪位牛人能指点一下?

使用特权

评论回复
8
silverpal|  楼主 | 2011-12-2 11:49 | 只看该作者
今天又碰到一个问题,与之前的情况类似。
我在一个C文件中定义了一个unsigned short 型的全局变量,编译链接后发现
Program Size: Code=167538 RO-data=4818 RW-data=1316 ZI-data=48348
如果不定义这个全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1312 ZI-data=48344
如果定义一个unsigned int型的全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1320 ZI-data=48344

unsigned short型变量为什么同时占用了RW-data和ZI-data?而且,如果我定义了这个unsigned short型变量,即使完全不使用它,系统启动一会后就会进hardfault,而不定义或者定义为unsigned int型变量则不会.
我的编程环境是Keil uVision V3.90,MCU为STM32F103RCT6,跑ucos-ii,堆栈是默认四字节对齐。哪位牛人能指点一下?

使用特权

评论回复
9
silverpal|  楼主 | 2011-12-2 11:49 | 只看该作者
今天又碰到一个问题,与之前的情况类似。
我在一个C文件中定义了一个unsigned short 型的全局变量,编译链接后发现
Program Size: Code=167538 RO-data=4818 RW-data=1316 ZI-data=48348
如果不定义这个全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1312 ZI-data=48344
如果定义一个unsigned int型的全局变量:
Program Size: Code=167538 RO-data=4818 RW-data=1320 ZI-data=48344

unsigned short型变量为什么同时占用了RW-data和ZI-data?而且,如果我定义了这个unsigned short型变量,即使完全不使用它,系统启动一会后就会进hardfault,而不定义或者定义为unsigned int型变量则不会.
我的编程环境是Keil uVision V3.90,MCU为STM32F103RCT6,跑ucos-ii,堆栈是默认四字节对齐。哪位牛人能指点一下?

使用特权

评论回复
10
silverpal|  楼主 | 2011-12-2 11:53 | 只看该作者
补充一点,进入HardFault后查询寄存器得知发生了不精确的数据访问违例。

使用特权

评论回复
11
silverpal|  楼主 | 2011-12-2 11:58 | 只看该作者
我怀疑是不是编译器的问题啊。

使用特权

评论回复
12
jzhjt29| | 2011-12-2 12:31 | 只看该作者
不可能是编译器的问题吧

使用特权

评论回复
13
outmind| | 2011-12-17 15:47 | 只看该作者
我也碰到了类似的问题,出现了访问违例。
我用的芯片是STM32F103R
     新下载进去的程序会出现这种情况,我让程序一直跑,同时打印出BFSR信息,结果发现一开始是不精确的访问违例,后来跑着跑着就成了精确的访问违例了。访问的地址是0x2000E01A,这个地址是没有物理内存的。
     但是如果复位了程序后,则不再出现;如果我用硬件调试,即使新下载进去的程序也没有出现违例。感觉很奇怪。。。

使用特权

评论回复
14
outmind| | 2011-12-17 15:49 | 只看该作者
求高手们指教啊~~~~~~~顶贴~~~~~~

使用特权

评论回复
15
shuaijing| | 2011-12-22 19:47 | 只看该作者
HardFault
还是访问越界的情况躲一下。

使用特权

评论回复
16
liujunboss1| | 2012-12-3 20:59 | 只看该作者
我也遇到了

使用特权

评论回复
17
free_tend| | 2016-5-20 09:30 | 只看该作者
我也遇见了这个么个问题。
如果用keil下载程序就会出现hardfault, 复位也解决不了问题。
但是如果直接拔掉电源重新上电就怎么压力测试都不会有问题。

同样直接用bootloader下载app后会出现这个问题。但是 重新上电就没了。

还有, 如果我有keil把app重新烧写到app区域, 再用bootloader升级app擦拭flash,就没有这个问题了。
另外的条件是, 如果我单独把app烧写到开始位置 ,直接启动app也不会有问题。

那么这么看 好像问题出在bootloader的上面。
但是如果bootloader升级app后, 重新上电就没有问题。
对此我怀疑问题可能出在ymodem的部分。 但是我仔细看过代码, 也没有什么可以调节的部分。

描述有点乱, 有人能帮忙解答一下吗

使用特权

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

本版积分规则

4

主题

28

帖子

1

粉丝