请教初级问题,变量长度与.cmd文件中length长度的关系!
本帖最后由 warcraftiii 于 2009-11-3 20:07 编辑在下初学DSP,请教个变量长度问题:
一个例子程序中定义结构体:volatile struct DEV_EMU_REGS DevEmuRegs;
//--DSP28_GlobalVarialbeDefs.c------------------------------------------
#pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile");
volatile struct DEV_EMU_REGS DevEmuRegs;
//--DSP28_DevEmu.h-------------------------------------------------------
struct DEV_EMU_REGS {
union DEVICECNF_REG DEVICECNF;
union DEVICEID_REG DEVICEID;
Uint16PROTSTART;
Uint16PROTRANGE;
Uint16 rsvd;
Uint16 M0RAMDFT;
Uint16 M1RAMDFT;
Uint16 L0RAMDFT;
Uint16 L1RAMDFT;
Uint16 H0RAMDFT;
};
union DEVICECNF_REG {
Uint32 all;
struct DEVICECNF_BITSbit;
};
//--SRAM.cmd-------------------------------------------------------
MEMORY
{....
DEV_EMU : origin = 0x000880, length = 0x000180
FLASH_REGS : origin = 0x000A80, length = 0x000060
......
SYSTEM : origin = 0x007010, length = 0x000020
SPI_A : origin = 0x007040, length = 0x000010
....}
SECTIONS
{.....
DevEmuRegsFile : > DEV_EMU, PAGE = 1
FlashRegsFile : > FLASH_REGS, PAGE = 1
......
SysCtrlRegsFile : > SYSTEM, PAGE = 1
SpiaRegsFile : > SPI_A, PAGE = 1
......}
//--voer-------------------------------------------------------
我对这个定义理解是:变量DevEmuRegs保存在起始于0x000880,长度0x000180的空间内。(384个字节)
但问题是变量 DevEmuRegs 的是DEV_EMU_REGS类型,按照定义长度应该是426个字节,换成16进制是0x1AA。分配空间不够。超出0x000180的长度。
程序是正确的,可以运行。
我不明白哪里理解错了
是计算DevEmuRegs的长度错了吗?还是理解.cmd文件定义的存储器位置错误?
该怎么理解?
Uint16 rsvd; 是404个字节长的数组吗?
在下绝对菜鸟,请指点一下啊,感谢!!
--------------------------
刚才写错了, 重新修改了! #pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile");
------------------------------
CMD中没有定义这个空间吧 刚才写错了,改过来了,惭愧!!!
这个问题对其他结构体变量也出现过,就是结构体长度大于所分配空间长度,在CMD文件中与下一段代码区重叠。程序是正确的可以运行,我不明白自己哪里理解错了? 用了sizeof()函数, sizeof(DevEmuRegsFile)在watch窗口显示214,
sizeof(DevEmuRegs.PROTSTART)=1;
看了别人的帖子,sizeof()返回的是字节数,
也就是说Uint16类型占用一个字节,
程序中定义: typedef unsigned int Uint16;
F2812的 unsigned int 表示一个字节。
迷糊了, int应该是4字节呀?
我猜应该TI有文档说明,找不到,惨~ sizeof()不是函数,是运算符 领教了, sizeof()是运算符。 CMD文件里DEV_EMU : origin = 0x000880, length = 0x000180,也即长度为384个word。但实际
struct DEV_EMU_REGS {
union DEVICECNF_REG DEVICECNF; // 2
union DEVICEID_REG DEVICEID; // 2
Uint16PROTSTART; // 1
Uint16PROTRANGE; // 1
Uint16 rsvd; // 202
Uint16 M0RAMDFT; // 1
Uint16 M1RAMDFT; // 1
Uint16 L0RAMDFT; // 1
Uint16 L1RAMDFT; // 1
Uint16 H0RAMDFT; // 1
};
实际长度应为2+2+1+1+202+1+1+1+1+1=213,对应十六进制应为D4才对呀,还有161个哪里去了?
页:
[1]