STM32 HardFault问题

[复制链接]
10222|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 | 显示全部楼层
我也曾遇过这样的问题,就是数组搞的,引用时元素值给错了。
shuaijing 发表于 2011-11-22 20:49 | 显示全部楼层
我认为是访问越界问题。
gabys 发表于 2011-11-27 21:42 | 显示全部楼层
数组是一个让人头疼的问题啊。
 楼主| 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,堆栈是默认四字节对齐。哪位牛人能指点一下?
 楼主| 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,堆栈是默认四字节对齐。哪位牛人能指点一下?
 楼主| 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,堆栈是默认四字节对齐。哪位牛人能指点一下?
 楼主| silverpal 发表于 2011-12-2 11:53 | 显示全部楼层
补充一点,进入HardFault后查询寄存器得知发生了不精确的数据访问违例。
 楼主| silverpal 发表于 2011-12-2 11:58 | 显示全部楼层
我怀疑是不是编译器的问题啊。
jzhjt29 发表于 2011-12-2 12:31 | 显示全部楼层
不可能是编译器的问题吧
outmind 发表于 2011-12-17 15:47 | 显示全部楼层
我也碰到了类似的问题,出现了访问违例。
我用的芯片是STM32F103R
     新下载进去的程序会出现这种情况,我让程序一直跑,同时打印出BFSR信息,结果发现一开始是不精确的访问违例,后来跑着跑着就成了精确的访问违例了。访问的地址是0x2000E01A,这个地址是没有物理内存的。
     但是如果复位了程序后,则不再出现;如果我用硬件调试,即使新下载进去的程序也没有出现违例。感觉很奇怪。。。
outmind 发表于 2011-12-17 15:49 | 显示全部楼层
求高手们指教啊~~~~~~~顶贴~~~~~~
shuaijing 发表于 2011-12-22 19:47 | 显示全部楼层
HardFault
还是访问越界的情况躲一下。
liujunboss1 发表于 2012-12-3 20:59 | 显示全部楼层
我也遇到了
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

粉丝
快速回复 在线客服 返回列表 返回顶部