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.

OMAPL138启动问题求助

我现在开发OMAPL138芯片,遇到如下问题:

在ARM端是简单编写的唤醒DSP的程序,没有其他操作,生成了.out文件;

DSP端是实际应用的程序,并且在CMD文件中设置了程序初始入口位置:entry_point: o=0x80010000 l=0x00000400 .text:_c_int00>entry_point

之后利用AISgen将两部分.out文件合成转换,利用ARM端烧写进入NAND FLASH,脱机运行。

现在的情况是主程序的函数能够运行,例如GPIO点亮LED,但是中断向量表指向的中断入口程序没有被执行。

请问中断向量的asm文件要做什么特殊的工作吗?是因为在CMD文件中指定的位置不对吗?曾经将其放在程序入口前一段地址,后一段地址都试过了,就是没有被运行。请问我如何解决这个问题呢?

谢谢!

  • 你指的“中断向量表指向的中断入口程序没有被执行”具体是指什么?

    LED是DSP点的,还是ARM点的?

    程序本身在CCS环境下运行正常吗?

  • 您好,,请问您这个问题解决了吗?我现在也是同样的问题,cmd文件不知怎么编写,可否指点一下?

  • 你好,请问你的具体问题是什么?

    如果只是关于cmd文件如何写,可以参考任何一个现有的cmd文件进行修改。

    总体上是分为两部分:上面部分是memory,根据芯片及板子的外部内存,定义可用的内存空间及名字,名字随便取。

    下面部分section是将编译器产生的段指定分配到上面的memory。

    详细内容可以参考文档:spnu118j :ARM assembly language tools

  • 感谢您的回复

          DSP程序调通后,需要烧录到nor-flash,但是需要利用ARM唤醒DSP,所以我自己建了个ARM工程(默认的helloword的工程,cmd文件也默认的,),里面的main函数中添加唤醒DSP代码,然后编译后将该工程的.out文件与DSP工程的.out文件一起利用AISgen软件生成一个bin文件,将该bin写到nor-flash中后上电没反应。

          1、 是不是cmd的问题呢,ARM(见下面)和DSP的cmd文件差不多,DSP中后边section中加了个.boot>SHRAM,这一句干嘛用的呢?,不知道这两个CMD有问题没?地址冲突吗?应该怎么改?

          2、bootloader将flash中的程序加载到了哪段地址呢?DSP是0x80000000吗?ARM是0xffff0000吗?是怎么指定的呢?

          3、ARM工程的properties里面的各种参数需要修改吗?

          您上面给的那个资料努力看中。

    期待您的指导,感谢!!

    MEMORY
    {
    #ifdef DSP_CORE /* DSP exclusive memory regions */

    DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP local ROM */
    DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP local RAM */
    DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP local Program RAM */
    DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP local Data RAM */

    #endif

    SHDSPL2ROM o = 0x11700000 l = 0x00100000 /* 1MB L2 Shared Internal ROM */
    SHDSPL2RAM o = 0x11800000 l = 0x00040000 /* 256kB L2 Shared Internal RAM */
    SHDSPL1PRAM o = 0x11E00000 l = 0x00008000 /* 32kB L1 Shared Internal Program RAM */
    SHDSPL1DRAM o = 0x11F00000 l = 0x00008000 /* 32kB L1 Shared Internal Data RAM */
    EMIFACS0 o = 0x40000000 l = 0x20000000 /* 512MB SDRAM Data (CS0) */
    EMIFACS2 o = 0x60000000 l = 0x02000000 /* 32MB Async Data (CS2) */
    EMIFACS3 o = 0x62000000 l = 0x02000000 /* 32MB Async Data (CS3) */
    EMIFACS4 o = 0x64000000 l = 0x02000000 /* 32MB Async Data (CS4) */
    EMIFACS5 o = 0x66000000 l = 0x02000000 /* 32MB Async Data (CS5) */
    SHRAM o = 0x80000000 l = 0x00020000 /* 128kB Shared RAM */
    DDR2 o = 0xC0000000 l = 0x20000000 /* 512MB DDR2 Data */

    #ifndef DSP_CORE /* ARM exclusive memory regions */

    ARMROM o = 0xFFFD0000 l = 0x00010000 /* 64kB ARM local ROM */
    ARMRAM o = 0xFFFF0000 l = 0x00002000 /* 8kB ARM local RAM */

    #endif
    }

    SECTIONS
    {

    .boot>SHRAM  //DSP的cmd包含此行,ARM中没有
    .text > SHRAM
    .stack > SHRAM
    .bss > SHRAM
    .cio > SHRAM
    .const > SHRAM
    .data > SHRAM
    .switch > SHRAM
    .sysmem > SHRAM
    .far > SHRAM
    .args > SHRAM
    .ppinfo > SHRAM
    .ppdata > SHRAM

    /* TI-ABI or COFF sections */
    .pinit > SHRAM
    .cinit > SHRAM

    /* EABI sections */
    .binit > SHRAM
    .init_array > SHRAM
    .neardata > SHRAM
    .fardata > SHRAM
    .rodata > SHRAM
    .c6xabi.exidx > SHRAM
    .c6xabi.extab > SHRAM
    }

  • 别两个cmd差不多啊,从上面看ARM,DSP的代码都放在SHRAM,岂不是重叠覆盖了么。

    要将两个cmd的内存分配隔离开,比如ARM的放在SHRAM,DSP的放在DSP的L2RAM。还有AISGEN里PSC要把DSP使能。

    当然上面只是针对简单的情况,代码大了的时候要放到DDR上去,则要在AISGEN里将DDR配置上。

  • 你好。。我现在的情况是nor flash中的数据和AIS生产的bin文件数据一样,上电连接dsp后,相应的RAM中数据与bin中的不一致,是不是表示程序加载的不对?上电时flash的片选可以检测到一串的脉冲。

  • #1. 确认一下NOR flash首地址的数据是否是NOR flash Configuraiton Word,参考boot loader applicaiton note sprab41d文档 page2,3。有个版本的AISGEN在bin文件里加了这个configuraiton word,而有个版本的nor writer又加写了一个configuration word,确认有这个configuraiton word且没有重复。方便的话,你可以把nor flash的内容截个屏贴上来看一下。

    #2. NOR flash是连在CS2.

    #3. 程序是运行在片上内存,还是DDR?如果是在DDR,确认在AISGEN里的DDR配置正确。

    #4. 是boot ARM,还是DSP,还是两个一起?

  • 您好:

    1、nor flash的config word 没错,flash地址0x60000000的前四个字节为0x00000021,烧写程序自己写的,写入flash后与.bin文件对照过,是一致的,参见附件中ARM_output_AIS_0610_3.bin与0x60000000_0610_dsp.dat;

    2、flash连接cs2,烧到flash后,上电时cs2管脚可以检测到一串脉冲,oe读使能信号也能检测到脉冲;

    3、片上内存,.bin只有25KB,ARM的section放在了0x80000080,DSP放在了L2ram,entry_point:0x80000000;

    4、程序是在您上传的Boot_DSP_on_SOC_V0.1.zip 中OMAPL138_ARMbootDSPCoff.zip的工程上修改的,因为是自己的板子,所以修改了些内容,然后用AISgen软件将两个工程的.out文件生成了一个.bin。AIS的.cfg文件参见附件

    问题:

    1、ARM工程中有一个call_swi(327680);函数,调试时程序运行到此就没法往下运行,一致跳不出来,暂停后提示:cannot load from non primitive location,不知道这是什么原因?     这个不用时貌似pinmux没法在ARM中配置;

    2、注释掉后修改ARM模式的语句后,根据自己的板子进行了修改,仿真时先运行ARM然后load进DSP的.out后程序可以运行,点LED成功,但是烧写后不成功;仿真器连接ARM(未用GEL初始化)后查看RAM,和.bin对照不一致。RAM数据见附件。

    麻烦您看一下,感谢

  • 没有看到附件,请确认是否上传了。

    #1. 确认是用的16bit的NOR,且硬件连接正确。

    #2. 这只能说明BOOTMODE设置正确。

    #3. 这里有明显问题,除非你写错了:ARM的section放在了0x80000080,DSP放在了L2ram,entry_point:0x80000000, 还是把原始的cmd贴上来吧。

    #4. 把工程贴上来,如果不涉及要紧的东西。不改能不能起来呢?

     

    #1. call_swi是为了切换到supervisor mode,因为系统相关的配置寄存器要在这个模式下才能访问。

    #2. 运行DSP后,ARM的程序还在运行吗?反过来,先运行DSP,再运行ARM,DSP的点LED还在继续跑吗?

  • 您好 ,原来我昨天忘了传附件了。。。附件见下面。。。。ARM工程调试时运行到call_swi这里就没法继续往下运行了,不知道啥原因,注释掉call_swi后可以往下运行,但是就没法配置pinmux了。。。ARM只负责唤醒DSP和psc、pll的配置。。。。。

    omapl138_ccs5_2.rar
  • 您好,请问怎么设置AISgen里的DDR参数,是根据文档还是源码?

  • 用DDR参数计算工具按照DDR手册的参数计算得出。http://processors.wiki.ti.com/index.php/Programming_mDDR/DDR2_EMIF_on_OMAP-L1x/C674x