This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教:C5416的cmd 文件中的page概念是和程序空间的page概念是一致的吗? 如何设置cmd文件使得可将.text放到SARAM的空间中?



如题,

由于我的程序.text段(0x7e00)很大,想放到SARAM中,以下是我的cmd文件,程序编译没有问题,但是在load *.out的过程中出现了以下的错误"Data verification failed at address 0x28000", ,请问下可能是什么原因导致? 我看了c5416.gel文件也对SARAM0(0x28000)的地址已经做了映射。PMST=0x00E8.

MEMORY {
PAGE 0:
PROG_RAM(RWX) : origin = 0x0080, length = 0x3F7F /* 0x80~ 0x3FFF, daram0~daram1*/
VECTORS (RWX): origin = 0xFF80, length = 0x80
PROG_SARAM0(RW): origin = 0x28000, length = 0x7fff

PAGE 1:
DATA_RAM (RW): origin = 0x4000, length = 0x3FFF /*0x4000~ 0x7fff, daram2~daram3, make sure that OVLY=1*/
DATA_EXT (RW): origin = 0x8000, length = 0x7FFF

} /* MEMORY */


SECTIONS {

.text > PROG_RAM | PROG_SARAM0 PAGE 0 /* code */
.switch > PROG_RAM PAGE 0 /* switch table info */
.cinit > PROG_RAM PAGE 0

.vectors > VECTORS PAGE 0 /* interrupt vectors */

.cio > DATA_RAM PAGE 1 /* C I/O */
.data > DATA_RAM | DATA_EXT PAGE 1 /* initialized data */
.bss > DATA_RAM | DATA_EXT PAGE 1 /* global & static variables */
.const > DATA_RAM PAGE 1 /* constant data */
.sysmem > DATA_RAM | DATA_EXT PAGE 1 /* heap */
.stack > DATA_RAM | DATA_EXT PAGE 1 /* stack */
.csldata > DATA_RAM PAGE 1
dmaSrc : align(8192) {} > DATA_EXT PAGE 1
dmaDst : align(8192) {} > DATA_EXT PAGE 1
procSrc : align(8192) {} > DATA_EXT PAGE 1

} /* SECTIONS */

  • 你好,

    改一下PMST的MP/MC位, 当MP/MC=0时, SARAM0-3映射到程序空间的0x28000, 而你设的PMST=0x00E8, 把MP/MC配成了1, 映射到外部memory, 如果你硬件上没有接外部memory的话, load程序时就会报错.

  • 谢谢,在上述基础上,修改MP/MC=0后的确可以正常加载。

    再请请教一下,那cmd当中的page概念和手册里说的程序空间分成128 page 是一个什么样的对应关系? 是否是一个概念?

    cmd中: page 0: 是程序空间,1是数据空间。那么PAGE n, n不等于0,1的话是怎么个对应关系?

    关于XPC的值理解,是否只需要通过上述的cmd文件和MP/MC=0的值,程序加载就会自动辨识是page 2,而不需要通过程序中设置XPC=2, 来决定设置到page 2?

  • cmd里面的page和program的page没有关系. cmd中的page是逻辑上的分页, 理论上C54x cmd文件支持到255 pages, 但一般在cmd文件中用page 0表示program space, 用page 1表示data space已经足够了.
     
    程序空间的page 0~127是物理上的分页, 因为内部程序地址总线只有16位, 只能访问64K, 但实际上程序, 数据很容易超过64K, 所以用XPC 7bit来外扩128个page, 每个page 64K.
  • 你好,我也遇到了相同的问题,我也是想从0x28000载入程序。并且我的PMST=0x00A8。以下是我的CMD文件。请问问题出在哪儿了?关于.gel文件中,我没有找到关于0x28000的描述。

    Test_AIC23.obj
    -m Test_AIC23.map
    -l rts.lib
    -stack 0x80

    MEMORY
    {
       PAGE 0:  VECT:    origin =  0080h, length = 0080h          
                SARAM1:  origin =  28000h, length = 8000h

       PAGE 1:  DARAM11: origin =  0100h, length = 1F00h
                DARAM12: origin =  2000h, length = 6000h
                DARAM21: origin =  8000h, length = 4000h
                DARAM22: origin =  0C000h, length = 4000h
    }          

    SECTIONS
    {  
       .vect   > VECT PAGE 0
       .text   > SARAM1 PAGE 0
       .cinit  > SARAM1 PAGE 0
       .switch > SARAM1 PAGE 0

       .data   > DARAM11 PAGE 1
       .const  > DARAM11 PAGE 1
       .bss    > DARAM11 PAGE 1
       .sysmem > DARAM11 PAGE 1
       .stack  > DARAM11 PAGE 1    

       .src    > DARAM21 PAGE 1
       .embuf  > DARAM22 PAGE 1
       .frame  > DARAM12 PAGE 1
       
    }

  • 设成PMST=0x00A8还是不能加载?

  • 可以了,可以加载程序,可是无法正常运行。。好像从c_int00没有运行到main,请问是哪儿出错了?

  • 你好,

    我随便写了一个很简单的程序:

    #include <stdio.h>
    #include "cpu_reg.h"
    
    //#pragma CODE_SECTION(main,".text")
    void delay()
    {
        int i;
        for (i = 0; i < 1000; i++);
    }
    
    void main()
    {    
         asm("  STM #0000h,CLKMD ");  
         while(*CLKMD & 0x01 );
         asm("  STM #40C7h,CLKMD ");  //设置CPU运行频率=100M
         asm("  stm   #4240h, SWWSR ");
         //2 wait except for on-chip program 1
         asm("  stm   #0FFA0h, PMST  "); //MP/MC = 0, IPTR = 001,ovly=0  
         asm("  stm   #0802h, BSCR  ");
         asm("  SSBX  INTM ");      /*禁止中断*/
    //////////////////////////////////////////////////////////////
         printf("123\n");
    }

    以下是CMD文件:

    -heap 400
    -stack 400
    MEMORY  {
        PAGE 0:
            RESEVE:   org   00h    len = 0x80
         PAGE 0:
            PROG1:    org = 0x28000    len = 0x4000
        PAGE 0:
            VECT:     org = 0x0FF80,  len = 0x80
    
        PAGE 1:
            RESEVE1:   org   00h   len = 0x1300             
        PAGE 1:
            DARAM2:   org = 0x1300   len = 0x400
        PAGE 1:
            DARAM1:   org = 0x1700   len = 0x2900
    
        
    }                  
    
    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
            .cio   :>        DARAM1   PAGE 1
            
            .stack : >       DARAM2   PAGE 1
            .system: >       DARAM2   PAGE 1
            .data :  >       DARAM2   PAGE 1
                        
            }

    调用了rts.lib。并且在gel文件中设置了PMST=0xFFA8。

    编译成功,加载成功,可是运行之后却不知道运行了什么内容。我单步汇编调试过,发现可以进入main,并且看到相应的寄存器的改变,可是无法输出123,程序也无法停止。PC会继续增加。请问问题出在哪儿了?谢谢!