[STM32F0] STM32F030F4P6诡异事件

[复制链接]
4113|13
 楼主| sdggg 发表于 2018-1-25 19:27 | 显示全部楼层 |阅读模式
keil5工具,定义一个静态或全局数组uint8_t arr[8],若以32位*((uint32_t *)arr)或64位*((uint64_t *)arr)访问将产生硬件中断,程序无法继续运行,但按16位方式访问正常,若将数组改为uint8_t arr[9]或者在这个数组的前或后面再加定义一个静态或者全局变量也正常了;再将arr改成uint16_t arr[4],以32位*((uint32_t *)arr)或64位*((uint64_t *)arr)访问也将产生硬件中断,将数组元素增加到5个,则正常;得出结论:对数组以32位*((uint32_t *)arr)或64位*((uint64_t *)arr)访问时,需要分配已32位为大小并多1字节空间才行。另外,把程序移到STM32F3单片机下一切正常,不会发生上面这种情况,有大神遇到这种bug吗
玛尼玛尼哄 发表于 2018-1-25 21:06 | 显示全部楼层
这也太高级了,我很少用指针。
 楼主| sdggg 发表于 2018-1-25 22:04 来自手机 | 显示全部楼层
我这用指针都是家常便饭,只为了节省代码空间
aozima 发表于 2018-1-25 22:37 | 显示全部楼层
去查一下 对齐访问 这个名词

是你的用法BUG。

任何变量(u8 u32 double 结构体),在链接时,都有对齐要求,
链接器会合理分配并可能重新排序。

如果是结构体,还可能会加填充。

以上是默认行为,也可以添加align和pack关键字来约束这种行为。
 楼主| sdggg 发表于 2018-1-25 22:50 来自手机 | 显示全部楼层
但,为什么会产生硬件中断,在F3上正常?
 楼主| sdggg 发表于 2018-1-25 22:57 | 显示全部楼层
aozima 发表于 2018-1-25 22:37
去查一下 对齐访问 这个名词

是你的用法BUG。

使用指针变量来指向数组后访问结果也是硬件中断,为什么?
aozima 发表于 2018-1-25 23:32 | 显示全部楼层
本帖最后由 aozima 于 2018-1-25 23:33 编辑

F3 是M4内核,支持硬件非对齐访问(底层还是拆成多条操作)
内核配置有一个开关,打开后,非对齐访问也会异常。

030是M0

去了解一下CPU内部总线相关的知识就比较好理解了!

另外,8位数据类型,链接地址只要求字节对齐就可以了,所以同个芯片同个项目上,不同的编译,链接的位置都有可能会变。
所以,改几行代码再编译一下,地址就可能刚好对上了。
tomzbj 发表于 2018-1-26 09:20 | 显示全部楼层
cortex-m0不支持对齐访问啊
在map文件里看一下首地址就知道了
Xflyan 发表于 2018-1-26 09:44 | 显示全部楼层
7楼是正解
 楼主| sdggg 发表于 2018-1-26 10:27 来自手机 | 显示全部楼层
确实是对齐问题,32位或64位只能按4字节对齐格式访问,16位只能地址是偶地址
sattic 发表于 2018-1-26 13:33 | 显示全部楼层
cortex-m0权威指南,英文版,看数据对齐部分,135页
拉克丝 发表于 2018-1-29 19:05 | 显示全部楼层
8位数据类型,链接地址只要求字节对齐就可以了
CCompton 发表于 2018-1-30 17:07 | 显示全部楼层
同个芯片同个项目上,不同的编译,链接的位置都有可能会变
禁基的矮子 发表于 2018-2-12 17:38 | 显示全部楼层
真要省的话,可以试着用联合体
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

155

帖子

1

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