查看: 2925|回复: 8

[求助] K60调试 内存对齐问题及解决方法

[复制链接]
  • TA的每日心情
    开心
    2017-5-9 08:12
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    34

    主题

    801

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2364
    最后登录
    2021-8-11
    发表于 2015-5-28 08:11:12 | 显示全部楼层 |阅读模式
    硬件平台:mk60dn512vll10
    调试串口通信,自己自定义通信规约,有一帧结构如下
    1. typedef struct {
    2. uint8_t SOF;
    3.         uint8_t LEN;
    4.         uint8_t CTL;
    5.         uint8_t ADDR;
    6.         uint8_t APN;

    7.         uint16_t PhaseAVolt;
    8.         uint16_t PhaseBVolt;
    9.         uint16_t PhaseCVolt;

    10.         uint8_t CS;
    11.         uint8_t ENDOF;
    12. } _DATA;
    复制代码
    帧开头 固定长度为5个字节,之后跟着一个16位2字节数据。接收串口数据的时候,再定义一个联合体如下
    1. union _RCV_UNN {
    2.         uint8_t         RcvBuf[LEN];
    3.         _DATA         Data;
    4. } Rcv;
    复制代码
    调试过程中,发现 Rcv.Data.PhaseAVolt 总是出错,与主机发送的内容,总是错着一位。这时意识到是 内存对齐 问题,特别是数据结构存储的时候。
    解决办法:
    1. 如果定义结构体的时候,固定长度不是5个字节,而是 4字节或4的倍数,中间数据全都保持4的倍数个字节或单字节,就不会出现对齐问题;
    2. 可以在编译器 工程文件 开头加入预处理命令 #pragma pack(1) // 设置变量以1字节对齐
    我知道答案 目前已有8人回答
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13127
    最后登录
    2019-1-27
    发表于 2015-5-28 09:42:40 | 显示全部楼层
    不错~ 谢谢楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-7-13 18:31
  • 签到天数: 127 天

    连续签到: 1 天

    [LV.7]常住居民III

    19

    主题

    1229

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    6124
    最后登录
    2024-12-19
    发表于 2015-5-28 10:10:28 | 显示全部楼层
    不错,谢谢分享
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-24 10:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    50

    主题

    1028

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2870
    最后登录
    1970-1-1
    发表于 2015-5-28 16:28:14 | 显示全部楼层
    这个问题在实际应用中比较普遍,多谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2015-5-28 21:03:31 | 显示全部楼层
    学习了,谢谢分享,楼主的意思是说,结构体重如果开始固定奇数个字节,需要考虑内存对齐问题?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-5-9 08:12
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    34

    主题

    801

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2364
    最后登录
    2021-8-11
     楼主| 发表于 2015-6-1 08:28:58 | 显示全部楼层
    wambob 发表于 2015-5-28 21:03
    学习了,谢谢分享,楼主的意思是说,结构体重如果开始固定奇数个字节,需要考虑内存对齐问题? ...

    是的,
    尤其是用在联合体的时候。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    18

    主题

    445

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2302
    最后登录
    2025-5-15
    发表于 2015-12-24 09:57:28 | 显示全部楼层
    还没碰到错位的情况,先记下了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-24 13:02:41 | 显示全部楼层
    学习一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2015-12-28 09:50:14 | 显示全部楼层
    基本的c/c++知识。。。 blank.png blank1.png blank2.png blank3.png blank4.png blank5.png blank6.png blank7.png blank8.png blank9.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 03:25 , Processed in 0.108060 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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