删除重新发帖

2019-07-20 02:46发布

本帖最后由 fuluoce 于 2019-4-4 16:20 编辑

结构体如下:
__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];        时运行正常,如下图:
am8图片20190404151742456.png
当结构体中间数组是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];或者以上时,同样会出现地址改变的情况。


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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
fuluoce
1楼-- · 2019-07-20 08:03
 精彩回答 2  元偷偷看……
翼行园子
2楼-- · 2019-07-20 09:15
 精彩回答 2  元偷偷看……
edmund1234
3楼-- · 2019-07-20 11:06
__packed 是告知编译器, 对齐的事不用它管
你让编译器不要管, 而你的结构体又没处理对齐的事

__packed struct AD9362_TypeDef  //
{
        uint8_t                 id_no;                       <<----这个地址%4 == 0
        //uint8_t                 id_no1;
        uint32_t    data_t[8];                             <<----这个地址%4 == 1, 但它是uint32_t,必须符合地址%4 == 0这一条件
        bool                          bbdc_track_en;  ////
        bool                          quad_track_en; /////
        uint32_t                bist_tone_level_dB;
        uint32_t                bist_tone_mask;

} ;

要不你就把 uint8_t   id_no;  改为uint32_t, 要不就把这一句放到结构体的最后面
edmund1234
4楼-- · 2019-07-20 11:51
又或者你把__packed删了, 让编译器帮你重新搬到位置, 保证没有对齐的问题

一周热门 更多>