打印
[STM32F1]

STM32F103 结构体指针问题

[复制链接]
1080|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
结构体如下:
__packed struct AD9362_TypeDef  //
{
        uint8_t                 id_no;
        //uint8_t                 id_no1;
        uint32_t    data_t[8];               
        bool                          bbdc_track_en;  ////
        bool                          quad_track_en; /////
        uint32_t                bist_tone_level_dB;
        uint32_t                bist_tone_mask;

} ;
单字节对齐,当结构体中间数组是data_t[7];        时运行正常,如下图:

当结构体中间数组是data_t[8];        时运行不正常,函数形参结构体指针自动改变,如下图:

网上查说字节对齐问题,我改为4字节对齐
__align(4) struct AD9362_TypeDef  //
{
        uint8_t                 id_no;
        //uint8_t                 id_no1;
        uint32_t            data_t[30];               
        bool                          bbdc_track_en;  ////
        bool                          quad_track_en; /////
        uint32_t                bist_tone_level_dB;
        uint32_t                bist_tone_mask;

} ;
中间数组为 data_t[8];时确实没问题,但是数组改为 data_t[30];或者以上时,同样会出现地址改变的情况。


哪位大神遇到过,求解决办法

使用特权

评论回复
沙发
mmuuss586| | 2019-4-4 17:25 | 只看该作者

使用特权

评论回复
板凳
airwill| | 2019-4-6 09:44 | 只看该作者
这是编译器的问题,  为了快速的内存访问, 编译器会增加无效字节使变量内存对齐. 所以数组改为 data_t[30] 会导致插入字节而地址错误
__packed 可以避免这个编译器的增加操作, 但是导致的 内存不对齐可能引起运行错误.

使用特权

评论回复
地板
fuluoce|  楼主 | 2019-4-10 11:43 | 只看该作者
airwill 发表于 2019-4-6 09:44
这是编译器的问题,  为了快速的内存访问, 编译器会增加无效字节使变量内存对齐. 所以数组改为 data_t[30]  ...

那该怎么解决这个问题呢?

使用特权

评论回复
5
john_lee| | 2019-4-10 13:23 | 只看该作者
都正常啊,你好好理解一下0x800043A的指令。

使用特权

评论回复
6
buffered| | 2019-4-10 16:19 | 只看该作者
一起学习下,我也弄不太懂地址对齐的问题

使用特权

评论回复
7
airwill| | 2019-4-10 16:30 | 只看该作者
fuluoce 发表于 2019-4-10 11:43
那该怎么解决这个问题呢?

用对齐的方式定义结构体里的成员。

使用特权

评论回复
8
磨砂| | 2019-5-5 12:56 | 只看该作者
不用管它是不是就可以?

使用特权

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

本版积分规则

4

主题

32

帖子

0

粉丝