打印
[应用相关]

STM32要求双字节变量必须偶数地址?

[复制链接]
865|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangzj|  楼主 | 2020-3-1 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义了一个8bit型数组,强制转换为16bit指针后,STM32F030进HardFault
查看地址为单数:0x20000213

代码类似这样:
uint8_t tmpBuf[50];
uint16_t *tmpPoint = (uint16_t * )tmpBuf;
当tmpBuff的地址为单数时,操作tmpPoint就进HardFault。
然后将地址强制改为0x20000214,程序就正常了。
uint8_t tmpBuf[50] __attribute__((at(0x20000214))) ;
问题是不是STM32要求双字节变量必须偶数地址?

使用特权

评论回复
沙发
john_lee| | 2020-3-1 22:06 | 只看该作者
“Cortex-M0”和“Cortex-M0+”内核是有要求访问的数据对齐到这个数据宽度的地址,比如你访问16位数据,就需要对齐到16/8=2字节地址,访问32位数据需要对齐到32/8=4字节地址。
Cortex-M3及以上的内核没有这个限制。

使用特权

评论回复
板凳
香水城| | 2020-3-2 10:34 | 只看该作者
楼上所言对的,该问题具体跟所使用的内核有关。

这里有针对你的话题的分享,可以参考下。
一个跟地址对齐有关的应用异常案例

使用特权

评论回复
地板
kangzj|  楼主 | 2020-3-7 09:44 | 只看该作者
怎么改程序

使用特权

评论回复
5
stly| | 2020-3-7 09:54 | 只看该作者
做个联合,一个8位数组,一个16位数组。

使用特权

评论回复
6
pengf| | 2020-3-7 09:58 | 只看该作者
或者定义16位数组,用8位再强制转换。

使用特权

评论回复
7
pengf| | 2020-3-7 10:03 | 只看该作者
你tmpPoint定义的指向双字节数据的指针,即指向的双字节变量,那么给它的地址应该遵循双字节对齐。

使用特权

评论回复
8
kangzj|  楼主 | 2020-3-7 10:07 | 只看该作者
这是一个好主意,我试试

使用特权

评论回复
9
yinxiangh| | 2020-3-7 10:10 | 只看该作者
强制转换的执行不会改变原来8位的存储结构啊。只是在内存里变动了,在硬盘里没有变。

使用特权

评论回复
10
ousj| | 2020-3-7 10:13 | 只看该作者

这个不清楚了,不知道内部怎么存的

使用特权

评论回复
11
xxrs| | 2020-3-7 10:17 | 只看该作者
是不是还在原来位置修改

使用特权

评论回复
12
yufe| | 2020-3-7 10:20 | 只看该作者
我记得强制转换好像不影响原来的值,只是影响当时取的值。

使用特权

评论回复
13
kangzj|  楼主 | 2020-3-7 10:25 | 只看该作者
ARM内核设计的原因,16bit的指针要求地址是双字节对齐

使用特权

评论回复
14
kangzj|  楼主 | 2020-3-7 10:27 | 只看该作者
所以一周一天班的方法是正确的,按照他的方法已经可以正常工作了。

使用特权

评论回复
15
wenfen| | 2020-3-7 10:32 | 只看该作者

对齐方式不同

使用特权

评论回复
16
zhuhuis| | 2020-3-7 10:35 | 只看该作者
如何避免指向无意义地址呢

使用特权

评论回复
17
chenho| | 2020-3-7 10:40 | 只看该作者
没有对齐的访问,

使用特权

评论回复
18
chenho| | 2020-3-7 10:43 | 只看该作者
定义成16位或32位的数组,或者定义成联合

使用特权

评论回复
19
zwll| | 2020-3-7 10:46 | 只看该作者

楼上意见都试试

使用特权

评论回复
20
chuxh| | 2020-3-7 10:49 | 只看该作者
没错,必须得双字节对齐,如果是u32则必须4字节对齐,你可以用 align宏来指定数组对齐。

使用特权

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

本版积分规则

672

主题

7007

帖子

2

粉丝