[国产单片机] HardFault_Handler 错误请教

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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文件。堆栈空间的分配,参考一下旧的项目分配。
 楼主| mojingjian 发表于 2018-3-15 15:34 | 显示全部楼层
574997859 发表于 2018-3-15 15:15
看下你的.S文件。堆栈空间的分配,参考一下旧的项目分配。

这个有对比过,都是一样的
linqing171 发表于 2018-3-15 21:28 | 显示全部楼层
数组名加不加取地址应该都是一样的。
你看看是不是mackey这个数组的地址不是整8对齐的?
能把错误的时候,但不运行,执行到的出错前的最后一句反汇编语句截屏吗?要带着寄存器界面。
delin17 发表于 2018-3-16 13:55 | 显示全部楼层
&能运行了,但结果应该不对,可能说楼上所说。 地址不是4个字对节的,导致传进去后,寻址报硬件错误。
 楼主| mojingjian 发表于 2018-3-16 14:39 | 显示全部楼层
linqing171 发表于 2018-3-15 21:28
数组名加不加取地址应该都是一样的。
你看看是不是mackey这个数组的地址不是整8对齐的?
能把错误的时候, ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
574997859 发表于 2018-3-16 21:22 | 显示全部楼层
mojingjian 发表于 2018-3-15 15:34
这个有对比过,都是一样的

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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。

linqing171 发表于 2018-3-19 21:12 | 显示全部楼层
你先在392行那里,unsigned long*k 修改为 __packed unsigned long * k,先将就着用吧。
大哥,你连你们的mackey都发上来了,你老板知道吗?是不是要重新换一个了?有时间的话,你再分析一下sct文件和map文件看看吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

65

帖子

1

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