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.

求助:DM8148 DSP端,如何在SYS/BIOS系统环境下获取DDR内存空间的问题

Other Parts Discussed in Thread: SYSBIOS

求助:

    在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物理地址。请知道解决办法的朋友请予以帮助,感激不尽

  • Liu Han,

    如果DSP的MMU是bypass的,bios下看到的地址和物理地址是一一对应的。

    会否和cache有关?如果你把L2全部配置为RAM,问题是否还存在?

  • 您好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;

  • Liu Han,

    如果你没有特别代码使能DSP的MMU的,那DSP的MMU就是bypass(默认状态)。

  • 您好 Chris Meng

        那么我通过定义全局数组这种方式获取内存是否存在问题?如果不存在问题,那又是什么原因导致了EDMA传输不成功呐?

  • 会否和cache有关?如果你把L2全部配置为RAM,问题是否还存在?

  • Chris Meng,

        我刚才做了一个实验,把传输的源地址设置为GPIO_0 的SETDATAOUT 寄存器 目的地址设置为 GPIO_1的SETDATAOUT寄存器 , ACNT = 4 BCNT = 1 CCNT = 1 使用 A-synchronized 传输,现象是一样的,产生了传输完成中断,但是GPIO_1的SETDATAOUT寄存器没有改变,看来问题还是出在EDMA上面了。