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.

Multiple MessageQs

Hello everyone.

I have two very straightforward question.

1. Is it possible to have multiple MessageQs between same cores?

2. If the answer to 1. is yes, is there any limiting variable using which the no of allowed MessageQs can be controlled?

Thank you.

  • HI Saurabh,

    Yes it is possible for multiple queues to be managed be a single core. I myself have not used IPC much, but in CCS there is a very good help content for this topic. If you click on Help->Help Content and search for messageq it will provide a detailed explanation of the support package.

    Regards,

    Javier

  • Hello Javier,

    i meant in the post, multiple messageQs between multiple cores, not one.

    Also, it is possible to create multiple MessageQs. Unfortunately, the help content in CCS is not at all helpful. So, i tried and tried untill i figured out how it has to be done.

    For creating multiple messageQ, you will need multiple shared regions. By default, u can have upto 4. If u need mopre than 4, u can configure it by using the variable SharedRegion.numEntries and setting it to the desired value in .cfg file. Its advisable to create all the shared regions in core 0 itself.

    Also, the maximum no of MessageQs that can be create is controlled by the using the variable Message.maxRuntimeEntries in the .cfg file.

    I have tried creating upto 7 MsgQs between 8 cores is was successful.  I can post the .cfg files if required by anyone.

  • Hi Saurabh,

    Can you post the .cfg file?

    Thanks

  • Hi Johannes.

    I had attached the .cfg file. I'll also explain some of the statements that i have added in the .cfg file.

    First of all, you need to define shared regions for holding the MessageQs. Now, if u want to create two MessageQs you will need two heaps and thus two shared regions to hold those two heaps. So we can safely say that no of shared regions should be setup based on the no of MessageQs tht are to be created.

    Also you need to add these to xdc scripts statements

    1. MessageQ.numHeaps = X //! X being the no of messageQs u want to create since a messageQ requires a heap section.  The default value is 4.

    2. SharedRegion.numEntries = X //! Again, X being the no of no of messageQs u want to create and each message q needs a heap. the shared region hold a heap. Default value is 4.

    You can also check these settings in the ROV, to see whether all the SharedRegions, Heap sections and MessageQs are created properly.

    Let me know if this works out for u. In case of any doubt or query, pls contact me through this forum. I'll be more than happy to help.

  • /* 
     * Copyright (c) 2011, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     * */
    
    switch (Program.platformName) {
        case "ti.sdo.ipc.examples.platforms.evm6670":
            var nameList = ["CORE0", "CORE1", "CORE2", "CORE3"];
            break;
        case "ti.platforms.evm6678":
            var nameList = ["CORE0", "CORE1"];//, "CORE2", "CORE3", "CORE4", "CORE5", "CORE6", "CORE7"];
            break;
        default:
            throw("Platform " + Program.platformName + " not supported by this example"); 
            break;
    }
    
    /* BIOS/XDC modules */
    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 Memory 		= 	xdc.useModule('xdc.runtime.Memory')
    var SysMin 		= 	xdc.useModule('xdc.runtime.SysMin');
    var Text 		= 	xdc.useModule('xdc.runtime.Text');
    var System   	= 	xdc.useModule('xdc.runtime.System');
    var SysStd   	= 	xdc.useModule('xdc.runtime.SysStd');
    System.SupportProxy = SysStd;
    
    var BIOS 		= 	xdc.useModule('ti.sysbios.BIOS');
    var Hwi 		= 	xdc.useModule('ti.sysbios.hal.Hwi');
    var Swi 		= 	xdc.useModule('ti.sysbios.knl.Swi');
    var Task 		= 	xdc.useModule('ti.sysbios.knl.Task');
    var Clock 		= 	xdc.useModule('ti.sysbios.knl.Clock');
    var Event 		= 	xdc.useModule('ti.sysbios.knl.Event');
    var Semaphore 	= 	xdc.useModule('ti.sysbios.knl.Semaphore');
    
    /*
     * The BIOS module will create the default heap for the system.
     * Specify the size of this default heap.
     */
    BIOS.heapSize   = 0x10000;
    
    /* 
     * Program.argSize sets the size of the .args section. 
     * The examples don't use command line args so argSize is set to 0.
     */
    Program.argSize = 0x0;
    
    /* 
    ** Create the stack Thread Task for our application.
    */
    var tsk				=		Task.create("&tsk0_func");
    tsk.instance.name 		= 		"Task0_func";
    
    /*
     * 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;
     */
    
    /* System stack size (used by ISRs and Swis) */
    Program.stack = 0x2000;
    
    /* Circular buffer size for System_printf() */
    SysMin.bufSize = 0x200;
    
    /* 
     * Create and install logger for the whole system
     */
    var loggerBufParams = new LoggerBuf.Params();
    loggerBufParams.numEntries = 16;
    var logger0 = LoggerBuf.create(loggerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.ALWAYS_ON;
    
    
    /* Modules explicitly used in the application */
    var Ipc         = xdc.useModule('ti.sdo.ipc.Ipc');
    /* Synchronize all processors (this will be done in Ipc_start) */
    Ipc.procSync = Ipc.ProcSync_ALL;
    
    var HeapBufMP   = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');
    
    var MultiProc   = xdc.useModule('ti.sdo.utils.MultiProc');
    MultiProc.setConfig(null, nameList);
    
    var MessageQ    = xdc.useModule('ti.sdo.ipc.MessageQ');
    MessageQ.numHeaps = 7;
    
    /*
    ** Load DSPLIB Module 
    */
    xdc.loadPackage('ti.dsplib');
    
    /* 
     *  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.
     */ 
    /* Shared Memory base address and length */
    var SHAREDMEM           = 	0x0C000000;
    var SHAREDMEMSIZE       = 	0x00002000;
    
    var SharedRegion 		= 	xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.numEntries = 	7;
    
    SharedRegion.setEntryMeta(0,
        { base: SHAREDMEM, 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_0",
        });
        
    SharedRegion.setEntryMeta(1,
        { base: SHAREDMEM+SHAREDMEMSIZE, 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_1",
        });
        
    SharedRegion.setEntryMeta(2,
        { base: SHAREDMEM+(2*SHAREDMEMSIZE), 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_2",
        });
        
    SharedRegion.setEntryMeta(3,
        { base: SHAREDMEM+(3*SHAREDMEMSIZE), 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_3",
        });
        
    SharedRegion.setEntryMeta(4,
        { base: SHAREDMEM+(4*SHAREDMEMSIZE), 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_4",
        });
        
    SharedRegion.setEntryMeta(5,
        { base: SHAREDMEM+(5*SHAREDMEMSIZE), 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_5",
        });
        
    SharedRegion.setEntryMeta(6,
        { base: SHAREDMEM+(6*SHAREDMEMSIZE), 
          len:  SHAREDMEMSIZE,
          ownerProcId: 0,
          isValid: true,
          name: "DDR3_SHARED_6",
        });

    Sorry Johannes, the attachment wasnt getting displayed in the previous reply. Jus rename the file to .cfg.