打印

关于cmd文件的疑惑,各位兄弟指点下(玄德兄弟看看吧)

[复制链接]
2711|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiger84|  楼主 | 2010-3-24 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ni, TI, ge, TE, se
本帖最后由 tiger84 于 2010-3-24 20:52 编辑

我用的是TI的5402在做试验,MP/MC = 0,OVLY=1.
碰到如下2个CMD问题,总是找不到答案,还盼兄弟们能解惑。
1,.cinit  按照TI的说明书上说的,它是“表显示初始化全局和静态变量”,存储类型是ROM和RAM均可,最好放在PAGE0。

当CMD如下时
MEMORY  {
PAGE 0:
  RESEVE:   org   00h    len = 0x80
  PAGE 0:
  PROG1:    org = 0x0100    len = 0x1200
PAGE 0:
/* VECT段的值不能改 */
     VECT:     org = 0x0080,  len = 0x80
PAGE 1:
  RESEVE1:   org   00h   len = 0x1300   
PAGE 1:
  DARAM2:   org = 0x1300   len = 0x200
PAGE 1:
        DARAM1:   org = 0x1500   len = 0x2b00
}                  
                                                  
SECTIONS{
        .text :  >       PROG1   PAGE 0
        .cinit : >       PROG1   PAGE 0
        .switch: >       PROG1   PAGE 0
        .vectors:>       VECT    PAGE 0
        
        .const:  >       DARAM1   PAGE 1
        .bss  :  >       DARAM1   PAGE 1
        
        .stack : >       DARAM2   PAGE 1
        .system: >       DARAM2   PAGE 1
        .data :  >       DARAM2   PAGE 1      
        }
生成的MAP文件如下:
MEMORY CONFIGURATION
                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RESEVE                  00000000   00000080  00000000  RWIX
         VECT                    00000080   00000080  00000080  RWIX
         PROG1                   00000100   00001200  00000213  RWIX
PAGE  1: RESEVE1                 00000000   00001300  00000000  RWIX
         DARAM2                  00001300   00000200  00000200  RWIX
         DARAM1                  00001500   00002b00  00000027  RWIX

SECTION ALLOCATION MAP
output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.vectors   0    00000080    00000080     
                  00000080    00000080     CVECTORS.obj (.vectors)
.switch    0    00000100    00000000     UNINITIALIZED
.text      0    00000100    00000203     
                  00000100    0000004a     rts.lib : boot.obj (.text)
                  0000014a    00000052             : exit.obj (.text)
                  0000019c    00000007             : _lock.obj (.text)
                  000001a3    00000129     main.obj (.text)
                  000002cc    00000037     rts.lib : idiv.obj (.text)
.cinit     0    00000303    00000010     
                  00000303    00000009     rts.lib : exit.obj (.cinit)
                  0000030c    00000006             : _lock.obj (.cinit)
                  00000312    00000001     --HOLE-- [fill = 0]
.data      1    00001300    00000000     UNINITIALIZED
.system    1    00001300    00000000     UNINITIALIZED
.stack     1    00001300    00000200     UNINITIALIZED
.const     1    00001500    00000000     UNINITIALIZED
.bss       1    00001500    00000027     UNINITIALIZED
                  00001500    00000023     rts.lib : exit.obj (.bss)
                  00001523    00000002             : _lock.obj (.bss)
                  00001525    00000002     main.obj (.bss)
这个比较好理解,我也基本上没有疑问。

为了更好理解CMD,通过MAP文件,发现PAGE0里面的PROG1只有0x213个字节,而在5402的程序空间从0x0080到0x3fff是DARAM(MP/MC=0,OVLY=1),在只有我把PAGE0里面的PROG1改成如下:(0x3fff - 0x213 + 1 = 0x3ded)
PROG1:    org = 0x3ded    len = 0x1200
生成的MAP
MEMORY CONFIGURATION
                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RESEVE                  00000000   00000080  00000000  RWIX
         VECT                    00000080   00000080  00000080  RWIX
         PROG1                   00003ded   00001200  00000213  RWIX
PAGE  1: RESEVE1                 00000000   00001300  00000000  RWIX
         DARAM2                  00001300   00000200  00000200  RWIX
         DARAM1                  00001500   00002b00  00000027  RWIX

SECTION ALLOCATION MAP
output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.vectors   0    00000080    00000080     
                  00000080    00000080     CVECTORS.obj (.vectors)
.switch    0    00003ded    00000000     UNINITIALIZED
.text      0    00003ded    00000203     
                  00003ded    0000004a     rts.lib : boot.obj (.text)
                  00003e37    00000052             : exit.obj (.text)
                  00003e89    00000007             : _lock.obj (.text)
                  00003e90    00000129     main.obj (.text)
                  00003fb9    00000037     rts.lib : idiv.obj (.text)
