您好,我最近在使用omap3530 时,使用dsplink遇到了一个奇怪的mmu fault 问题。
问题是这样的,我使用了dsplink 的PROC POOL NOTIFY组件,程序流程如下:
1 gpp 端程序使用pool开辟共享内存
2 gpp写数据到共享内存
3 gpp启动dsp,等待dsp的notify
4 dsp读写共享内存 发送notify到gpp 等待gpp的notify
5 gpp 读写共享内存 发送nofify到dsp 等待 dsp的notify
6 执行第4步
这个测试程序能够很好地运行。
然后,我对测试程序进行了部分改造,改造好后,两端程序的基本通信流程没有
发生变化,只是,第4步中读写内存后,对数据进行了复杂的处理(进行x264编码)
然后程序在运行时,就出现了 MMU Fault的问题
[ 538.434265] DSP MMU Error Fault! MMU_IRQSTATUS = [0x1]. Virtual DSP addr reference that generated the interrupt = [0xfffdfbc8].
但奇怪的是,我将dsp端进行运算的程序剥离出来后,使用gcc对其编译,并将编译
所得程序在PC上运行,则程序能正常运行。
我对此,很是不解。
急切等待您的恢复。
在这里我奉上我的两个配置问题:CFG_OMAP3530_SHMEM.c 和 dsplink-omap3530-base.tci
Feng Dong:
你264算法使用的空间要通过mmu配置,通常这部分是通过cmem来实现的.
geng wang:
回复 Feng Dong:
我264的代码最终要动态开辟的内是用MEM_alloc()函数开辟的,而且调用这个函数时,传入的段地址是我专门定义出来的一个段,这个段在dsplink-omap3530-base.tci文件中进行了定义(段名称是CODEHEAPMEM),在那个能正常运行的测试程序中,我也调用了MEM_alloc函数进行了内存的动态分配,且对分配的内存进行了读写,但是没有报告MMU Fault错误。
Feng Dong:
回复 geng wang:
编码的数据是arm和dsp共享空间的是要通过cmem来分配的