搜索
bottom↓
回复: 13

调stm32进硬件错误中断,大佬给分析一下!!

[复制链接]

出10入4汤圆

发表于 2020-10-20 16:04:10 | 显示全部楼层 |阅读模式
情况是这样的。
定义了一个uint8_t类型的数组。  uint8_t buff[1024];
在进行赋值的时候这样写
*((uint32_t *)(&buff[9]))=data1;
*((uint32_t *)(&buff[13]))=0;
在执行第二个语句的时候进入硬件错误。
我把0换一个数就ok了,把第一个语句删掉也ok,或者两条语句中间加一个delay也ok。
之前没遇到过这种情况啊。是因为我数据指针不是4个byte的整数倍造成的吗。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出5入14汤圆

发表于 2020-10-20 16:16:29 | 显示全部楼层
我估计 ARM 应该不支持不是字地址对齐的字访问吧,否则定义结构体的时候就不会有空字节了。

出0入8汤圆

发表于 2020-10-20 16:26:09 | 显示全部楼层
一般这种,要考虑对齐访问,不能随意用指针强转访问。

你想知道细节的话,可以看反汇编窗口,一步步跟下去。

出10入4汤圆

 楼主| 发表于 2020-10-20 17:09:10 | 显示全部楼层
EMC菜鸟 发表于 2020-10-20 16:16
我估计 ARM 应该不支持不是字地址对齐的字访问吧,否则定义结构体的时候就不会有空字节了。 ...

试了一下,非对齐写一个字,数据是进去了的。
我估计是这种方式有什么bug被触发了

出10入4汤圆

 楼主| 发表于 2020-10-20 17:13:50 | 显示全部楼层
security 发表于 2020-10-20 16:26
一般这种,要考虑对齐访问,不能随意用指针强转访问。

你想知道细节的话,可以看反汇编窗口,一步步跟下去 ...

哎,这客户定的协议真的是无语。有几个数据非要用byte,不知道省这么点空间干嘛。

出30入54汤圆

发表于 2020-10-20 17:34:57 | 显示全部楼层
ARM的核默认是支持非对齐地址的“自动对齐”的,本质上就是把一次非对齐的指令拆分成多次对齐的访问然后组合,这种方式必然导致访问效率下降
另外这种方式只适合部分指令,有些指令出现地址不对齐的情况会报告内存访问异常
还是源头上杜绝这类代码吧

出10入4汤圆

 楼主| 发表于 2020-10-20 18:13:15 | 显示全部楼层
cloudboy 发表于 2020-10-20 17:34
ARM的核默认是支持非对齐地址的“自动对齐”的,本质上就是把一次非对齐的指令拆分成多次对齐的访问然后组 ...

ok,已经都给换了

出0入0汤圆

发表于 2020-10-20 23:29:43 来自手机 | 显示全部楼层
可以看汇编指令,大概率是非对齐导致的,虽然M3和M4的核支持非对齐访问,但并不是所有数据加载的指令都支持非对齐。编译器为了效率会用一些带预索引和后索引的指令,是不支持非对齐的。

出10入4汤圆

 楼主| 发表于 2020-10-21 09:49:31 | 显示全部楼层
lingdianhao 发表于 2020-10-20 23:29
可以看汇编指令,大概率是非对齐导致的,虽然M3和M4的核支持非对齐访问,但并不是所有数据加载的指令都支持 ...

精彩精彩,我去看看还能不能看懂!!

出0入0汤圆

发表于 2020-10-21 15:19:48 | 显示全部楼层
非对齐访问

在ARMv6之前,是不支持非对齐访问的,一旦非对齐访问,将引发异常。

在CM3(ARMv7-M)中,支持非对齐访问,但是,非对齐的数据传送只发生在常规的数据传送指令中,如 LDR/LDRH/LDRSH/STR。

其它指令则不支持,包括:

1 多个数据的加载/存储(LDM/STM)

2 堆栈操作 PUSH/POP。堆栈指针SP(R13)的最低两位默认为0,也就是表示了四字节对齐

3 互斥访问(LDREX/STREX)。如果非对齐会导致 fault

4 位带操作。因为只有 LSB 有效,非对齐的访问会导致不可预料的结果。


所以要看汇编才能确知问题

出0入16汤圆

发表于 2020-10-21 15:26:34 | 显示全部楼层
achild 发表于 2020-10-20 17:13
哎,这客户定的协议真的是无语。有几个数据非要用byte,不知道省这么点空间干嘛。 ...

用__packed typedef struct 定义结构体再访问结构体成员好了

出0入0汤圆

发表于 2020-10-21 16:49:10 | 显示全部楼层
EMC菜鸟 发表于 2020-10-20 16:16
我估计 ARM 应该不支持不是字地址对齐的字访问吧,否则定义结构体的时候就不会有空字节了。 ...

CM内核默认支持非对齐访问,只是效率低。反倒是要手工关闭才给触发busfault。

出10入4汤圆

 楼主| 发表于 2020-10-21 17:09:34 | 显示全部楼层
本帖最后由 achild 于 2020-10-21 17:46 编辑
hyper320 发表于 2020-10-21 15:19
非对齐访问

在ARMv6之前,是不支持非对齐访问的,一旦非对齐访问,将引发异常。


哪路大神啊,你是做u的吧,这么清楚。在执行STRD指令的时候进的异常。看了一下,用的U是armv7架构的,STRD确实不能非对齐访问。如果是armv8,,就没这个问题了。

出0入0汤圆

发表于 2020-10-22 15:07:18 | 显示全部楼层
achild 发表于 2020-10-21 17:09
哪路大神啊,你是做u的吧,这么清楚。在执行STRD指令的时候进的异常。看了一下,用的U是armv7架构的,STR ...

如果效率不是这么要求的话,11F是正解,因为编译器会根据状况自动帮你做存取,从而避免了这种很底层的问题,事实上是如果是不可非对称的MCU,他会呼叫一个转换的函式自动处理非对称的问题,可以从编译过的汇编看出端倪
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 14:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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