.cinit     0    00003ff0    00000010     
                  00003ff0    00000009     rts.lib : exit.obj (.cinit)
                  00003ff9    00000006             : _lock.obj (.cinit)
                  00003fff    00000001     --HOLE-- [fill = 0]
.data      1    00001300    00000000     UNINITIALIZED
.system    1    00001300    00000000     UNINITIALIZED
.stack     1    00001300    00000200     UNINITIALIZED
.const     1    00001500    00000000     UNINITIALIZED
.bss       1    00001500    00000027     UNINITIALIZED
                  00001500    00000023     rts.lib : exit.obj (.bss)
                  00001523    00000002             : _lock.obj (.bss)
                  00001525    00000002     main.obj (.bss)


这样也挺好理解的。

抱着随便试一试的心理,
我又改了下
PROG1:    org = 0x3dee    len = 0x1200
理论上来说,应该会出现问题。
没想到,我一编译,没问题,load ,运行,竟然也可以,看下MAP文件
MEMORY CONFIGURATION
                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RESEVE                  00000000   00000080  00000000  RWIX
         VECT                    00000080   00000080  00000080  RWIX
         PROG1                   00003dee   00001200  00000213  RWIX
PAGE  1: RESEVE1                 00000000   00001300  00000000  RWIX
         DARAM2                  00001300   00000200  00000200  RWIX
         DARAM1                  00001500   00002b00  00000027  RWIX

SECTION ALLOCATION MAP
output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.vectors   0    00000080    00000080     
                  00000080    00000080     CVECTORS.obj (.vectors)
.switch    0    00003dee    00000000     UNINITIALIZED
.text      0    00003dee    00000203     
                  00003dee    0000004a     rts.lib : boot.obj (.text)
                  00003e38    00000052             : exit.obj (.text)
                  00003e8a    00000007             : _lock.obj (.text)
                  00003e91    00000129     main.obj (.text)
                  00003fba    00000037     rts.lib : idiv.obj (.text)
.cinit     0    00003ff1    00000010     
                  00003ff1    00000009     rts.lib : exit.obj (.cinit)
                  00003ffa    00000006             : _lock.obj (.cinit)
                  00004000    00000001     --HOLE-- [fill = 0]
.data      1    00001300    00000000     UNINITIALIZED
.system    1    00001300    00000000     UNINITIALIZED
.stack     1    00001300    00000200     UNINITIALIZED
.const     1    00001500    00000000     UNINITIALIZED
.bss       1    00001500    00000027     UNINITIALIZED
                  00001500    00000023     rts.lib : exit.obj (.bss)
                  00001523    00000002             : _lock.obj (.bss)
                  00001525    00000002     main.obj (.bss)

看下这几句
.cinit     0    00003ff1    00000010     
                  00003ff1    00000009     rts.lib : exit.obj (.cinit)
                  00003ffa    00000006             : _lock.obj (.cinit)
                  00004000    00000001     --HOLE-- [fill = 0]
空间已经超过了0x3fff。
我的疑问就是在这里了,.cinit到底占用了哪里?

相关帖子

沙发
tiger84|  楼主 | 2010-3-24 09:58 | 只看该作者
对于PAGE1,我有同样的疑惑,以PAGE1里面的DARAM1 为例,查看原来的MAP文件,DARAM1只占用了0x27个字 ,而5402的数据空间里从0x80到0x3fff有16K字,于是改下CMD文件
0x3fff - 0x27 + 1 = 0x3fd9,

DARAM1:   org = 0x3fd9   len = 0x2b00
毫无疑问,应该可以正常运行。

于是我又改了下
DARAM1:   org = 0x3fda   len = 0x2b00
竟然也可以正常运行,MAP如下:
MEMORY CONFIGURATION

                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RESEVE                  00000000   00000080  00000000  RWIX
         VECT                    00000080   00000080  00000080  RWIX
         PROG1                   00000100   00001200  00000213  RWIX

PAGE  1: RESEVE1                 00000000   00001300  00000000  RWIX
         DARAM2                  00001300   00000200  00000200  RWIX
         DARAM1                  00003fda   00002b00  00000027  RWIX


SECTION ALLOCATION MAP

output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.vectors   0    00000080    00000080     
                  00000080    00000080     CVECTORS.obj (.vectors)

.switch    0    00000100    00000000     UNINITIALIZED

.text      0    00000100    00000203     
                  00000100    0000004a     rts.lib : boot.obj (.text)
                  0000014a    00000052             : exit.obj (.text)
                  0000019c    00000007             : _lock.obj (.text)
                  000001a3    00000129     main.obj (.text)
                  000002cc    00000037     rts.lib : idiv.obj (.text)

