打印
[国产单片机]

HardFault_Handler 错误请教

[复制链接]
1458|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近手上有个项目在升级整改,新板子到手了就将初步写好的程序烧到板子上,结果出现了HardFault_Handler错误,奇怪的是程序是从旧版上进行修改移植过来的,芯片型号一样就是引脚不同,在旧板上同样的程序能跑,到新板就出错了。最后通过网上的‘‘HardFault_Handler错误教程’’找到了错误语句。我的想法有可能是内存溢出,所以添加了‘&’调试,结果是程序可以正常的跑起来,不过是否添加‘&’对地址的类型转换好像是没影响的吧(函数的实参是unsinged char数组, 形参转换为unsigned long),具体原因我没弄懂,希望有过相同经历的或有思路的大神指点,谢谢!!!

encrypt函数.PNG (21.51 KB )

encrypt函数.PNG

错误语句.PNG (3.44 KB )

错误语句.PNG

相关帖子

沙发
gujiamao12345| | 2018-3-15 14:36 | 只看该作者
MacBlock和Mackey是什么类型的

使用特权

评论回复
板凳
mojingjian|  楼主 | 2018-3-15 14:53 | 只看该作者
gujiamao12345 发表于 2018-3-15 14:36
MacBlock和Mackey是什么类型的

unsinged char 类型的数组

使用特权

评论回复
地板
574997859| | 2018-3-15 15:15 | 只看该作者
看下你的.S文件。堆栈空间的分配,参考一下旧的项目分配。

使用特权

评论回复
5
mojingjian|  楼主 | 2018-3-15 15:34 | 只看该作者
574997859 发表于 2018-3-15 15:15
看下你的.S文件。堆栈空间的分配,参考一下旧的项目分配。

这个有对比过,都是一样的

使用特权

评论回复
6
linqing171| | 2018-3-15 21:28 | 只看该作者
数组名加不加取地址应该都是一样的。
你看看是不是mackey这个数组的地址不是整8对齐的?
能把错误的时候,但不运行,执行到的出错前的最后一句反汇编语句截屏吗?要带着寄存器界面。

使用特权

评论回复
7
delin17| | 2018-3-16 13:55 | 只看该作者
&能运行了,但结果应该不对,可能说楼上所说。 地址不是4个字对节的,导致传进去后,寻址报硬件错误。

使用特权

评论回复
8
mojingjian|  楼主 | 2018-3-16 14:39 | 只看该作者
linqing171 发表于 2018-3-15 21:28
数组名加不加取地址应该都是一样的。
你看看是不是mackey这个数组的地址不是整8对齐的?
能把错误的时候, ...

捕获1图片是encrypt函数的下一条语句,是根据SP找出来的单片机下一步要执行的语句,而捕获2图片是encrypt函数内的语句,程序在断点前都是正常的,执行断点语句就会出错,麻烦分析一下,谢谢

捕获3.PNG (363.73 KB )

捕获3.PNG

捕获2.jpg (346.01 KB )

捕获2.jpg

捕获1.jpg (231.23 KB )

捕获1.jpg

使用特权

评论回复
9
574997859| | 2018-3-16 21:22 | 只看该作者
mojingjian 发表于 2018-3-15 15:34
这个有对比过,都是一样的

断点打在硬件中断里面, 在CALLer Stack里面看一下是谁调用的,然后找一下是哪个函数让你内存溢出,一般你这种的,都是内存溢出的现象。往不知道什么地址的内存里面写数据,它就死了。

使用特权

评论回复
10
linqing171| | 2018-3-16 21:40 | 只看该作者
k指向了0x000021D1,k被分配在R1中。
LDR R5, [R1,#0]    //从R1偏移0的地址取四个字节 load 到寄存器R5里面。
STR R5,[SP,#4]    // 把R5的值set到 SP+4的地址。
... ...

从你上面的抓图里看到了你使用thumb指令集,keil生成的LDR指令,而且从一个0x000021D1的奇数地址去 装载(load)数到寄存器R5.
打开keil的hep菜单,如下图



使用特权

评论回复
11
linqing171| | 2018-3-16 21:54 | 只看该作者
k0和k1这些临时变量被分配在堆栈里,使用sp+4、sp+8等指针访问。32位机的总线里,四个8位宽的内存拼成一个32位宽的内存,内存的address0是接cpu的address2的。

解决非整4地址对齐的方法很多,比如 unsigned long * 修改为__packed  unsigned long * 看看。不过还是建议在定义变量的前一行加上 #pragma pack(8),然后看map文件里变量分配的地址是否整4对齐,前面是否有padding。

另外,你的unsigned long是占四个字节的,看到有右移五位的操作,不知道会不会产生bug。

使用特权

评论回复
12
linqing171| | 2018-3-19 21:12 | 只看该作者
你先在392行那里,unsigned long*k 修改为 __packed unsigned long * k,先将就着用吧。
大哥,你连你们的mackey都发上来了,你老板知道吗?是不是要重新换一个了?有时间的话,你再分析一下sct文件和map文件看看吧。

使用特权

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

本版积分规则

13

主题

63

帖子

1

粉丝