打印
[应用相关]

请教一个8bit数组和16bit指针的问题

[复制链接]
2916|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pq113_6|  楼主 | 2018-7-25 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义了一个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))) ;
问题是:
1. 是不是STM32要求双字节变量必须偶数地址?
2. 怎么改程序
沙发
一周一天班| | 2018-7-25 11:48 | 只看该作者
做个联合,一个8位数组,一个16位数组。

使用特权

评论回复
板凳
一周一天班| | 2018-7-25 11:49 | 只看该作者
或者定义16位数组,用8位再强制转换。

使用特权

评论回复
地板
香水城| | 2018-7-25 11:53 | 只看该作者
你tmpPoint定义的指向双字节数据的指针,即指向的双字节变量,那么给它的地址应该遵循双字节对齐。

使用特权

评论回复
5
pq113_6|  楼主 | 2018-7-25 12:05 | 只看该作者
一周一天班 发表于 2018-7-25 11:49
或者定义16位数组,用8位再强制转换。

这是一个好主意,我试试

使用特权

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

使用特权

评论回复
7
dongnanxibei| | 2018-7-25 15:50 | 只看该作者
这个不清楚了,不知道内部怎么存的,是不是还在原来位置修改,我记得强制转换好像不影响原来的值,只是影响当时取的值。

使用特权

评论回复
8
pq113_6|  楼主 | 2018-7-25 15:51 | 只看该作者
zhuomuniao110 发表于 2018-7-25 14:09
强制转换的执行不会改变原来8位的存储结构啊。只是在内存里变动了,在硬盘里没有变。 ...

版主已经回答了,ARM内核设计的原因,16bit的指针要求地址是双字节对齐,所以一周一天班的方法是正确的,按照他的方法已经可以正常工作了。

使用特权

评论回复
9
paotangsan| | 2018-7-25 15:57 | 只看该作者
对齐方式不同

使用特权

评论回复
10
晓伍| | 2018-7-25 16:07 | 只看该作者
如何避免指向无意义地址呢

使用特权

评论回复
11
ayb_ice| | 2018-7-25 16:27 | 只看该作者
没有对齐的访问,
定义成16位或32位的数组,或者定义成联合

使用特权

评论回复
12
稳稳の幸福| | 2018-7-25 17:29 | 只看该作者
楼上意见都试试

使用特权

评论回复
13
huzi2099| | 2018-7-25 18:19 | 只看该作者
没错,必须得双字节对齐,如果是u32则必须4字节对齐,你可以用 align宏来指定数组对齐。

使用特权

评论回复
14
稳稳の幸福| | 2018-7-25 19:29 | 只看该作者
(uint16_t * )tmpBuf;
这个操作后,我想tmpBuf是不会改变的吧,只是新建了一个缓存。。

使用特权

评论回复
15
linqing171| | 2018-7-25 20:41 | 只看该作者
__packed uint16_t *tmpPoint = (__packed uint16_t * )tmpBuf;
X86指令集比较强大,可以多次从内存取数据对齐,精简指令集的CPU都不支持这种不对齐的访问。具体看keil帮助里面的arm指令集的LDR指令的说明。

使用特权

评论回复
16
antusheng| | 2018-7-25 21:16 | 只看该作者
用联合形式试试。

使用特权

评论回复
17
eydj2008| | 2018-7-27 08:20 | 只看该作者
感觉你的程序 还是溢出问题 而非 强制转换问题,最多是个诱因.

使用特权

评论回复
18
pq113_6|  楼主 | 2018-7-27 08:46 | 只看该作者
eydj2008 发表于 2018-7-27 08:20
感觉你的程序 还是溢出问题 而非 强制转换问题,最多是个诱因.

你可以试试,肯定不是溢出的问题,板凳那里版主已经说出了原因

使用特权

评论回复
19
landheart| | 2018-7-27 09:26 | 只看该作者
赞同align,   __align(8) char buffer[10];

使用特权

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

本版积分规则

36

主题

284

帖子

2

粉丝