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

[复制链接]
1260|35
 楼主| kangzj 发表于 2022-4-10 23:07 | 显示全部楼层 |阅读模式
定义了一个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要求双字节变量必须偶数地址?
heweibig 发表于 2022-4-10 23:09 | 显示全部楼层
“Cortex-M0”和“Cortex-M0+”内核是有要求访问的数据对齐到这个数据宽度的地址
xxrs 发表于 2022-4-10 23:11 | 显示全部楼层
比如你访问16位数据,就需要对齐到16/8=2字节地址,访问32位数据需要对齐到32/8=4字节地址。
xxrs 发表于 2022-4-10 23:13 | 显示全部楼层
Cortex-M3及以上的内核没有这个限制。
chuxh 发表于 2022-4-10 23:16 | 显示全部楼层
该问题具体跟所使用的内核有关。
 楼主| kangzj 发表于 2022-4-10 23:18 | 显示全部楼层
怎么改程序
huangchui 发表于 2022-4-10 23:20 | 显示全部楼层
做个联合,一个8位数组,一个16位数组。
jiaxw 发表于 2022-4-10 23:22 | 显示全部楼层

或者定义16位数组,用8位再强制转换。
stly 发表于 2022-4-10 23:26 | 显示全部楼层
你tmpPoint定义的指向双字节数据的指针,即指向的双字节变量,那么给它的地址应该遵循双字节对齐。
 楼主| kangzj 发表于 2022-4-10 23:29 | 显示全部楼层
这是一个好主意,我试试
xxrs 发表于 2022-4-10 23:31 | 显示全部楼层

强制转换的执行不会改变原来8位的存储结构啊。只是在内存里变动了,在硬盘里没有变。
jiajs 发表于 2022-4-10 23:35 | 显示全部楼层
这个不清楚了,不知道内部怎么存的
dengdc 发表于 2022-4-10 23:37 | 显示全部楼层
是不是还在原来位置修改
dingy 发表于 2022-4-10 23:41 | 显示全部楼层
我记得强制转换好像不影响原来的值,只是影响当时取的值。
 楼主| kangzj 发表于 2022-4-10 23:45 | 显示全部楼层
ARM内核设计的原因,16bit的指针要求地址是双字节对齐
 楼主| kangzj 发表于 2022-4-10 23:47 | 显示全部楼层
所以一周一天班的方法是正确的,按照他的方法已经可以正常工作了。
yszong 发表于 2022-4-10 23:50 | 显示全部楼层
对齐方式不同
juventus9554 发表于 2022-4-10 23:52 | 显示全部楼层
如何避免指向无意义地址呢
renyaq 发表于 2022-4-10 23:54 | 显示全部楼层
没有对齐的访问,
heweibig 发表于 2022-4-10 23:56 | 显示全部楼层
定义成16位或32位的数组,或者定义成联合
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

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