Part Number:TMS320C6678
I am trying to create a simple program that sends an integer value from Core 0 to Core 1 as i am just a beginner using this board. I have no experience with IPC before this and cant find simple examples like what i am trying to create. Currently i am trying to implement a Master program on Core 0 that allocates the message to shared memory and a Slave program on Core 1 that takes this message and prints the integer value sent. For both of these programs i have used a cfg file from a seperate IPC example as i am not confident enough to change many of the parameters as of yet. Both programs build and debug fine on their respective cores however when i try to find the Heap in Core 1 that was created by Core 0, by using HeapBufMP_open(), i am getting the HeapBufMP_E_NOTFOUND error (-5), i am not sure why i am getting error as this method seems to work fine in other examples, below is the master.c, slave.c and their respective configs.
Master.c
#include <xdc/std.h> #include <xdc/cfg/global.h> #include <xdc/runtime/System.h> #include <xdc/runtime/IHeap.h> #include <ti/ipc/Ipc.h> #include <ti/ipc/MultiProc.h> #include <ti/ipc/MessageQ.h> #include <ti/ipc/SharedRegion.h> #include <ti/ipc/HeapBufMP.h> //#include <../include/HeapBufMP.h> #include <ti/platform/platform.h> #include <ti/sysbios/Bios.h> #include <ti/csl/csl_chip.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #define HEAPID 0 typedef struct{ MessageQ_MsgHeader header; Int message; }myMsg; Int status; Uint16 selfId; //SharedRegion_Entry entry; Char localQueueName[10]; Char remoteQueueName[10]; Int main(Int argc, Char* argv[]){ selfId = CSL_chipReadReg(CSL_CHIP_DNUM); // determine the coreID System_printf("%s starting\n", MultiProc_getName(selfId)); /* Call Ipc_start() */ status = Ipc_start(); if (status < 0) { System_abort("Ipc_start failed!\n"); } BIOS_start(); return 0; } Void messageQ_Master(UArg arg0, UArg arg1){ HeapBufMP_Handle heapHandle; HeapBufMP_Params heapBufMPParams; MessageQ_QueueId QueueId; MessageQ_Handle messageQ = NULL; MessageQ_Msg msg; /* get region 0 information */ //SharedRegion_getEntry(0, &entry); /* Create the heap that will be used to allocate messages. */ HeapBufMP_Params_init(&heapBufMPParams); heapBufMPParams.regionId = 0; // use default region heapBufMPParams.name = "myHeap"; heapBufMPParams.numBlocks = 1; heapBufMPParams.blockSize = sizeof(myMsg); heapBufMPParams.gate = NULL; // use system gate heapHandle = HeapBufMP_create(&heapBufMPParams); if (heapHandle == NULL) { System_abort("HeapBufMP_create failed\n"); } messageQ = MessageQ_create(localQueueName, NULL); if (messageQ == NULL){ System_abort("MessageQ_create failed\n"); } /* Register this heap with MessageQ */ MessageQ_registerHeap((IHeap_Handle)heapHandle, HEAPID); do { status = MessageQ_open(remoteQueueName, &QueueId); if (status < 0){ Task_sleep(1); } }while (status < 0); msg = MessageQ_alloc(HEAPID, sizeof(myMsg)); ((myMsg*)msg)->message = 1; status = MessageQ_put(QueueId, msg); System_printf("message sent = %d\n", ((myMsg*)msg)->message); BIOS_exit(0); }
Master.cfg
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore'); var Task = xdc.useModule('ti.sysbios.knl.Task'); Semaphore.supportsEvents = false; var System = xdc.useModule('xdc.runtime.System'); var SysStd = xdc.useModule('xdc.runtime.SysStd'); System.SupportProxy = SysStd; System.extendedFormats = "%$S%f"; var BIOS = xdc.useModule('ti.sysbios.BIOS'); BIOS.clockEnabled = false; BIOS.heapSize = 0x8000; Program.sectMap[".msgQ_ptrs"] = new Program.SectionSpec(); Program.sectMap[".msgQ_ptrs"] = "L2SRAM"; Program.sectMap["platform_lib"] = new Program.SectionSpec(); Program.sectMap["platform_lib"] = "L2SRAM"; var PlatformLib = xdc.loadPackage('ti.platform.evmc6678l'); var cslSettings = xdc.useModule ('ti.csl.Settings'); var cacheEnabled = true; var cacheLineSize = 128; var procName = null; var procNameList = []; var Settings = xdc.module('ti.sdo.ipc.family.Settings'); var Cache = xdc.useModule('ti.sysbios.family.c66.Cache'); var MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ'); var Notify = xdc.module('ti.sdo.ipc.Notify'); var Ipc = xdc.useModule('ti.sdo.ipc.Ipc'); var HeapBufMP = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP'); Notify.SetupProxy = xdc.module(Settings.getNotifySetupDelegate()); MessageQ.SetupTransportProxy= xdc.module(Settings.getMessageQSetupDelegate()); /* Use shared memory IPC */ MessageQ.SetupTransportProxy = xdc.module('ti.sdo.ipc.transports.TransportShmSetup'); Program.global.TRANSPORTSETUP = MessageQ.SetupTransportProxy.delegate$.$name; switch (Program.platformName) { case "ti.sdo.ipc.examples.platforms.evm6678.core0": case "ti.platforms.evm6678": Program.global.USING_C6678 = 1; Program.global.maxNumCores = 8; procNameList = ["CORE0", "CORE1", "CORE2", "CORE3", "CORE4", "CORE5", "CORE6", "CORE7"]; Program.global.shmBase = 0x0C000000; Program.global.shmSize = 0x00200000; break; case "ti.sdo.ipc.examples.platforms.evm6670.core0": case "ti.platforms.evm6670": Program.global.USING_C6670 = 1; Program.global.maxNumCores = 4; procNameList = ["CORE0", "CORE1", "CORE2", "CORE3"]; Program.global.shmBase = 0x0C000000; Program.global.shmSize = 0x00200000; break; case "ti.sdo.ipc.examples.platforms.evm6670.core0": case "ti.platforms.evm6657": Program.global.USING_C6657 = 1; Program.global.maxNumCores = 2; procNameList = ["CORE0", "CORE1"]; Program.global.shmBase = 0x0C000000; Program.global.shmSize = 0x00200000; break; default: throw("Unsupported platform: " + Program.platformName); } var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc'); MultiProc.setConfig(procName, procNameList); Program.global.DEVICENAME = Program.cpu.deviceName; Program.global.PROCNAMES = procNameList.join(","); Program.global.BUILDPROFILE = Program.build.profile; var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion'); SharedRegion.translate = true; SharedRegion.setEntryMeta(0, { base: Program.global.shmBase, len: Program.global.shmSize, ownerProcId: 0, isValid: true, cacheEnable: cacheEnabled, cacheLineSize: cacheLineSize, /* Aligns allocated messages to a cache line */ createHeap: true, name: "internal_shared_mem", }); var task0Params = new Task.Params(); task0Params.instance.name = "task"; Program.global.task = Task.create("&messageQ_Master", task0Params); Task.allBlockedFunc = Task.allBlockedFunction; BIOS.heapTrackEnabled = false;
Slave.c
#include <xdc/std.h> #include <xdc/cfg/global.h> #include <xdc/runtime/System.h> #include <xdc/runtime/IHeap.h> #include <ti/ipc/Ipc.h> #include <ti/ipc/MultiProc.h> #include <ti/ipc/MessageQ.h> #include <ti/ipc/SharedRegion.h> #include <ti/ipc/HeapBufMP.h> #include <ti/platform/platform.h> #include <ti/sysbios/Bios.h> #include <ti/csl/csl_chip.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #define HEAPID 0 typedef struct{ MessageQ_MsgHeader header; Int message; }myMsg; Int status; Uint16 selfId; //SharedRegion_Entry entry; Char remoteQueueName[10]; Int main(Int argc, Char* argv[]){ selfId = CSL_chipReadReg(CSL_CHIP_DNUM); // determine the coreID System_printf("%s starting\n", MultiProc_getName(selfId)); /* Call Ipc_start() */ status = Ipc_start(); if (status < 0) { System_abort("Ipc_start failed!\n"); } /* get region 0 information */ //SharedRegion_getEntry(0, &entry); System_printf("main\n"); BIOS_start(); return 0; } Void messageQ_Slave(UArg arg0, UArg arg1){ HeapBufMP_Handle heapHandle; MessageQ_QueueId QueueId; MessageQ_Handle messageQ = NULL; MessageQ_Msg msg; System_printf("task\n"); /* Open heap created by other processor. Loop until open. */ do { status = HeapBufMP_open("myHeap", &heapHandle); //System_printf("%d\n", status); } while (status < 0); /* Register this heap with MessageQ */ MessageQ_registerHeap((IHeap_Handle)heapHandle, HEAPID); messageQ = MessageQ_create(remoteQueueName, NULL); if (messageQ == NULL){ System_abort("MessageQ_create failed\n"); } do { status = MessageQ_open(remoteQueueName, &QueueId); if (status < 0){ Task_sleep(1); } }while (status < 0); status = MessageQ_get(messageQ, &msg, MessageQ_FOREVER); if(status<0){ System_printf("this should not happen since timeout is forever"); } System_printf("Message sent by master is %d: \n", ((myMsg*)msg)->message); MessageQ_free(msg); //HeapBufMP_free(heapHandle, ,sizeof(myMsg)) BIOS_exit(0); }
Slave.cfg
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Memory = xdc.useModule('xdc.runtime.Memory');
Semaphore.supportsEvents = false;
var System = xdc.useModule('xdc.runtime.System');
var SysStd = xdc.useModule('xdc.runtime.SysStd');
System.SupportProxy = SysStd;
System.extendedFormats = "%$S%f";
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.clockEnabled = false;
BIOS.heapSize = 0x8000;
Program.sectMap[".msgQ_ptrs"] = new Program.SectionSpec();
Program.sectMap[".msgQ_ptrs"] = "L2SRAM";
Program.sectMap["platform_lib"] = new Program.SectionSpec();
Program.sectMap["platform_lib"] = "L2SRAM";
var PlatformLib = xdc.loadPackage('ti.platform.evmc6678l');
var cslSettings = xdc.useModule ('ti.csl.Settings');
var cacheEnabled = true;
var cacheLineSize = 128;
var procName = null;
var procNameList = [];
var Settings = xdc.module('ti.sdo.ipc.family.Settings');
var Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
var MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ');
var Notify = xdc.module('ti.sdo.ipc.Notify');
var Ipc = xdc.useModule('ti.sdo.ipc.Ipc');
var HeapBufMP = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');
Notify.SetupProxy = xdc.module(Settings.getNotifySetupDelegate());
MessageQ.SetupTransportProxy= xdc.module(Settings.getMessageQSetupDelegate());
/* Use shared memory IPC */
MessageQ.SetupTransportProxy = xdc.module('ti.sdo.ipc.transports.TransportShmSetup');
Program.global.TRANSPORTSETUP = MessageQ.SetupTransportProxy.delegate$.$name;
switch (Program.platformName) {
case "ti.sdo.ipc.examples.platforms.evm6678.core0":
case "ti.platforms.evm6678":
Program.global.USING_C6678 = 1;
Program.global.maxNumCores = 8;
procNameList = ["CORE0", "CORE1", "CORE2", "CORE3", "CORE4", "CORE5", "CORE6", "CORE7"];
Program.global.shmBase = 0x0C000000;
Program.global.shmSize = 0x00200000;
break;
case "ti.sdo.ipc.examples.platforms.evm6670.core0":
case "ti.platforms.evm6670":
Program.global.USING_C6670 = 1;
Program.global.maxNumCores = 4;
procNameList = ["CORE0", "CORE1", "CORE2", "CORE3"];
Program.global.shmBase = 0x0C000000;
Program.global.shmSize = 0x00200000;
break;
case "ti.sdo.ipc.examples.platforms.evm6670.core0":
case "ti.platforms.evm6657":
Program.global.USING_C6657 = 1;
Program.global.maxNumCores = 2;
procNameList = ["CORE0", "CORE1"];
Program.global.shmBase = 0x0C000000;
Program.global.shmSize = 0x00200000;
break;
default:
throw("Unsupported platform: " + Program.platformName);
}
var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
MultiProc.setConfig(procName, procNameList);
Program.global.DEVICENAME = Program.cpu.deviceName;
Program.global.PROCNAMES = procNameList.join(",");
Program.global.BUILDPROFILE = Program.build.profile;
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.translate = true;
SharedRegion.setEntryMeta(0,
{ base: Program.global.shmBase,
len: Program.global.shmSize,
ownerProcId: 0,
isValid: true,
cacheEnable: cacheEnabled,
cacheLineSize: cacheLineSize, /* Aligns allocated messages to a cache line */
createHeap: true,
name: "internal_shared_mem",
});
var task0Params = new Task.Params();
task0Params.instance.name = "task";
Program.global.task = Task.create("&messageQ_Slave", task0Params);
Task.allBlockedFunc = Task.allBlockedFunction;
BIOS.heapTrackEnabled = false;
Any help with this would be much appreciated!
Thanks in advance