打印
[STM32F0]

STM32F030F4P6诡异事件

[复制链接]
3807|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关键字来约束这种行为。

使用特权

评论回复
5
sdggg|  楼主 | 2018-1-25 22:50 | 只看该作者
但,为什么会产生硬件中断,在F3上正常?

使用特权

评论回复
6
sdggg|  楼主 | 2018-1-25 22:57 | 只看该作者
aozima 发表于 2018-1-25 22:37
去查一下 对齐访问 这个名词

是你的用法BUG。

使用指针变量来指向数组后访问结果也是硬件中断,为什么?

使用特权

评论回复
7
aozima| | 2018-1-25 23:32 | 只看该作者
本帖最后由 aozima 于 2018-1-25 23:33 编辑

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

030是M0

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

另外,8位数据类型,链接地址只要求字节对齐就可以了,所以同个芯片同个项目上,不同的编译,链接的位置都有可能会变。
所以,改几行代码再编译一下,地址就可能刚好对上了。

使用特权

评论回复
8
tomzbj| | 2018-1-26 09:20 | 只看该作者
cortex-m0不支持对齐访问啊
在map文件里看一下首地址就知道了

使用特权

评论回复
9
Xflyan| | 2018-1-26 09:44 | 只看该作者
7楼是正解

使用特权

评论回复
10
sdggg|  楼主 | 2018-1-26 10:27 | 只看该作者
确实是对齐问题,32位或64位只能按4字节对齐格式访问,16位只能地址是偶地址

使用特权

评论回复
11
sattic| | 2018-1-26 13:33 | 只看该作者
cortex-m0权威指南,英文版,看数据对齐部分,135页

使用特权

评论回复
12
拉克丝| | 2018-1-29 19:05 | 只看该作者
8位数据类型,链接地址只要求字节对齐就可以了

使用特权

评论回复
13
CCompton| | 2018-1-30 17:07 | 只看该作者
同个芯片同个项目上,不同的编译,链接的位置都有可能会变

使用特权

评论回复
14
禁基的矮子| | 2018-2-12 17:38 | 只看该作者
真要省的话,可以试着用联合体

使用特权

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

本版积分规则

16

主题

155

帖子

1

粉丝