硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5141|回复: 4
收起左侧

[STM32H7] 使用iar 怎么去掉警告use of address of unaligned structure member ?

[复制链接]

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
发表于 2021-3-12 21:37:36 | 显示全部楼层 |阅读模式
使用 IAR ARM 编译器怎么去掉警告use of address of unaligned structure member ??

如果使用 mdk 时是没有这个警告的,程序代码是一模一样的,只是编译器不同而已








回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2021-3-13 09:11:52 | 显示全部楼层
发个代码,我试试,用的IAR几
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2021-3-13 17:53:28 | 显示全部楼层
eric2013 发表于 2021-3-13 09:11
发个代码,我试试,用的IAR几

iar arm 使用 v8.50.9 及 v9.10.1 都试过,结果都是一样的

typedef struct _nmeaTIME
{
        int Hour,Minute,Second,ms;                //时,分,秒,毫秒
        int Year, Month, Date;                                //年,月,日
        int SecondBack;                                                                //更新GPS显示数据时,秒备份保存
        uint8_t  ConvHour;                                                //转换后的日期数据
} GPS_TimeTypeDef;


#pragma pack(1)   // 1 字节 对齐
typedef struct
{
        GPS_UART_T  GPS_Uart;
        GPS_TimeTypeDef    GPS_Time;
        SatelliteInfo satinfo[38];
       
        /* 定位有效标志, 0:未定位 1:SPS模式,定位有效 2:差分,SPS模式,定位有效 3PS模式,定位有效 */
        char isvalid;   // PositionOk
       
        uint8_t  GPS_TimeUpdateFlag;                        //rtc时间跟新标志,=0 RTC时间跟新,否则不跟新
//        uint8_t  GPS_SwitchFlag;                                //gps开关标志,=1 表示GPS功能开启,否则关闭,
                                                                                        //闹钟退出函数里面调用,菜单函数
       
       
        FP32 latitude;
        uint8_t   latNS;   
        FP32 longitude;
        uint8_t   lgtEW;
        FP32 speed;       //地面速度,GPS输出单位 节,Knots 已经转化位KM/H
        FP32 direction;   //方位角,度 ,以真北为参考

        FP32  altitude;     //海拔高度
        uint8_t    altitudeunit;       //海拔单位

        uint8_t    FixMode;     //GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
        uint8_t    GSA_mode1;//定位模式,A=自动手动2D/3D,M=手动2D/3D
        uint8_t    GSA_mode2;//定位类型,1=未定位,2=2D定位,3=3D定位

        FP32  PDOP;          //综合位置精度因子
        FP32  HDOP;          //水平精度因子
        FP32  VDOP;          //垂直精度因子
        uint32_t   ageOfDiff;//差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
        uint16_t   diffStationID;//差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

        uint8_t    usedsat[12];//正在用来解算的卫星序号
        uint8_t    usedsatnum;  //正在使用的卫星数量(00 - 12)
        uint8_t    allsatnum;  //当前可见卫星总数(00 - 12)
       
        /* VTG:地面速度信息 2019.04.30 add */
        /* 样例数据:$GPVTG,309.62,T, ,M,0.13,N,0.2,K*6E */
        uint16_t TrackDegTrue;                /* 以真北为参考基准的地面航向(000~359度,前面的0也将被传输) */
        uint16_t TrackDegMag;                /* 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输) */
        FP32     SpeedKnots;                /* 地面速率(000.0~999.9节,前面的0也将被传输) */
        FP32     SpeedKM;                        /* 地面速率(000.0~999.9节,前面的0也将被传输) */
        uint8_t  vtg_T;
        uint8_t  vtg_M;
        uint8_t  vtg_N;
        uint8_t  InterfaceFlag;   // 进入到 gps 界面标志,=0表示没有进入到gps界面,其他值则表示已进入到gps界面 2020.11.29 add
        uint8_t  HardwareInitFlag;    // 硬件初始化标志,=0表示硬件没有完成,=1表示硬件初始化完成
        uint8_t  Isvalid_OK_Flag;      // 接收到数据,=0表示没有,=1表示有 2020.11.29 add
        char   lasttime[20];

}GPS_T;
#pragma pack()  //取消对齐




void gpsGPRMC(uint8_t *_ucaBuf, uint16_t _usLen)
{
        int d,m,mm;

        char *word =0 ,*left = (char *)_ucaBuf;

        /* 字段1 UTC时间,hhmmss.sss格式 */
        //时间戳   
        word=split(left, ',',&left);
        if(word != NULL)   
        {
                        if(strncmp(g_tGPS.lasttime,word,20))   
                        {   
                                        sscanf(word,"%2d%2d%2d.%4d",&g_tGPS.GPS_Time.Hour,&g_tGPS.GPS_Time.Minute,&g_tGPS.GPS_Time.Second,&g_tGPS.GPS_Time.ms);     // 就在这个上面
                                        strncpy(g_tGPS.lasttime,word,20);   
                        }
        }

... ...
}


貌似把上面的函数改成如下就可以了
{
        int d,m,mm;
  int Hour, Minute, Second, ms;

        char *word =0 ,*left = (char *)_ucaBuf;

        /* 字段1 UTC时间,hhmmss.sss格式 */
        //时间戳   
        word=split(left, ',',&left);
        if(word != NULL)   
        {
                        if(strncmp(g_tGPS.lasttime,word,20))   
                        {   
//                                        sscanf(word,"%2d%2d%2d.%4d",&g_tGPS.GPS_Time.Hour,&g_tGPS.GPS_Time.Minute,&g_tGPS.GPS_Time.Second,&g_tGPS.GPS_Time.ms);  
        sscanf(word,"%2d%2d%2d.%4d",&Hour,&Minute,&Second,&ms);

        g_tGPS.GPS_Time.Hour   = Hour;
        g_tGPS.GPS_Time.Minute = Minute;
        g_tGPS.GPS_Time.Second = Second;
        g_tGPS.GPS_Time.ms     = ms;

                                        strncpy(g_tGPS.lasttime,word,20);   
                        }
        }

... ...
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115667
QQ
发表于 2021-3-14 07:27:51 | 显示全部楼层
hpdell 发表于 2021-3-13 17:53
iar arm 使用 v8.50.9 及 v9.10.1 都试过,结果都是一样的

typedef struct _nmeaTIME

好的。

貌似你定义的这个GPS_TimeTypeDef也要做1字节对齐。
回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
 楼主| 发表于 2021-3-14 10:13:45 | 显示全部楼层
eric2013 发表于 2021-3-14 07:27
好的。

貌似你定义的这个GPS_TimeTypeDef也要做1字节对齐。

GPS_TimeTypeDef 这个也做了1字节对齐,结果还是一样提示内存字节对齐的,改成下面的那种格式后就不再提示了,

当改成下面的那种方法后,GPS_TimeTypeDef 这个有没有1字节对齐都不会再提示了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-10 19:31 , Processed in 0.240952 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表