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;
}
...