嵌入式开发者社区
标题: 关于字节对齐的Union和结构体内变量赋值的问题 [打印本页]
作者: 西工大老南瓜 时间: 2017-7-12 20:54
标题: 关于字节对齐的Union和结构体内变量赋值的问题
[attach]2543[/attach]
图中,第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中和右侧的内存地址中都可看出)。
现在换一种方法,结果参见下图。
[attach]2544[/attach]
图中,第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]四句话对应的汇编码,如下图所示。
[attach]2545[/attach]
图中可以看出,四句话对应的汇编码不一样,g_YCFrame.umFrame82.str_Frame_82.lon[3]的汇编码与前三个不同,无法直接赋值。为什么这样赋值不对?
运行环境:CCS5.5;平台:C6748;变量定义在DDR2RAM中;CMD文件如下图所示。
[attach]2546[/attach]
现在这个问题如果把cmd文件定义成下面这样:
[attach]2547[/attach]
就是把“.text”段定义到L2RAM中,就可以实现正常赋值了,放在DDR2中就不行。是DDR2内存不支持单字节对齐吗?还有现在代码段共计240KB,很快就超过L2RAM的256KB上限了,超过以后怎么办?另外现在程序处于下载器调试状态,以后在烧写时text应该是放在flash中,如果加载到L2中,那还是会有同样的问题。这个问题怎么解决啊?
其实我就是想用union中套U8数组和单字节对齐结构体的方式实现通信协议的组帧和解帧。
作者: Lewis 时间: 2017-7-14 11:26
DDR2内存没有字节对齐的问题,一般定义的变量都是可以赋值的,这个应该是程序的问题,你的这个结构体是怎么定义的呢
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |