图中,第1666行,g_YCFrame.umFrame82.str_Frame_82.lon[3]是个字节型、长度为4的数组最后一个变量,地址是0xC00553EB(在Expression中),采用直接赋值的方式改变g_YCFrame.umFrame82.str_Frame_82.lon[3]的值,想赋值成0xAA。单步过后,可以看出g_YCFrame.umFrame82.str_Frame_82.lon[3]还是0(在Expression中和右侧的内存地址中都可看出)。 现在换一种方法,结果参见下图。 图中,第1670行,定义一个Uchar的指针*p,将指针赋值到g_YCFrame.umFrame82.str_Frame_82.lon[3]的地址,就是0xC00553EB(从Expression可以看出)。然后通过地址指针的方式写入数据,就是可以的。从Expression和右侧的内存地址中都可以看出,g_YCFrame.umFrame82.str_Frame_82.lon[3]被成功改写成0xBB。 关于这个问题,我们对应看了一下g_YCFrame.umFrame82.str_Frame_82.lon[0~3]四句话对应的汇编码,如下图所示。 图中可以看出,四句话对应的汇编码不一样,g_YCFrame.umFrame82.str_Frame_82.lon[3]的汇编码与前三个不同,无法直接赋值。为什么这样赋值不对? 运行环境:CCS5.5;平台:C6748;变量定义在DDR2RAM中;CMD文件如下图所示。 现在这个问题如果把cmd文件定义成下面这样: 就是把“.text”段定义到L2RAM中,就可以实现正常赋值了,放在DDR2中就不行。是DDR2内存不支持单字节对齐吗?还有现在代码段共计240KB,很快就超过L2RAM的256KB上限了,超过以后怎么办?另外现在程序处于下载器调试状态,以后在烧写时text应该是放在flash中,如果加载到L2中,那还是会有同样的问题。这个问题怎么解决啊? 其实我就是想用union中套U8数组和单字节对齐结构体的方式实现通信协议的组帧和解帧。
|