Other Parts Discussed in Thread: SYSBIOS
Hi~
环境说明:
DSP型号:TMS320C6678
DDR3:DDR3外接4片 4Gb/16bit的DDR3表贴内存颗粒,设计为单rank
我在使用C6678这款DSP调试DDR时,出现了一个不太理解的现象:向0x8000 0000这个地址写入一个4字节的数据时,发现0xA000 0000, 0xC000 0000等地址内的数据也出现了该数据。
如下是我的DDR测试代码:
uint32_t sdr_read_uint32(uint32_t addr)
{
return * (uint32_t *)addr;
}
void ddr_test()
{
sdk_write_uint32(0x80000000, 0x01111111*0x8);
sdk_write_uint32(0x90000000, 0x01111111*0x9);
sdk_write_uint32(0xa0000000, 0x01111111*0xa);
sdk_write_uint32(0xb0000000, 0x01111111*0xb);
sdk_write_uint32(0xc0000000, 0x01111111*0xc);
sdk_write_uint32(0xd0000000, 0x01111111*0xd);
sdk_write_uint32(0xe0000000, 0x01111111*0xe);
sdk_write_uint32(0xf0000000, 0x01111111*0xf);
return;
}
向0x8000 0000写入数据0x0888 8888时,发现0xA000 0000, 0xC000 0000, 0xE000 0000这些地址的内容也被写为了 0x0888 8888。如下图所示:

该问题我进行了如下的分析工作:
1. 通过分析汇编,STW的目的地址也是0x8000 0000,不是0xA000 0000。因此感觉不太像是软件的逻辑问题;
2. 我也怀疑过可能是多核的内存共享可能由影响,但是将我的platform中External Memory的DDR3设置为如下配置后,还是存在该问题。

