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.
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专家、各位大神不吝赐教,十分感谢!
首先说下,抛开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例程中。
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引脚本身?
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的程序中调用这些函数,能否给出一个具体的例程,甚为感谢。