假如有如下代码行:

 

uchar rad[6]={0};
Read_InfNFlashSegment(Flash_InfD_BaseAddr,DGsensor_RadX_Offset,rad,6);        //读出rad的值

gSlopeBaseAngle.rad_x=*((int*)&rad[0]);        //rad_x,rad_y,rad_z是int类型的值
gSlopeBaseAngle.rad_y=*((int*)&rad[2]);
gSlopeBaseAngle.rad_z=*((int*)&rad[4]);

实际上 通过指针转化后的值gSlopeBaseAngle.rad_x并不等于rad[0]*256+rad[1](假定小端模式),而是会多出来一个异常的字符。

主要原因是因为

        uchar类型的是一字节对齐的

        int类型是2字节对齐的,如果MCU的系统字是2字节,则定义int类型可能会总是在偶地址开始

。。。所以若果uchar是定义的起始地址在基地址时,就会出错,多出来一个填充地址

解决方法:

      #pragma data_alignment=2 
  uchar rad[6]={0};

#pragma pack ()

    加上这句话后,定义rad时则会自动2字节对齐,起始地址就会在int对齐字上,通过指针访问就正常了

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