3. 怀疑可能与多核有关系,我将我的.cfg文件中的多核配置改为了单核,对应的配置文件如下,还是存在此问题:
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var cslSettings = xdc.useModule ('ti.csl.Settings');
var Cppi = xdc.loadPackage('ti.drv.cppi');
var Qmss = xdc.loadPackage('ti.drv.qmss');
var Srio = xdc.loadPackage('ti.drv.srio');
var HWI = xdc.useModule ('ti.sysbios.hal.Hwi');
var CPINTC = xdc.useModule('ti.sysbios.family.c66.tci66xx.CpIntc');
var ECM = xdc.useModule('ti.sysbios.family.c64p.EventCombiner');
var Pa = xdc.useModule('ti.drv.pa.Settings');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var Mailbox = xdc.useModule('ti.sysbios.knl.Mailbox');
var Memory = xdc.useModule('xdc.runtime.Memory');
var Notify = xdc.useModule('ti.sdo.ipc.Notify');
var Ipc = xdc.useModule('ti.sdo.ipc.Ipc');
//多核相关
var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
//MultiProc.numProcessors = 8;
//MultiProc.setConfig(null, ["CORE0", "CORE1", "CORE2", "CORE3","CORE4","CORE5","CORE6","CORE7"]);
MultiProc.numProcessors = 1;
//MultiProc.setConfig(null, ["CORE0", "CORE1", "CORE2"]);
MultiProc.setConfig(null, ["CORE0"]);
/* Required if using System_printf to output on the console */
var System = xdc.useModule('xdc.runtime.System');
var SysStd = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;
var PlatformLib = xdc.loadPackage('ti.platform.evmc6678l');
var NdkTransport = xdc.loadPackage('ti.transport.ndk');
ECM.eventGroupHwiNum[0] = 7;
ECM.eventGroupHwiNum[1] = 8;
ECM.eventGroupHwiNum[2] = 9;
ECM.eventGroupHwiNum[3] = 10;
//面两条6678初始化被RYB注释掉,初始化移至MAIN函数中执行
//Startup = xdc.useModule('xdc.runtime.Startup');
//Startup.firstFxns.$add('&C6678_init');
var Global = xdc.useModule('ti.ndk.config.Global');
Global.enableCodeGeneration = false;
//BIOS.heapSize = 0x10000;
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams = new HeapMem.Params();
heapMemParams.size = 0x200000;
heapMemParams.sectionName = "systemHeap";
Program.global.heap0 = HeapMem.create(heapMemParams);
/* This is the default memory heap. */
Memory.defaultHeapInstance = Program.global.heap0;
/*
** Create the stack Thread Task for our application.
*/
var Exception = xdc.useModule('ti.sysbios.family.c64p.Exception');
Exception.enablePrint = true;
/* To avoid wasting shared memory for Notify and MessageQ transports */
for (var i = 0; i < MultiProc.numProcessors; i++) {
Ipc.setEntryMeta({
remoteProcId: i,
setupMessageQ: false,
});
}
/* Synchronize all processors (this will be done in Ipc_start) */
Ipc.procSync = Ipc.ProcSync_ALL;
/*
* Need to define the shared region. The IPC modules use this
* to make portable pointers. All processors need to add this
* call with their base address of the shared memory region.
* If the processor cannot access the memory, do not add it.
*/
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.setEntryMeta(0,
{ base: 0x0C180000,
len: 0x00080000,
ownerProcId: 0,
isValid: true,
name: "MSMCSRAM_IPC",
});
Program.sectMap[".srioSharedMem"] = "L2SRAM"; //DDR3
Program.sectMap[".boot_sect"] = "L2SRAM";
Program.sectMap["sharedL2"] = "MSMCSRAM";
Program.sectMap["systemHeap"] = "MSMCSRAM";
Program.sectMap[".sysmem"] = "MSMCSRAM";
Program.sectMap[".args"] = "MSMCSRAM";
Program.sectMap[".cio"] = "MSMCSRAM";
Program.sectMap[".far"] = "MSMCSRAM";
Program.sectMap[".rodata"] = "MSMCSRAM";
Program.sectMap[".neardata"] = "MSMCSRAM";
Program.sectMap[".cppi"] = "MSMCSRAM";
Program.sectMap[".init_array"] = "MSMCSRAM";
Program.sectMap[".qmss"] = "MSMCSRAM";
Program.sectMap[".cinit"] = "MSMCSRAM";
Program.sectMap[".bss"] = "MSMCSRAM";
Program.sectMap[".const"] = "MSMCSRAM";
Program.sectMap[".text"] = "MSMCSRAM";
Program.sectMap[".code"] = "MSMCSRAM";
Program.sectMap[".switch"] = "MSMCSRAM";
Program.sectMap[".data"] = "MSMCSRAM";
Program.sectMap[".fardata"] = "MSMCSRAM";
Program.sectMap[".args"] = "MSMCSRAM";
Program.sectMap[".cio"] = "MSMCSRAM";
Program.sectMap[".vecs"] = "MSMCSRAM";
Program.sectMap["platform_lib"] = "MSMCSRAM";
Program.sectMap["TI_platform_lib"] = "MSMCSRAM";
Program.sectMap[".far:taskStackSection"] = "MSMCSRAM";
Program.sectMap[".stack"] = "L2SRAM";
Program.sectMap[".nimu_eth_ll2"] = "L2SRAM";
Program.sectMap[".resmgr_memregion"] = {loadSegment: "L2SRAM", loadAlign:128}; /* QMSS descriptors region */
Program.sectMap[".resmgr_handles"] = {loadSegment: "L2SRAM", loadAlign:16}; /* CPPI/QMSS/PA Handles */
Program.sectMap[".resmgr_pa"] = {loadSegment: "L2SRAM", loadAlign:8}; /* PA Memory */
Program.sectMap[".far:IMAGEDATA"] = {loadSegment: "L2SRAM", loadAlign: 8};
Program.sectMap[".far:NDK_OBJMEM"] = {loadSegment: "L2SRAM", loadAlign: 8};
Program.sectMap[".far:NDK_PACKETMEM"] = {loadSegment: "L2SRAM", loadAlign: 128};
Program.sectMap[".msm_user"] = "MSMCSRAM";
Program.sectMap[".NDKDESC"] = "MSMCSRAM"; //MSMCSRAM
Program.sectMap[".csl_vect"] = "MSMCSRAM"; //MSMCSRAM
/* 自定义 */
Program.sectMap[".revcomad"] ="MSMCSRAM";
Program.sectMap[".msmc_slave_addr"] ="MSMCSRAM";
Program.sectMap[".data_ddr"] ="DDR3";
请大佬帮忙看看,出现这个现象是什么原因?
谢谢!