打印

请教初级问题,变量长度与.cmd文件中length长度的关系!

[复制链接]
4146|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
warcraftiii|  楼主 | 2009-11-3 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;   
   Uint16  PROTSTART;
   Uint16  PROTRANGE;
   Uint16 rsvd[202];
   Uint16 M0RAMDFT;
   Uint16 M1RAMDFT;
   Uint16 L0RAMDFT;
   Uint16 L1RAMDFT;
   Uint16 H0RAMDFT;
};
union DEVICECNF_REG {
   Uint32                all;
   struct DEVICECNF_BITS  bit;
};
//--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[202]; 是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有文档说明,找不到,惨~

使用特权

评论回复
5
踢球老越位| | 2009-11-6 00:03 | 只看该作者
sizeof()不是函数,是运算符

使用特权

评论回复
6
warcraftiii|  楼主 | 2009-11-6 08:49 | 只看该作者
领教了, sizeof()是运算符。

使用特权

评论回复
7
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
   Uint16  PROTSTART;                    // 1
   Uint16  PROTRANGE;                    // 1
   Uint16 rsvd[202];                         // 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个哪里去了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

56

帖子

1

粉丝