[STM32F0] STM32F030F4P6奇怪的问题

[复制链接]
2451|31
 楼主| bqyj 发表于 2019-8-24 19:39 | 显示全部楼层 |阅读模式
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字节空间才行。
 楼主| bqyj 发表于 2019-8-24 19:42 | 显示全部楼层
另外,把程序移到STM32F3单片机下一切正常,不会发生上面这种情况
zhuhuis 发表于 2019-8-24 19:44 | 显示全部楼层

这也太高级了,我很少用指针。
 楼主| bqyj 发表于 2019-8-24 19:48 | 显示全部楼层
我这用指针都是家常便饭,只为了节省代码空间
tian111 发表于 2019-8-24 19:52 | 显示全部楼层
去查一下 对齐访问 这个名词

是你的用法BUG。

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

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

以上是默认行为,也可以添加align和pack关键字来约束这种行为。
 楼主| bqyj 发表于 2019-8-24 19:54 | 显示全部楼层
但,为什么会产生硬件中断,在F3上正常?
 楼主| bqyj 发表于 2019-8-24 19:57 | 显示全部楼层
使用指针变量来指向数组后访问结果也是硬件中断,为什么?
songqian17 发表于 2019-8-24 20:01 | 显示全部楼层
F3 是M4内核,支持硬件非对齐访问(底层还是拆成多条操作)
内核配置有一个开关,打开后,非对齐访问也会异常。

030是M0

去了解一下CPU内部总线相关的知识就比较好理解了!
chenho 发表于 2019-8-24 20:06 | 显示全部楼层
另外,8位数据类型,链接地址只要求字节对齐就可以了,所以同个芯片同个项目上,不同的编译,链接的位置都有可能会变。
liliang9554 发表于 2019-8-24 20:10 | 显示全部楼层
所以,改几行代码再编译一下,地址就可能刚好对上了。
zwll 发表于 2019-8-24 20:13 | 显示全部楼层

cortex-m0不支持对齐访问啊
在map文件里看一下首地址就知道了
 楼主| bqyj 发表于 2019-8-24 20:15 | 显示全部楼层

确实是对齐问题,32位或64位只能按4字节对齐格式访问,16位只能地址是偶地址
chuxh 发表于 2019-8-24 20:18 | 显示全部楼层
cortex-m0权威指南,英文版,看数据对齐部分,135页
juventus9554 发表于 2019-8-24 20:22 | 显示全部楼层
8位数据类型,链接地址只要求字节对齐就可以了
stly 发表于 2019-8-24 20:27 | 显示全部楼层
同个芯片同个项目上,不同的编译,链接的位置都有可能会变
llljh 发表于 2019-8-24 20:31 | 显示全部楼层
真要省的话,可以试着用联合体
 楼主| bqyj 发表于 2019-8-24 20:33 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽
huadong1357 发表于 2019-9-12 14:42 | 显示全部楼层
32位或64位只能按4字节对齐格式访问,使用ST flash库函数字节读写操作同样
磨砂 发表于 2019-9-20 10:43 | 显示全部楼层
非常感谢楼主分享
晓伍 发表于 2019-9-20 10:53 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

390

主题

4526

帖子

2

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