warcraftiii 发表于 2009-11-3 17:31

请教初级问题,变量长度与.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个字节长的数组吗?
在下绝对菜鸟,请指点一下啊,感谢!!


--------------------------
刚才写错了, 重新修改了!

bai071044 发表于 2009-11-3 19:48

#pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile");
------------------------------
CMD中没有定义这个空间吧

warcraftiii 发表于 2009-11-3 20:09

刚才写错了,改过来了,惭愧!!!

这个问题对其他结构体变量也出现过,就是结构体长度大于所分配空间长度,在CMD文件中与下一段代码区重叠。程序是正确的可以运行,我不明白自己哪里理解错了?

warcraftiii 发表于 2009-11-5 22:58

用了sizeof()函数, sizeof(DevEmuRegsFile)在watch窗口显示214,
sizeof(DevEmuRegs.PROTSTART)=1;

看了别人的帖子,sizeof()返回的是字节数,
也就是说Uint16类型占用一个字节,
程序中定义: typedef unsigned int   Uint16;
F2812的 unsigned int 表示一个字节。
迷糊了, int应该是4字节呀?
我猜应该TI有文档说明,找不到,惨~

踢球老越位 发表于 2009-11-6 00:03

sizeof()不是函数,是运算符

warcraftiii 发表于 2009-11-6 08:49

领教了, sizeof()是运算符。

eeamic 发表于 2015-11-8 14:56

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]
查看完整版本: 请教初级问题,变量长度与.cmd文件中length长度的关系!