.cinit     0    00000303    00000010     
                  00000303    00000009     rts.lib : exit.obj (.cinit)
                  0000030c    00000006             : _lock.obj (.cinit)
                  00000312    00000001     --HOLE-- [fill = 0]

.data      1    00001300    00000000     UNINITIALIZED

.system    1    00001300    00000000     UNINITIALIZED

.stack     1    00001300    00000200     UNINITIALIZED

.const     1    00003fda    00000000     UNINITIALIZED

.bss       1    00003fda    00000027     UNINITIALIZED
                  00003fda    00000023     rts.lib : exit.obj (.bss)
                  00003ffd    00000002             : _lock.obj (.bss)
                  00003fff    00000002     main.obj (.bss)
看最后一行,很明显main.obj已经到了地址0x4000上,但是仍然可以运行,不解。

继续修改
DARAM1:   org = 0x3fdb   len = 0x2b00

生成MAP
MEMORY CONFIGURATION

                  name            origin    length      used    attr    fill
         ----------------------  --------  ---------  --------  ----  --------
PAGE  0: RESEVE                  00000000   00000080  00000000  RWIX
         VECT                    00000080   00000080  00000080  RWIX
         PROG1                   00000100   00001200  00000213  RWIX

PAGE  1: RESEVE1                 00000000   00001300  00000000  RWIX
         DARAM2                  00001300   00000200  00000200  RWIX
         DARAM1                  00003fdb   00002b00  00000027  RWIX


SECTION ALLOCATION MAP

output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.vectors   0    00000080    00000080     
                  00000080    00000080     CVECTORS.obj (.vectors)

.switch    0    00000100    00000000     UNINITIALIZED

.text      0    00000100    00000203     
                  00000100    0000004a     rts.lib : boot.obj (.text)
                  0000014a    00000052             : exit.obj (.text)
                  0000019c    00000007             : _lock.obj (.text)
                  000001a3    00000129     main.obj (.text)
                  000002cc    00000037     rts.lib : idiv.obj (.text)

.cinit     0    00000303    00000010     
                  00000303    00000009     rts.lib : exit.obj (.cinit)
                  0000030c    00000006             : _lock.obj (.cinit)
                  00000312    00000001     --HOLE-- [fill = 0]

.data      1    00001300    00000000     UNINITIALIZED

.system    1    00001300    00000000     UNINITIALIZED

.stack     1    00001300    00000200     UNINITIALIZED

.const     1    00003fdb    00000000     UNINITIALIZED

.bss       1    00003fdb    00000027     UNINITIALIZED
                  00003fdb    00000023     rts.lib : exit.obj (.bss)
                  00003ffe    00000002             : _lock.obj (.bss)
                  00004000    00000002     main.obj (.bss)
这次就运行不了了。

我的疑问就是main里面所占的RAM都到0x4000了,竟然也可以运行?

使用特权

评论回复
板凳
duxiaolin168| | 2010-3-24 15:01 | 只看该作者
a section of your program falls into the region that is not writable?
往5502板子上下载的时候,告诉不能load program,出错,说是上面那个错误。由于程序大于64k,所以只能将.text段放在sdram上,请楼主给点建议。

使用特权

评论回复
地板
tiger84|  楼主 | 2010-3-29 18:25 | 只看该作者
顶下,继续请教

使用特权

评论回复
5
nealfei| | 2011-9-27 12:10 | 只看该作者
怎么把MAP文件也整出来了啊,灌水啦

使用特权

评论回复
6
aresc| | 2011-9-28 20:53 | 只看该作者
为了更好理解CMD,通过MAP文件,发现PAGE0里面的PROG1只有0x213个字节,而在5402的程序空间从0x0080到0x3fff是DARAM(MP/MC=0,OVLY=1),在只有我把PAGE0里面的PROG1改成如下:(0x3fff - 0x213 + 1 = 0x3ded)
PROG1:    org = 0x3ded    len = 0x1200
生成的MAP

这样写没问题,但结合你的实际是又问题的. 既然DARAM 的空间是从0x80 ~ 0x3fff, 那
PROG1:  org = 0x3ded     len = 0x1200的范围已经超出0x3fff的边界了. 工具应该不会发现这种错误, 基本原则是CMD里的地址空间应该是和你系统实际的物理空间一致的. 这样当有超出边界, 工具会报告错误.

至于那个超出0x4000还能运行,这个有可能是确实有实际的0x4000地址空间存在,或者程序的错误不是很严重,从而程序好像还能正常运行. main.obj好像才占两个WORD, 是不是啥也没做?

使用特权

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

本版积分规则

个人签名:专注ARM及linux性能优化

101

主题

862

帖子

0

粉丝