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 DSPLINK LOOP例程中添加自己的硬件中断,发现进不了中断

TI专家、各位朋友:

       我在LOOP例程DSP端工程中添加自己代码(用仿真器单独调试是好的),发现进不了HWI中断,LOOP本身例程也无法工作了,去掉我自己的中断设置代码,LOOP例程可以正常运行。我看配置文件,LOOP例程中把IPS中断映射到了INT4和INT5,我就把自己的硬件中断映射到了INT6和INT8,我自己弄了个优先级为15的TSK来做我自己的HWI设置(TSK确实执行了,我在TSK中点亮一个LED),具体设置如下:

这两个中断分别是GPIO中断和EDMA中断,这种方法我单独运行在DSP上是OK的,我现在怀疑,LOOP例程中是不有有哪里(TSK或者SWI)中禁止了GIE,我现在根本就不知道该怎么调试DPS端的代码,从ARM端来看现在DSP就像一个黑盒子。

求TI专家、各位大神不吝赐教,十分感谢!

  • Wei,

    我怀疑是不是HWI_restore()又把IER给恢复未使能之前的值了,DSP端还是可以连接仿真器查看寄存器状态的,比如可以看一下IER,IFR等看是不是没使能。GIE在恢复时肯定是使能了的。

  • Tony Tang,您好!

            我调试了下发现不是HWI_restore的问题,hold为调用HWI_disable()的返回值,通过仿真器调试发现,hold的值为调用HWI_disable()前CSR寄存器的值,为0x14000103,调用HWI_disable()后CSR寄存器的值为0x14000102,也就是GIE变成了0.调用HWI_restore()后CSR又变回了原来的值,也就是重新使能了GIE,无论使用HWI_restore()还是HWI_enable()都没有影响IER和IFR寄存器。

  • #1. 刚看了下SPRU403S,HWI_enable/disable是只操作CSR, 同时在appendix A的表来看,C64_enableIER需要在HWI_eable之前调用,不知道是不是这个影响。

    #2. 目前在C64_enableIER之后,IER的6,8bit使能了吗?

    #3. 确认是0x41,不是41号事件。

    #4. 当中断事件发生时,IFR有置位吗?如果没有,说明GPIO接口没有配置对。

  • 首先说下,抛开DSPLink这块,我单独建立一个工程,也是用一个任务去设置GPIO和EDMA的中断,GPIO和EDMA中断都很正常,这说明我的设置是没有问题的。

    #1:我还没验证,我感觉先使能总中断还是先使能IER关系不大。

    #2:IER的6,8可以使能。(我的DSPLINK的开发环境是搭建在Linux下,在ARM端通过"./loopgpp loop.out 1024 10000"这样加载的DSP段程序,所以我看不到DSP端的寄存器的值。我在CCS5下又建立了一个工程,就是跑中断这部分,通过仿真器调试发现IER6 8是使能的)

    #3: 确认是0x41,我用的事件十进制表示是65.

    #4: IFR有置位,GPIO的引脚复用也不会有问题,因为之前这些都是通的,我只是把他们移植到LOOP例程中。

  • 我现在怀疑,是默认的情况下,栈配置的太小,HWI和SWI共用一个系统堆栈,相互抢占时,上下文切换导致了栈溢出。栈溢出导致我自己的中断以及例程的IPC中断都无法进行。

  • To wei lee1

    您好,不知道DSPLink中的HWI不能进入的问题有没有解决,能否指教一二,谢谢。

  • corez,

             你好!我的问题已经解决。刚开始是所有的中断都不能进,我怀疑是栈溢出,在目录/dvsdk/dsplink_1_6x_xx_xx(x代表具体的dsplink版本号)/dsplink/dsp/inc/Dspbios/5.XX(我用的DSP/BIOS版本是5.41,所以这里是5.XX)/OMAPL138GEM下,修改文件dsplink-omapl138gem-base.tci,

    把prog.module("MEM").STACKSIZE = 0x1000;改大一点。

    还有一点,dsplink中dsp端的内存分配一般只够跑例程本身,我看了下配置文件是在DDR上配置了1M的空间用来跑dsp端的应用程序。如果自己的代码生成的.out文件比较大的话,可能就要修改内存映射了。具体的参考:http://processors.wiki.ti.com/index.php/Changing_DSPLink_Memory_Map

    这些不知道能不能对你的问题有一点帮助,同时我也希望,你把你的问题描述出来,最好把自己的中断配置也贴上来,这样方便大家讨论。

  • wei lee1

    您好,我的代码如下

    void GpioInterruptInit(TSKMESSAGE_TransferInfo * info)
    {
        HWI_Attrs ha_gpio = HWI_ATTRS;
        Uns hold = 0;

        ha_gpio.intrMask = C64_EINT13;
        ha_gpio.ccMask = 1;
        ha_gpio.arg = (Arg)info;

        C64_disableIER(C64_EINT13);
        hold = HWI_disable();
        HWI_eventMap(13, 65);
        HWI_dispatchPlug(13, (Fxn)GP0_15_ISR, -1, &ha_gpio);
        HWI_restore(hold);
        C64_clearIFR(C64_EINT13);
        C64_enableIER(C64_EINT13);
        C64_enableGIE(C64_EINT13);
    }

    此函数主要做中断函数映射,其中把参数info传递给中断函数GP0_15_ISR。

    另外也修改了prog.module("MEM").STACKSIZE = 0x4000; 生成的.out文件有470KB左右。

    测试依然没有中断响应。

  • #1:void GpioInterruptInit(TSKMESSAGE_TransferInfo * info)这个函数是你静态配置或者是动态创建的任务吧,这个初始化可以在任务中进行,但不能在主函数中调用这个函数来做GPIO中断的初始化。具体原因看DSP/BIOS执行main函数前后分别作了哪些初始化。

    #2:最好查看下寄存器,看下GPIO的引脚复用、IO口的方向是否是正确配置的。

    #3:我发现dsplink  DSP端的程序还是可以用仿真器调试的,把linux下DSP端生成的.OUT文件拷贝到windows机器上,使用CCS通过仿真器只连接dsp,然后 load symbols ,加载刚才拷贝出来的.out文件,然后在ARM端运行DSP的例程。这样在CCS下就可以暂停/开始DSP端的例程,我现在只会查看寄存器的值,但还不知道怎么设断点等。我也不知道我这个方法运用的得当不,这个资料不是特别好找。

  • wei lee1,您好,再次感谢你的回复。

    --》#1:void GpioInterruptInit(TSKMESSAGE_TransferInfo * info)这个函数...

    在main函数中调用tskMessageTask = TSK_create (tskMessage, NULL, 0) ;在函数tskMessage中调用GpioInterruptInit,所以GPIO中断初始化是在是任务中进行的。

    --》#2:最好查看下寄存器,看下GPIO的引脚...

    意思是需要在dsp端程序中,直接设置GPIO的寄存器,以及中断方式,是上升沿还是下降沿触发。

    --》#3:我发现dsplink  DSP端的程序还是可以...

    谢谢你提供的方法,加断点是不是应该把源文件也一并导入。

  • #2:不管用什么方法去配置,最终的结果都会体现在寄存器上,查看下寄存器,只是确保配置本身有没有问题。

    #3:查看IFR寄存器有没有置位,没有置位的话,就GPIO的配置问题了。

  • wei lee1,您好

    直接配置寄存器,实现了中断。

    只是个人有一点疑问,就是dsplink既然提供了HWI_dispatchPlug这样的函数,就应该也提供设置GPIO中断,触发方式等相关函数。

    也许有这样的函数,也许是我没找到。

    感谢你的提示,让我解决了这个问题。

    再次感谢。

  • HWI_dispatchPlug这个应该是DSP/BIOS提供的API而不是DSPLINK的API。听你这话的意思,是不是你只配置了GPIO中断,而没有配置GPIO引脚本身?

  • 对于DSP/BIOS有没有API来直接配置GPIO我也不清楚,对于GPIO我都是直接配置的寄存器,这个方法很笨,程序的可读性很差,但很有效。

  • BIOS本身只是OS,如果想用BIOS接口的驱动需要调用相应芯片的PSP驱动包,如果只是一般的函数调用,用Starerware里的驱动也可以的。

  • to wei lee1

    --》HWI_dispatchPlug这个应该是DSP/BIOS提供的API而不是DSPLINK的API。

    您说的这个我很赞同。

    DSP/BIOS是DSP运行的实时操作系统,嵌入式Linux是ARM运行的操作系统,那么DSPLink是否调用了这两个操作系统的API呢。

     

    to Tony Tang

    --》BIOS本身只是OS,如果想用BIOS接口的驱动需要调用相应芯片的PSP驱动包...

    不知道PSP驱动和Starerware驱动有什么区别,PSP驱动没有接触过,不甚了解,Starerware个人理解是提供了一些函数,这些函数封装了对寄存器的操作,但问题是如何在DSPLink的程序中调用这些函数,能否给出一个具体的例程,甚为感谢。

  • 将库及头文件的路径加到你的工程里,调用函数即可。