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.

C5509a通过HPI接口下载程序的问题,求教!!



通过HPI接口下载程序到5509a中时,遇到比较奇怪的问题,希望大家看看,我的步骤是不是有什么地方不对的?

项目中CPU和c5509a之间是16位的HPI接口

下载程序的过程基本上是按照SPRA375F的顺序来做的:

1.将5509a芯片复位;

2.检测到5509a的IO4管脚产生下降沿;

3.然后开始通过HPI接口将bin文件写入到HPI接口可以操作的DRAM中,SPRA375F上推荐从0x100这个地址开始烧写程序。我的bin文件很小大概只有2k左右(只是用来闪灯,以便测试c5509a bootloader是否成功),也是从0x100这个地址往里面写。这里有个问题想问下,c5509a的DRAM存放数据是否是小端模式,假设我的bootloader只有4个字节{0x1,0x2,0x3,0x4},那么写入到DRAM中的格式是0x0201,0x0403(高字节在前,低字节在后)。

4.将上面的文件写入到DRAM中后,我又重新将代码从DRAM中读出,与我写入的进行比较,确定没有烧写错。

5. SPRA375F上介绍是向0x60,0x61这两个地址中写入程序开始运行的地址,我是从0x100这个地址开始烧写的,因此0x61这个地址内我写入了0x200(PDF上是说将字地址转换成字节地址,因此这里写了0x200),然后再往0x60中写入0xa500。其中0xa5是告诉5509a,可以运行烧写的程序了。

问题出现了,上述过程完成了,我的程序并没有运行起来(因为我是通过闪灯来验证的),

我的bin文件是将产生的.out文件通过hex55.exe来生成.bin文件的,命令代码如下:

hex55.exe -boot -v5510:2 -memwidth 8 -romwidth 16 -map LED.mxp LED.out -e start -b -o LED.bin

其中LED.out是输入文件,LED.bin是得到的输出文件,也就是我上面烧写到DSP中的文件。

这里有个问题请教下,使用HPI接口烧入的bin文件,在由.out文件得到的过程中是不是有什么限制呢,例如说不能写某些寄存器等等。

