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基于SYSLINK的双核通信问题



GPP端应用程序采用共享内存方式与DSP进行数据通信。

具体过程如下:

1.GPP端通过脚本加载双核通信驱动syslink.ko 

2.GPP通过脚本调用slaveloader 启动dsp程序;

3.GPP端启动应用程序,程序与DSP进行双核数据通信通信;

4.在应用程序退出后,脚本通过slaveloader 关闭dsp程序;

相关启动命令:

insmod b/modules/3.3.0/kernel/drivers/dsp/syslink.ko TRACE=1 TRACEFAILURE=1

/ex04_sharedregion/debug/slaveloader startup DSP /ex04_sharedregion/debug/L138_EVRS.xe674

/mnt/apps/bin/recsys&

/ex04_sharedregion/debug/slaveloader shutdown DSP /ex04_sharedregion/debug/L138_EVRS.xe674

注:recsys是GPP端的应用程序 L138_EVRS.xe674是DSP端dsp程序

如果不完全按以上步骤工作时,会产生两个问题:

1.操作:

加载驱动之后,跳过步骤 2 3,直接关闭dsp程序,当前终端进程崩溃输出

debug/L138_EVRS.xe674

[   41.624648] Assertion at Line no: 95 in /home/teddy/davinci/mcsdk-work/syslink_2_21_01_05/packages/ti/syslink/utils/hlosl/Linux/../../../../../../ti/syslink/family/hlosl/omapl1xx/omapl1xxdsp/omapl1xx_hal_reset.c: (halObj != NULL) : failed

[   41.648003] Unable to handle kernel NULL pointer dereference at virtual address 00000000

[   41.657594] pgd = c71c0000

[   41.661730] [00000000] *pgd=c73da831, *pte=00000000, *ppte=00000000

[   41.668109] Internal error: Oops: 17 [#1] PREEMPT

[   41.672848] Modules linked in: syslink(O)

[   41.676915] CPU: 0    Tainted: G           O  (3.3.0 #5)

[   41.682828] PC is at OMAPL1XX_halResetCtrl+0x88/0x13c [syslink]

[   41.688831] LR is at console_unlock+0x210/0x220

...

2.操作:

加载驱动之后,按1,2,3步程序正常工作,  在第4步关闭GPP端应用程序后,不关闭dsp程序。

这时再次打开GPP端应用程序,出现GPP端应用程序锁死。此时调用linux的kill命令也无法杀死应用程序。

经过调试发现出现这个现象的是锁死在以下代码status = Ipc_control(remoteProcId, Ipc_CONTROLCMD_STARTCALLBACK, NULL);

...

     SysLink_setup();

     /* invoke the SysLink load callback */

     remoteProcId = MultiProc_getId("DSP");

   status = Ipc_control(remoteProcId, Ipc_CONTROLCMD_LOADCALLBACK, NULL);

     if (status < 0) {

         goto leave;

     }

/* invoke the SysLink start callback */

     status = Ipc_control(remoteProcId, Ipc_CONTROLCMD_STARTCALLBACK, NULL);

     if (status < 0) {

         goto leave;

     }

...