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.

5510HPI启动代码加载不正确



小弟用5510HPI启动,用MSP430单片机作为host,将code代码加载到0x8000处(字地址),可是上电后加载到0x8000的数据却并不是我的code代码(十六进制数据),请问大侠们,咋回事啊?

我的调试方法是:先将单片机上电运行host代码,然后用ccs3.3->connect连接,然后看view->memory,请问大侠们,我的操作有问题吗?我跟踪单片机,单片机确实运行起来了。

  • 你先看一下HPI读写时序对不对?

  • 真的太感谢您了,看过你的关于5509的hpi启动答疑http://www.deyisupport.com/question_answer/dsp_arm/c5000/f/48/t/19385.aspx学到了很多东西。

    正如您所说,是时序不对,现在写入的数据是正确的,但是dsp还是没起来,明天继续研究,有问题再来请教您哈。

  • 今天调了一下午,发现DSP还是起不来,我一一的将DSP8000h开始的数据和用host加载的数据进行了对比,完全是正确的。可DSP还是启动不了,我怀疑是我EHPI启动的操作顺序不对,我的步骤是这样的:1、设置bootm[3..0]=1101。2、拉低DSP的reset管脚,延时后再拉高DSP的reset管脚。3、向hpic寄存器写入0x00。4、加载程序所需数据。5、向hpic寄存器写入0x01,启动DSP。

    请问大侠,我的操作有问题么?

  • 1. 去掉 3、向hpic寄存器写入0x00

    2. 在byte address 0x10000处设置一个硬件断点, 看能停在该断点吗?

    3. 用ccs反汇编窗口看一下byte address 0x10000处放的是你的入口程序_c_init00么?

     

  • 您好Shine Zhang,我按照您的方法调试了一下,我用ccs反汇编窗口中右键的“start address”可以定位0x10000处,但是用鼠标滚轮向上或向下稍微一滚动,就发现0x10000这个地址不存在了,看下面我复制的反汇编窗口数据:

    以下是我用“start address”定位0x10000处:

    010000 ec314e0038fa             AMAR *(#038fah),XSP
    010006 ec315e0039f4             AMAR *(#039f4h),XSSP
    01000C f406f91f_98              AND #63775,mmap(@ST1_55)
    010011 f5064100_98              OR #16640,mmap(@ST1_55)
    010016 f496fa00_98              AND #64000,mmap(@ST2_55)
    01001B f5968000_98              OR #32768,mmap(@ST2_55)
    010020 4656                     BCLR ST3_SATA
    010022 4617                     BSET ST3_SMUL
    010024 160000                   MOV #0,DPH
    010027 160001                   MOV #0,MDP05
    01002A 160002                   MOV #0,MDP67
    01002D 6c000248                 CALL _auto_init

    在此窗口数据上,我在010000 ec314e0038fa             AMAR *(#038fah),XSP这一行设定了一个硬件断点,发现pc指针可以停在此处。

     

    以下是我用鼠标滚轮向上翻,本想看看0x10000以上的代码,但是却出现下面的情况:

    00FFFA 6dd5a55a                 BCC #0x00a558,T1 >= #0
    00FFFE 0cccec_314e              RPT #52460 || MIN T0,AR6
    010003 0038fa                   RPTCC #250, AR0 <= #0
    010006 ec315e0039f4             AMAR *(#039f4h),XSSP
    01000C f406f91f_98              AND #63775,mmap(@ST1_55)
    010011 f5064100_98              OR #16640,mmap(@ST1_55)
    010016 f496fa00_98              AND #64000,mmap(@ST2_55)
    01001B f5968000_98              OR #32768,mmap(@ST2_55)
    010020 4656                     BCLR ST3_SATA
    010022 4617                     BSET ST3_SMUL
    010024 160000                   MOV #0,DPH
    010027 160001                   MOV #0,MDP05
    01002A 160002                   MOV #0,MDP67
    01002D 6c000248                 CALL _auto_init

     

    以下是我的原始代码用ccs加载后的反汇编窗口:

    000100          .text, __text, _c_int00:
    000100 ec314e0038fa             AMAR *(#038fah),XSP
    000106 ec315e0039f4             AMAR *(#039f4h),XSSP
    00010C f406f91f_98              AND #63775,mmap(@ST1_55)
    000111 f5064100_98              OR #16640,mmap(@ST1_55)
    000116 f496fa00_98              AND #64000,mmap(@ST2_55)
    00011B f5968000_98              OR #32768,mmap(@ST2_55)
    000120 4656                     BCLR ST3_SATA
    000122 4617                     BSET ST3_SMUL
    000124 160000                   MOV #0,DPH
    000127 160001                   MOV #0,MDP05
    00012A 160002                   MOV #0,MDP67
    00012D 6c000248                 CALL _auto_init

     

  • 从贴出来的代码看表示前面的加载步骤都是正确的, 现在要查为什么程序执行不正确. 你再往下执行比如在main()处设置断点, 看程序跑到哪里出错, 具体方法在你看到的帖子里有:

    把仿真器连上,选择debug->Reset CPU。查看PC寄存器地址应该在0xff8000,这是bootloader源代码在ROM中的位置,选择file->load symbols->load symbols only,然后选择out文件,这样只载入符号定义

    还有就是编译的时候不要用-cr选项


  • 太感谢您了,确实是-cr惹的祸,最开始一直没有关心-cr选项,也没有找到这个选项在哪儿,后来刻意的找到了这个选项,改成none,马上就可以运行了,但是代码数据貌似很少了,而且这个-cr不是cinit段初始化作用的么?这样一来哪些全局变量不就没有初始化了么?为什么程序还能运行起来?很不解。

    而且,现在的代码数据和利用ccs加载进DSP的数据貌似根本就不一样,但是为什么能运行起来呢?

    当时用-cr选项,代码数据和利用ccs加载进DSP的数据完全一样,反而却运行不起来,这一点很是不解,可能还是没有弄明白HPI启动的深层原理是什么?

  • -cr, -c都是cinit段初始化作用, 只是方式不一样, -c是需要把.cinit段保存到memory中, 全局变量的初始化是程序run的时候实现的, 而-cr不需要把.cinit段保存到memory, 由CCS loader加载器直接加载到.bss段进行初始化, 所以你会看到脱机和CCS加载的数据不一样.

     具体关于-cr, -c怎么处理.cinit段, 你可以看一下下面的文档第145页.
    http://www.ti.com/lit/ug/spru281g/spru281g.pdf

  • 太谢谢您了!根据您的提示,问题终于搞定了。