求助:
在DM8148 DSP端调试EDMA时遇到一个问题,我想在SYS/BIOS环境下实现EDMA的数据块搬运操作,也就是把内存中的一个数据块搬拷贝到其他内存地址上,当然这只是一个测试不会有真实应用场景的,代码流程大体如下
1、申请了两个全局数组用于测试,通过打印得知 src_block 地址为 0x8f0236f8, dst_block地址为 0x8f023730,并把src_blocks数组中的所有数据写为0x61,dst_block 数组清零
unsigned char src_block[50 * 1];
unsigned char dst_block[50 * 1];
2、配置EDMA实现搬运,PaRAM参数如下
[INFO] EDMA_CC_OPT = 8031a000
[INFO] EDMA_CC_SRC = 8f0236f8
[INFO] EDMA_CC_A_B_CNT = 10032
[INFO] EDMA_CC_DST = 8f023730
[INFO] EDMA_CC_SRC_DST_BID = 0
[INFO] EDMA_CC_LINK_BCNTRLD = ffff
[INFO] EDMA_CC_SRC_DST_CID = 0
[INFO] EDMA_CC_CCNT26 = 1
3、触发EDMA传输,确认产生了传输完成中断,并且PaRAM参数被清除
4、观察dst_block 的数据依旧全是0
所以我推测是目标和源地址出了问题,0x8f0236f8并不是真实的DDR物理地址。请知道解决办法的朋友请予以帮助,感激不尽
Chris Meng:
Liu Han,
如果DSP的MMU是bypass的,bios下看到的地址和物理地址是一一对应的。
会否和cache有关?如果你把L2全部配置为RAM,问题是否还存在?
han liu2:
回复 Chris Meng:
您好Chris Meng:
十分感谢您的回复,请问如何查看DSP的MMU是bypass的,下面是我工程中的.bld 和cfg文件
* ======== config.bld ======== * */
var Build = xdc.useModule('xdc.bld.BuildEnvironment');
/* Memory Map for ti.platforms.evmTI814X * * 8000_0000 – 8FFF_FFFF 1000_0000 ( 256 MB) External Memory * ———————————————————————— * 8000_0000 – 84FF_FFFF 500_0000 ( 80 MB) Linux * 8500_0000 – 8DFF_FFFF 900_0000 ( 144 MB) ——– * 8E00_0000 – 8E00_FFFF 1_0000 ( 64 KB) SR_0 (ipc) * 8E01_0000 – 8EFF_FFFF FF_0000 ( ~15 MB) ——– * 8F00_0000 – 8FFF_FFFF 100_0000 ( 16 MB) DSP_PROG (code, data) */
var SR_0 = { name: "SR_0", space: "data", access: "RWX", base: 0x8E000000, len: 0x10000, comment: "SR#0 Memory (64 KB)" };
Build.platformTable["ti.platforms.evmTI814X:dsp"] = { externalMemoryMap: [ [ SR_0.name, SR_0 ], [ "DSP_PROG", { name: "DSP_PROG", space: "code/data", access: "RWX", base: 0x8F000000, len: 0x1000000, comment: "DSP Program Memory (16 MB)" }] ], codeMemory: "DSP_PROG", dataMemory: "DSP_PROG", stackMemory: "DSP_PROG", l1DMode: "32k", l1PMode: "32k", l2Mode: "256k"};
/* * ======== ti.targets.elf.C674 ======== */var C674 = xdc.useModule('ti.targets.elf.C674');C674.ccOpts.suffix += " -mi10 -mo ";Build.targets.$add(C674);
/* * ======== Dsp.cfg ======== * */
/* root of the configuration object model */var Program = xdc.useModule('xdc.cfg.Program');
/* application uses the following modules and packages */xdc.useModule('xdc.runtime.Assert');xdc.useModule('xdc.runtime.Diags');xdc.useModule('xdc.runtime.Error');xdc.useModule('xdc.runtime.Log');xdc.useModule('xdc.runtime.Registry');xdc.useModule('xdc.runtime.Memory');xdc.useModule('xdc.runtime.Startup');
//xdc.useModule('ti.sysbios.hal.Hwi');xdc.useModule('ti.sysbios.family.c64p.EventCombiner');xdc.useModule('ti.sysbios.family.c64p.Hwi');xdc.useModule('ti.sysbios.family.c64p.MemoryProtect');xdc.useModule('ti.sysbios.gates.GateHwi');xdc.useModule('ti.sysbios.gates.GateTask');xdc.useModule('ti.sysbios.knl.Semaphore');xdc.useModule('ti.sysbios.knl.Task');
//var Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');//var hwiParams = new Hwi.Params;//Program.global.hwi0 = Hwi.create(20, '&dr_completion_hwi_handle', hwiParams);
var BIOS = xdc.useModule('ti.sysbios.BIOS');BIOS.libType = BIOS.LibType_NonInstrumented;
/* * ======== IPC Configuration ======== */
/* required because SysLink is running on the host processor */xdc.useModule('ti.syslink.ipc.rtos.Syslink');
/* configure processor names */var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');var procNameAry = MultiProc.getDeviceProcNames();MultiProc.setConfig("DSP", procNameAry);
/* ipc configuration */var Ipc = xdc.useModule('ti.sdo.ipc.Ipc');
/* ipc setup for SR0 Memory (host processor not running Sys/Bios) */Ipc.sr0MemorySetup = false;
/* set ipc sync to pair, requiring Ipc_attach() call on all processors */Ipc.procSync = Ipc.ProcSync_PAIR;
/* define host processor */Ipc.hostProcId = MultiProc.getIdMeta("HOST");
/* shared region configuration */var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
/* configure SharedRegion #0 (IPC) */var SR0Mem = Program.cpu.memoryMap["SR_0"];
SharedRegion.setEntryMeta(0, new SharedRegion.Entry({ name: "SR0", base: SR0Mem.base, len: SR0Mem.len, ownerProcId: MultiProc.getIdMeta("HOST"), cacheEnable: false, isValid: true }));
/* configure external memory cache property * * 8000_0000 – 9FFF_FFFF 2000_0000 ( 512 MB) Cache.MAR128_159 * ————————————————————————– * 8000_0000 – 8DFF_FFFF E00_0000 ( 224 MB) ——– don't care * 8E00_0000 – 8E00_FFFF 1_0000 ( 64 KB) SR_0 no-cache MAR142 * 8E01_0000 – 8EFF_FFFF FF_0000 ( ~15 MB) ——– no-cache MAR142 * 8F00_0000 – 8FFF_FFFF 100_0000 ( 16 MB) DSP_PROG cache enable MAR143 * 9000_0000 – 9FFF_FFFF 1000_0000 ( 256 MB) ——– don't care */Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');Cache.MAR128_159 = 0x00008000; /* xxxx xxxx xxxx xxxx 10xx xxxx xxxx xxxx */
/* * ======== Operating System Configuration ======== */
/* no rts heap */Program.heap = 0;Program.argSize = 100; /* minimum size */Program.stack = 0x1000;
/* create a default heap */var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');var heapMemParams = new HeapMem.Params();heapMemParams.size = 0x4000;
var Memory = xdc.useModule('xdc.runtime.Memory');Memory.defaultHeapInstance = HeapMem.create(heapMemParams);
/* configure System module */var SysMin = xdc.useModule('xdc.runtime.SysMin');SysMin.bufSize = 0x1000;SysMin.flushAtExit = false;
var System = xdc.useModule('xdc.runtime.System');System.SupportProxy = SysMin;
/* system clock runs at 20 MHz */var Timer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');Timer.intFreq.hi = 0;Timer.intFreq.lo = 20000000;
/* * ======== Miscellaneous Configuration ======== */
/* set default diags mask */var Diags = xdc.useModule('xdc.runtime.Diags');var Defaults = xdc.useModule('xdc.runtime.Defaults');
Defaults.common$.diags_ENTRY = Diags.ALWAYS_OFF;Defaults.common$.diags_EXIT = Diags.ALWAYS_OFF;Defaults.common$.diags_LIFECYCLE = Diags.ALWAYS_OFF;Defaults.common$.diags_INTERNAL = Diags.ALWAYS_OFF; /* needed for asserts */Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF; /* development only */Defaults.common$.diags_STATUS = Diags.RUNTIME_ON;Defaults.common$.diags_USER1 = Diags.ALWAYS_OFF;Defaults.common$.diags_USER2 = Diags.ALWAYS_OFF;Defaults.common$.diags_USER3 = Diags.ALWAYS_OFF;Defaults.common$.diags_USER4 = Diags.ALWAYS_OFF;Defaults.common$.diags_USER5 = Diags.ALWAYS_OFF;Defaults.common$.diags_USER6 = Diags.ALWAYS_OFF;Defaults.common$.diags_INFO = Diags.ALWAYS_OFF;Defaults.common$.diags_ANALYSIS = Diags.ALWAYS_OFF;
/* override diags mask for selected modules */xdc.useModule('xdc.runtime.Main');Diags.setMaskMeta( "xdc.runtime.Main", Diags.ENTRY | Diags.EXIT | Diags.INFO, Diags.RUNTIME_ON);
var Registry = xdc.useModule('xdc.runtime.Registry');Registry.common$.diags_ENTRY = Diags.RUNTIME_OFF;Registry.common$.diags_EXIT = Diags.RUNTIME_OFF;Registry.common$.diags_INFO = Diags.RUNTIME_OFF;Registry.common$.diags_USER1 = Diags.RUNTIME_OFF;
/* create a logger instance */var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');var loggerBufP = new LoggerBuf.Params();loggerBufP.numEntries = 128; /* 128 entries = 4 KB of memory */loggerBufP.bufType = LoggerBuf.BufType_FIXED;
var appLogger = LoggerBuf.create(loggerBufP);appLogger.instance.name = "AppLog_Core1";Defaults.common$.logger = appLogger;
Chris Meng:
回复 han liu2:
Liu Han,
如果你没有特别代码使能DSP的MMU的,那DSP的MMU就是bypass(默认状态)。
han liu2:
回复 Chris Meng:
您好 Chris Meng
那么我通过定义全局数组这种方式获取内存是否存在问题?如果不存在问题,那又是什么原因导致了EDMA传输不成功呐?
Chris Meng:
回复 han liu2:
会否和cache有关?如果你把L2全部配置为RAM,问题是否还存在?
han liu2:
回复 Chris Meng:
Chris Meng,
我刚才做了一个实验,把传输的源地址设置为GPIO_0 的SETDATAOUT 寄存器 目的地址设置为 GPIO_1的SETDATAOUT寄存器 , ACNT = 4 BCNT = 1 CCNT = 1 使用 A-synchronized 传输,现象是一样的,产生了传输完成中断,但是GPIO_1的SETDATAOUT寄存器没有改变,看来问题还是出在EDMA上面了。
TI中文支持网

