Hi, all. I am developing on an EVMK2H. I am trying to build an IPC example that sends a simple message from DSP0 to DSP1 using messageQ with SharedMemory L2SRAM. I am setting the ipc to IPC_ProcSync_ALL. However, the Ipc_start() call failed on both of the cores. Same thing happened when I was set Ipc to IPC_ProcSync_Pair. Ipc_attach() failed too. I am attaching the zipped project. I am attaching the main function and the .cfg file down below. Thank you
/*
* ======== main.c ========
*/
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <xdc/runtime/Log.h>
#include <ti/sysbios/knl/Task.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/Diags.h>
#include <xdc/runtime/Error.h>
// ipc headers
#include <ti/ipc/Ipc.h>
#include <ti/sdo/utils/MultiProc.h>
//#include <ti/sdo/ipc/MessageQ.h>
//#include <ti/ipc/SharedRegion.h>
#include <ti/ipc/MessageQ.h>
#include <ti/ipc/SharedRegion.h>
#include "msg.h"
#define Heap_ID 2
#define size = sizeof(MessageQ_MsgHeader) + 5
/*
* ======== taskFxn ========
*/
Void taskFxn();
Void msgWriter();
Void msgReader();
/*
* ======== main ========
*/
Int main()
{
/*
* use ROV->SysMin to view the characters in the circular buffer
*/
System_printf("enter main()\n");
//UInt16 CORE_ID = MultiProc_self();
Error_Block eb;
Task_Params taskParams;
System_printf("enter main()\n");
Task_Params_init(&taskParams);
taskParams.instance->name = "taskFxn";
taskParams.stackSize = 0x1000;
Error_init(&eb);
Task_create(taskFxn, &taskParams, &eb);
if (Error_check(&eb)) {
System_abort("main: failed to create application thread");
}
BIOS_start(); /* does not return */
return(0);
}
Void taskFxn()
{ System_printf("enter task function");
UInt16 coreID = MultiProc_self();
if (coreID == (UInt16)1)
{
msgWriter();
}
else{
msgReader();
}
}
Void msgWriter(Void) {
System_printf("enter writer function");
Int status = Ipc_start();
if (status < 0) {
System_abort("Ipc_start failed\n");
}
System_printf("IPC ready");
/*
do {
UInt16 id = MultiProc_getId("CORE1");
status = Ipc_attach(id);
} while (status == Ipc_E_NOTREADY);
*/
// allocate a message
Ptr heap;
heap = SharedRegion_getHeap(0);
MessageQ_registerHeap(heap,Heap_ID);
app_msg *msg;
MessageQ_QueueId qid;
do {
status =MessageQ_open("myQ",&qid);
} while (status == MessageQ_E_NOTFOUND );
System_printf("messageQ opened succesfully");
while (1)
{
msg = (app_msg * ) MessageQ_alloc(Heap_ID,sizeof(app_msg));
char payload[] ="hello";
(*msg).msg = payload;
MessageQ_put (qid, (MessageQ_Msg) msg);
}
}
Void msgReader (Void) {
System_printf("enter reader function");
Int status = Ipc_start();
if (status < 0) {
System_abort("Ipc_start failed\n");
}
System_printf( "App_taskFxn: ipc ready");
/*
do {
UInt16 id =MultiProc_getId("CORE1");
status = Ipc_attach(id);
} while (status == Ipc_E_NOTREADY );
System_printf("ipc to dsp core 1 ready ");
*/
Ptr heap = SharedRegion_getHeap(0);
MessageQ_Handle que;
app_msg *msg;
MessageQ_registerHeap(heap,Heap_ID);
que = MessageQ_create("myQ", NULL);
while(1)
{
MessageQ_get(que,(MessageQ_Msg *)&msg,MessageQ_FOREVER);
char *payload = msg->msg;
System_printf("the payload is %s\n",payload);
MessageQ_free((MessageQ_Msg) msg);
}
}
Configuration file :
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var SysMin = xdc.useModule('xdc.runtime.SysMin');
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var Program = xdc.useModule('xdc.cfg.Program');
var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var SysStd = xdc.useModule('xdc.runtime.SysStd');
//var Program = xdc.useModule('xdc.cfg.Program');
//var cfgA4rgs = Program.build.cfgArgs;
//var RB = (cfgArgs.profile == "release" ? true : false);
/*
* Uncomment this line to globally disable Asserts.
* All modules inherit the default from the 'Defaults' module. You
* can override these defaults on a per-module basis using Module.common$.
* Disabling Asserts will save code space and improve runtime performance.
Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF;
*/
/*
* Uncomment this line to keep module names from being loaded on the target.
* The module name strings are placed in the .const section. Setting this
* parameter to false will save space in the .const section. Error and
* Assert messages will contain an "unknown module" prefix instead
* of the actual module name.
*/
Defaults.common$.namedModule = false;
/*
* Minimize exit handler array in System. The System module includes
* an array of functions that are registered with System_atexit() to be
* called by System_exit().
*/
System.maxAtexitHandlers = 4;
/*
* Uncomment this line to disable the Error print function.
* We lose error information when this is disabled since the errors are
* not printed. Disabling the raiseHook will save some code space if
* your app is not using System_printf() since the Error_print() function
* calls System_printf().
Error.raiseHook = null;
*/
/*
* Uncomment this line to keep Error, Assert, and Log strings from being
* loaded on the target. These strings are placed in the .const section.
* Setting this parameter to false will save space in the .const section.
* Error, Assert and Log message will print raw ids and args instead of
* a formatted message.
*/
Text.isLoaded = false;
/*
* Uncomment this line to disable the output of characters by SysMin
* when the program exits. SysMin writes characters to a circular buffer.
* This buffer can be viewed using the SysMin Output view in ROV.
*/
SysMin.flushAtExit = false;
/*
* The BIOS module will create the default heap for the system.
* Specify the size of this default heap.
*/
BIOS.heapSize = 0xA000;
/* System stack size (used by ISRs and Swis) */
Program.stack = 0x1000;
/* Circular buffer size for System_printf() */
SysMin.bufSize = 128;
/*
* Create and install logger for the whole system
*/
var loggerBufParams = new LoggerBuf.Params();
loggerBufParams.numEntries = 4;
var logger0 = LoggerBuf.create(loggerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.ALWAYS_ON;
System.SupportProxy = SysStd;
/*
* Build a custom BIOS library. The custom library will be smaller than the
* pre-built "instrumented" (default) and "non-instrumented" libraries.
*
* The BIOS.logsEnabled parameter specifies whether the Logging is enabled
* within BIOS for this custom build. These logs are used by the RTA and
* UIA analysis tools.
*
* The BIOS.assertsEnabled parameter specifies whether BIOS code will
* include Assert() checks. Setting this parameter to 'false' will generate
* smaller and faster code, but having asserts enabled is recommended for
* early development as the Assert() checks will catch lots of programming
* errors (invalid parameters, etc.)
*/
BIOS.libType = BIOS.LibType_Custom;
BIOS.logsEnabled = false;
BIOS.assertsEnabled = true;
/* ipc configuration */
/* root of the configuration object model */
//Program.stack = 0x1000;
/* ipc setup */
var Ipc = xdc.useModule('ti.sdo.ipc.Ipc');
Ipc.procSync = Ipc.ProcSync_ALL;
Ipc.sr0MemorySetup = true;
//Needd to use Ipc_Attach later in run time
/* messageQ setup */
var MesaageQ = xdc.useModule('ti.sdo.ipc.MessageQ');
/* multiProc setup */
var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
var procNameAry = [ "CORE0", "CORE1", "CORE2", "CORE3", "CORE4", "CORE5",
"CORE6", "CORE7" ,"HOST"];
MultiProc.setConfig("CORE1", procNameAry);
/* sharedRegion setup */
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
var L2SRAM = Program.cpu.memoryMap["L2SRAM"];
print("L2SRAM info ");
print(L2SRAM.base.toString(16));
print(L2SRAM.len.toString(16));
SharedRegion.setEntryMeta(0,
new SharedRegion.Entry({base: 0x800000,
name: "L2SRAM_shared",
len: 0x010000 ,
ownerProcId: 0,
isValid: true,
cacheEnable: true
})
);
/* select ipc libraries */
var Build = xdc.useModule('ti.sdo.ipc.Build');
Build.libType = (true ? Build.LibType_NonInstrumented : Build.LibType_Debug);
Build.assertsEnabled = (true ? false : true);
Build.logsEnabled = (true ? false : true);