打印

请教F2812 cmd文件中一个初级问题

[复制链接]
5513|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinyancode|  楼主 | 2008-11-18 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教F2812 cmd文件中一个初级问题


我初学F2812, 在cmd文件上遇到一个问题


SECTIONS
{
   
   .reset   : > RESET,   PAGE=0    /*TYPE=DSECT  */
    vectors : > VECTORS, PAGE=0
   .pinit   : > PRAM,    PAGE = 0
   .cinit   : > PRAM,    PAGE = 0
   .text    : > PRAM,    PAGE = 0
...

在.reset   : > RESET,   PAGE=0    /*TYPE=DSECT  */
这一句后面如果有TYPE=DSECT这一句的话,程序能load,并可以运行,(仿真器下)

但若没有这一句,就出现

Data verification failed at addredd 0x3FFFC0,
Please verify target memory and memory map.


这样的错误。


我看了一下这两种情况下的map文件。关于

.reset     0    003fffc0    00000002     DSECT
         003fffc0    00000002     rts2800.lib : boot.obj (.reset)
                  
前后两种情况也没有大的区别,就是 DSECT这个词有,或 没有的区别。                 
                  
                  
我就是想问问这个DSECT到底起什么作用?

谢谢!

相关帖子

沙发
玄德| | 2008-11-18 22:19 | 只看该作者

这样写是“定式”。

看汇编语言工具文档,标明为DSECT的语句,是伪操作,在out文件中不产生任何结果。
个人理解:
1、在2812芯片中,并不存在0x3FFFC0这个物理存储器,这个地址只是一个虚拟的空间,一个概念。所以,你不能往这个空间分配数据。但为了某种需要,比如结构体系的完整,在CMD文件中还要写上这么一笔。
2、把这句话整个删掉,会怎么样?我没有试验过,但估计也没有问题。
3、这是2812的CMD文件的定式,照着做,脑子里留个记号即可,不必深究。真要深究,直接去问TI。

使用特权

评论回复
板凳
xinyancode|  楼主 | 2008-11-19 21:50 | 只看该作者

感谢玄德

非常感谢! 又是“玄德”兄给了最关键的帮助,而且也没有给我留下Email地址,而且我还在本板块专门写了一个帖子找您。


这让我想起小时候就爱看的名著《神秘岛》,法-凡尔纳,smith工程师一行5人在无名荒岛上总是受到有着巨大力量的神秘人的帮助,却总是不能找到他...


我越来越想知道“玄德”其人了。

使用特权

评论回复
地板
xinyancode|  楼主 | 2008-11-20 00:28 | 只看该作者

再与玄德兄讨论

再想与玄德兄讨论一下:

关于。reset的用法我已经记住了。


另外,玄德兄提到:“在2812芯片中,并不存在0x3FFFC0这个物理存储器,这个地址只是一个虚拟的空间,一个概念。”但是我看了一下2812的datasheet,觉得0x3FFFC0这个地址单元不是实际存在的吗?图上标的是BROM Vector.地址再0x3FFFC0~0XFFFFFF.我觉得应该是实实在在存在的物理存储器单元。

不知我理解的对不对?



另外,针对“2、把这句话整个删掉,会怎么样?我没有试验过,但估计也没有问题。”这个问题,我已经试过了。若把reset这一行全部注释掉,同样也是出现
Data verification failed at addredd 0x3FFFC0,
Please verify target memory and memory map.
这样的错误提示,程序没法load进去。





使用特权

评论回复
5
hotpower| | 2008-11-20 03:58 | 只看该作者

听课~~~

使用特权

评论回复
6
玄德| | 2008-11-20 18:04 | 只看该作者

。。。

关于第2项,我刚试验过,用仿真器运行,没有烧写,过程如下:
删掉这一句,的确出现你描述的情况。我就想,可能是因为在MEMORY区域对0x3FFFC0地址做过定义的缘故,索性也关掉MEMORY区域里0x3FFFC0的定义;结果又出现新的问题....就这样,先后把MEMORY区域的PSW、FLASH定义都删除以后,编译通过了,而且下载、运行正常。下面是我用的CMD文件:

MEMORY
{
PAGE 0:

/*   RESET:    org = 0x3FFFC0 ,    length = 0x000002   */
     BEGIN:    org = 0x3F8000 ,    length = 0x000002
/*   FLASH:    org = 0x3D8000 ,    length = 0x01FFF8   */
/*   PSW:       org = 0x3F7FF8 ,    length = 0x000008   */

     PRAM    :    org = 0x080000 ,     length = 0x030000

PAGE 1:

    M0M1:    org = 0x000040 ,    length = 0x0007C0
    L0L1:    org = 0x008000 ,    length = 0x002000
    H0:    org = 0x3F8002 ,    length = 0x001FFE

    ExtSRAM:    org = 0x0B0000 ,    length = 0x010000
}

SECTIONS
{
/*    .reset   :  > RESET,   PAGE 0,   TYPE = DSECT       */
    codestart    :  > BEGIN,   PAGE 0
    ramfuncs    :  > PRAM    ,    PAGE 0
    .cinit    :  > PRAM    ,    PAGE 0
    .text    :  > PRAM    ,    PAGE 0

    .stack    :  > M0M1,    PAGE 1
    .ebss    :  > L0L1,    PAGE 1
    .switch    :  > L0L1,    PAGE 1
    .econst    :  > H0,         PAGE 1
    .extdata    :  > ExtSRAM, PAGE 1
}

2812上电后,首先要根据几个IO口的电平来决定下一步跳转到哪里,即所谓boot。这个动作,完全可以用硬件逻辑电路实现,直接跳到目的地去,我相信论坛里的很多人都可以用硬件语言编出这样的逻辑。如果搞个实体的存储器,实现boot的过程肯定很麻烦(自己想想看),而且毫无意义,再者,里面写什么数据呢?所以我说,它只是一个虚拟的空间,一个概念,一种映射。

DSP的开发,在进入用户的程序之前,需要做很多预备工作,比如引导过程,比如_cint00函数,CCS和TI公司在替我们做。这个过程很不透明,资料少,难理解。这恰恰是DSP开发的难点。ARM也有这样的情况。话又说回来,即使没有全部搞清楚,也未必就妨碍项目开发。

我的邮箱:  2001LHL@21CN.COM


使用特权

评论回复
7
zoupeng139| | 2010-9-10 14:23 | 只看该作者
xuexie

使用特权

评论回复
8
huangxz| | 2010-10-13 10:31 | 只看该作者
说的很详细,谢谢,只是不知道哪篇文档详细介绍这个内容的。

使用特权

评论回复
9
raoxianbin| | 2014-1-23 16:21 | 只看该作者
mark

使用特权

评论回复
10
yuanjiejun| | 2014-1-27 13:15 | 只看该作者
玄德真是好老师!

使用特权

评论回复
11
raoxianbin| | 2014-2-15 18:22 | 只看该作者
mark

使用特权

评论回复
12
zhangmangui| | 2014-2-15 22:35 | 只看该作者
玄德 发表于 2008-11-20 18:04
关于第2项,我刚试验过,用仿真器运行,没有烧写,过程如下:删掉这一句,的确出现你描述的情况。我就想, ...

玄德您好  网友对您很肯定  还望多多帮忙   解决网友的问题  非常感谢

使用特权

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

本版积分规则

85

主题

147

帖子

0

粉丝