我是一名新手,还希望论坛里的高手能够指点一下!万分感谢!

 

 

  • 这里追加提问一下,SPRA375F中是说通过hpi接口来下载程序是不需要boot table的,那么生成bin文件中的

    hex55.exe -boot -v5510:2 -memwidth 8 -romwidth 16 -map LED.mxp LED.out -e start -b -o LED.bin 这条命令是不是正确的呢,因为这个也是按照PDF资料上写的,此外,我查看了生成的mxp文件,我明明指定了rom宽度是16,为什么mxp文件中

    00000000..00ffffff  Page=0  Memory Width=8  ROM Width=8

    还是指定ROM Width是8呢!

    ********************************************************************************
    TMS320C55x COFF/Hex Converter                                       Version 2.56
    ********************************************************************************

    INPUT FILE NAME: <LED.out>
    OUTPUT FORMAT:   Binary

    PHYSICAL MEMORY PARAMETERS
       Default data width   :   8
       Default memory width :   8
       Default output width :   8

    BOOT LOADER PARAMETERS
       Table Address:   0x00000000, PAGE 0
       Entry Point:    0x00008100  (start)


    OUTPUT TRANSLATION MAP
    --------------------------------------------------------------------------------
    00000000..00ffffff  Page=0  Memory Width=8  ROM Width=8
    --------------------------------------------------------------------------------
       OUTPUT FILES: LED.bin [b0..b7]

       CONTENTS: 00000000..000006c1   BOOT TABLE
                                .text : dest=00008100  size=0000056c  width=00000001x
                               .cinit : dest=00008af4  size=00000032  width=00000001x

    --------------------------------------------------------------------------------
    00000000..00ffffff  Page=1  Memory Width=8  ROM Width=8  "*DEFAULT PAGE 1*"
    --------------------------------------------------------------------------------
       NO CONTENTS

     

  • 还有就是程序入口我在0x60,0x61中写的是0x200,为什么mxp文件中写的是:

     Entry Point:    0x00008100  (start)

    呢?

    希望能有人回复我的帖子,十分感谢!

  • 1. bootloader只有4个字节{0x1,0x2,0x3,0x4},那么写入到DRAM中的格式是0x0102,0x0304, 程序空间是按照字节字节寻址的, 程序空间的存放格式可以参考下面的文档第105页.
    http://www.ti.com/lit/ug/spru371f/spru371f.pdf

    2. 0x60应该写0000, 0x61应该写0x0200

    3. mxp文件中memwidth是8不是16, 是-b选项强制8bit memwidth.

    4. 你现在的程序入口地址是0x00008100, 如果你把程序入口地址设为0x100, 那么你在cmd文件中要强制定义-e 0x100.

    你用仿真器跟一下程序, 看程序是一直在0x60, 0x61里还是已经跳到你的程序入口地址开始执行程序了?

  • 感谢Shine Zhang的回复,我将程序作了一下修改,首先是字节顺序,已经改成Shine Zhang给出的模式,

    cmd命令我也改为了-e 0x100,

    0x60这块,不论是0x0000,还是0xa500(高8位非0),我都试过了,程序还是没有办法顺利跑起来,

    我想请教下Shine Zhang,bootloader过程如何才能仿真呢,不是只有在程序运行时才能仿真嘛?断点如何设置呢?我看bootloader上说仿真

    此外-b 这个选项应该是要保留的嘛?

  • 把仿真器连上,选择debug->Reset CPU。查看PC寄存器地址应该在0xff8000,这是bootloader源代码在ROM中的位置,选择file->load symbols->load symbols only,然后选择out文件,这样只载入符号定义,便于调试,然后单步执行(F11),就可以跟踪整个boot过程,或者在判断0x60处不为0的代码处设置一个硬件断点, 执行F5, 当Host加载完毕并往0x60处写0x0200后, 程序应该停在断点处, 接着再一步步单步跟踪看有没有跳到程序入口地址处.

    如果你用binary格式, 要用-b选项. 其实c55x hex conversion utlity中的-b这个选项官方并没有正式release, 所以你可以先试试-a ASCII格式, 成功了, 再试回-b.

  • 今天按照 Shine Zhang  上面给出的boot方法测试了一下,确实可以对bootloader过程进行调试:

    FF8000 ec314e000090             AMAR *(#00090h),XSP
    ......
    FF80FF 0603be                   B #0xff84c0//发现0x60不为0后进运行到这条跳转代码

    FF84C0 4683                     BSET ST1_SXMD  //从上面跳转到这里来了
    FF84C2 f55100103401             OR #16,port(#03401h)
    FF84C8 9103   

    然后从上面单步调试可以进入到0x200这个地址,但是进入到0x200后又出现了一个奇怪的问题,程序会死在0x20c这个地方,无法再往前进了。

    000200          __text, .text, _c_int00:
    000200 000002                   RPTCC #2, AC0 == #0
    000203 000000                   RPTCC #0, AC0 == #0
    000206 000000                   RPTCC #0, AC0 == #0
    000209 000570                   RPTCC #112, T1 == #0
    00020C 000002                   RPTCC #2, AC0 == #0
    00020F 00ec31                   RPTCC #49,
    000212 4e00_05acec              AADD #0,SP || BCC #0x000203,AR4 < #0
    000217 315e                     MIN T1,AR6
    000219 0004b2                   RPTCC #178, T0 == #0

    我将上面几个几条代码和我生成的2进制代码进行了比较确实是一样的。但是感觉好像这段开始几条代码是不是没有对齐,特别是这两条

    00020F 00ec31                   RPTCC #49,
    000212 4e00_05acec              AADD #0,SP || BCC #0x000203,AR4 < #0

    参考bootloader中的代码:FF8000    ec314e000090             AMAR *(#00090h),XSP

    ec314e0005ac这才一条命令才对,而bin文件中的两条指令看起来非常奇怪,还希望有人可以在帮忙解答下。

    我生成bin文件的命令就是我前面贴出来的那条,后来我又试着将cmd中-boot改成-bootorg,结果生成的bin文件如下,然后我又尝试着单步运行,结果程序

    000200 ec314e0005ac             AMAR *(#005ach),XSP
    000206 ec315e0004b2             AMAR *(#004b2h),XSSP
    00020C f406f91f_98              AND #63775,mmap(@ST1_55)
    000211 f5064100_98              OR #16640,mmap(@ST1_55)
    000216 f496fa00_98              AND #64000,mmap(@ST2_55)
    00021B f5968000_98              OR #32768,mmap(@ST2_55)
    000220 4656                     BCLR ST3_SATA
    000222 4617                     BSET ST3_SMUL
    000224 160000                   MOV #0,DPH
    000227 160001                   MOV #0,MDP05
    00022A 160002                   MOV #0,MDP67
    00022D 6c000348                 CALL _auto_init
    000231 6c00030c                 CALL _args_main
    000235 3c19                     MOV #1,AR1
    000237 6c00023b                 CALL exit

    然后我又尝试着单步运行,结果程序又在auto_init中的00x378死掉了,程序进入到0x378后,pc就不会在发生改变,一直是0x378这个值。

    000348          _auto_init:
    000348 4eff                     AADD #-1,SP
    00034A ec318e0005fc             AMAR *(#005fch),XAR0
    000350 368f                     NOT AR0,AR7
    000352 040f29                   BCC #0x00037e,AR7 == #0
    000355 aa03                     MOV *AR0+,AR2
    000357 040a24                   BCC #0x00037e,AR2 == #0
    00035A f9038808_431a            MOV uns(*AR0+) << #8,AC0 || SUB #1,AR2
    000360 df0315_53ac              MOV uns(*AR0+),AC1 || MOV AR2,CSR
    000365 101138                   OR AC1 << #-8, AC0
    000368 18ff11                   AND #255,AC1,AC1
    00036B 900e                     MOV AC0,XAR6
    00036D 6391                     BCC #0x000376,AC1 != #0
    00036F 4800                     RPT CSR
    000371 800714                   MOV *AR0+,*AR6+
    000374 4a5f                     B #0x000355
    000376 4800                     RPT CSR
    000378 800714_9a                MOV *AR0+,port(*AR6+)

    我感觉bootloader过程应该是通过了,应该是bin文件生成出现了问题,我生成bin的命令完全是按照pdf上的说明来写的,实在搞不清楚,到底是哪里出问题了。还请高手指点下!

     

     

     

  • 我把dsp工程的配置文件贴出来,让大家看看,是不是我的配置文件有什么问题呢:

    -w
    -stack 500
    -sysstack 500
    -l rts55x.lib

    MEMORY
    {
        DARAM: o=0x200, l=0x6f00
        VECT :  o=0x8000, l=0x100
        DARAM2: o=0x8100, l=0x7f00
        SARAM:  o=0x10000, l=0x30000
        SDRAM: o=0x40000, l=0x3e0000
    }

    SECTIONS
    {
        .text:    {} > DARAM
        .vectors: {} > VECT
        .trcinit: {} > DARAM
        .gblinit: {} > DARAM
         frt:     {} > DARAM
       
        .cinit:   {} > DARAM
        .pinit:   {} > DARAM
        .sysinit: {} > DARAM
        .bss:     {} > DARAM
        .far:     {} > DARAM
        .const:   {} > DARAM
        .switch:  {} > DARAM
        .sysmem:  {} > DARAM
        .cio:     {} > DARAM
        .MEM$obj: {} > DARAM
        .sysheap: {} > DARAM
        .sysstack {} > DARAM
        .stack:   {} > DARAM
       
    }

     


     

  • 我也尝试用过ASCLL文件down到dsp中,结果0x200的那条命令就让我的ccs直接挂了,所以没有再试了。

  • bin文件正确加载了, 但0x200处开始的代码跟你的代码一样吗?

    用ASCII格式时, memwidth, romwidth选择16, ASCII文件第一行是地址信息, 不用加载. ASCII格式加载后, 0x200开始的代码是你的代码吗?

    另外, 在compiler编译选项中不要用-cr选项, 只能用-c(Run-Time Autoinitialization)或者省略.

  • 谢谢shine zhang的回复。

    从0x200开始的代码和我自己的bin代码确实是一样的,我已经一个字节一个字节比对过了

    2进制文件bin文件的第一行也是地址信息吗不用加载的嘛?我怎么感觉2进制文件的第一行也像是地址信息,呵呵

    ,另外想问下,第一行是指前面几个?是指前面16个字节吗,用UltraEdit打开2进制文件的第一行吗?

    我今天还做了个测试,我先用CC3给5509a装载了代码,也就是.out文件,CC3全速运行时,程序是能正常工作的,运行几秒后,将仿真器停下来,但是5509a并没有断电,然后我再通过主机给5509a再加载一次程序,也就是加载前面的bin文件,神奇的是,这个时候程序就能够正常运行了,然后我将5509a断电,然后在重新上电,直接用主机给5509a下载程序,5509a又不能正常工作了。弄得我糊涂!

     

  • shine zhang,你好,我在您的另一个回复的帖子中(也是关于5509A bootloader的问题),看到您的回答是:

    看看gel文件中的初始化设置有没有搬到应用程序中.

    使用boot方式, 可以用jtag追踪程序运行到哪里出错

     

    而且这个回复,对方给了正确答案的评价,我想问下的是,如何查看gel文件中的初始化设置是否搬到应用程序中呢 ?

  • 问题,终于搞定了,呵呵,果真是C 编译器选项的问题,必须选择 NO  那个选项,程序才能正常的跑起来!

  • 恭喜啊, 谢谢分享!

    使用了-cr这个编译选项,这样在CCS load程序时会自动把.cinit段的数据复制到.bss段,但是当脱机运行时,就不能选-cr,而是需要选-c或省略。具体可以参考下面的FAQ。
    http://www-k.ext.ti.com/sc/technical-support/knowledgebase.asp?kb=dsp&obj=5511

  • 今天又做了下测试,情况和shine zhang 说的真好相反,使用-cr选项时或者省略时,程序能够正常运行,而采用-c这个选项,程序反而不能正常运行。

    看了下-cr的介绍,还是不得其解!

  • 你只是在build option中定义的吧? 有没有也在cmd文件中也定义了? 两者一致么?

    如果你用-cr RAM model--Initialization of Variables at Load Time, 你的host有没有把.cinit段复制给相应的全局变量. 具体关于-cr, -c怎么处理.cinit段, 你可以看一下下面的文档第145页.
    http://www.ti.com/lit/ug/spru281g/spru281g.pdf

  • 是的,我只是在build option中定义的,在CMD中如何添加呢?

  • build option和cmd文件只要定义一个就可以了, 如果两个都定义, 就要一样.

    cmd文件中, 用-cr, -c定义

     

  • 你好,读了你的回复学到很多东西,按照你上面的回复进行了相关的操作,但是在实际的操作过程中遇到这样的问题:选-cr,可以进main函数,但是不能初始化全局变量,选-c,直接进不了main函数,程序直接无法运行。是不是我们还要在build option或cmd中设置其他的选项,才能正确加载!我们怎样确认程序的入口地址及在什么地方确认?我们在cmd中给中段向量分配地址有没有什么要求?

  • 你好,

    麻烦另起新贴, 具体描述一下你的问题, 如使用的DSP型号? 是自己的开发板还是EVM板? 现在是在仿真器调试阶段还是脱机阶段? 脱机阶段的话, 采用哪种boot mode?