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.

qmssIpcBenchmark _questions about messageQ

1.First question

Core0 send the same msg to core1-7core1-7 receive the msg after core1-7 do their taskcore1-7 send the msg to core 0but core0 can not get the msg from core1-7it is successful

When i make a loop in the codeit can loop two timesthen it error

ti.sdo.ipc.MessageQ: line 257: assertion failure: A_heapIdInvalid: heapId is invalid

xdc.runtime.Error.raise: terminating execution

the code is :

 

/* --COPYRIGHT--,BSD
 * 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.
 * --/COPYRIGHT--*/
#include<stdio.h>
#include <xdc/std.h>
#include <xdc/cfg/global.h>

/* XDC.RUNTIME module Headers */
#include <xdc/runtime/System.h>
#include <xdc/runtime/IHeap.h>
#include <xdc/runtime/Timestamp.h>

/* IPC module Headers */
#include <ti/ipc/MultiProc.h>
#include <ti/ipc/MessageQ.h>
#include <ti/ipc/SharedRegion.h>

/* PDK module Headers */
#include <ti/platform/platform.h>

/* BIOS6 module Headers */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/family/c66/Cache.h>

/* CSL modules */
#include <ti/csl/csl_cacheAux.h>
#include <ti/csl/csl_chip.h>

/* QMSS LLD*/
#include <ti/drv/qmss/qmss_drv.h>
#include <ti/drv/qmss/qmss_firmware.h>

/* CPPI LLD */
#include <ti/drv/cppi/cppi_drv.h>
 
#include <ti/transport/ipc/examples/common/bench_common.h>

#include <ti/transport/ipc/qmss/transports/TransportQmss.h>

/************************ EXTERN VARIABLES ********************/
/* QMSS device specific configuration */
extern Qmss_GlobalConfigParams  qmssGblCfgParams;
/* CPPI device specific configuration */
extern Cppi_GlobalConfigParams  cppiGblCfgParams;
/**************************************************************/

#define NUM_MONOLITHIC_DESC         numDescriptors
#define SIZE_MONOLITHIC_DESC        descriptorSize
#define MONOLITHIC_DESC_DATA_OFFSET 16

#define HEAP_ID         0

/* Number of times to run the loop */
#define NUMLOOPS        100
#define NUMIGNORED      (5)
#define NUM_MSGS        (10)

/* Benchmark parameters */
Char localQueueName[6];
Char nextQueueName[6];
Char prevQueueName[6];
//Char core_temp[6];

UInt numCores = 0;
UInt16 prevCoreId;

UInt16 selfId;
UInt64 timeAdj = 0;
Types_FreqHz timerFreq, cpuFreq;

/* Results */
UInt32 rawtimestamps[NUMLOOPS];
UInt32 latencies[NUMLOOPS - 1];

MessageQ_Handle messageQ =NULL;
MessageQ_QueueId  prevQueueId;
MessageQ_QueueId  nextQueueId,nextQueueId1,nextQueueId2,nextQueueId3,nextQueueId4,nextQueueId4,nextQueueId5,nextQueueId6,nextQueueId7;

UInt64 timeLength = 0;

Float cpuTimerFreqRatio;
Statistics latencyStats;

/* Descriptor pool [Size of descriptor * Number of descriptors] */
/* place this monolithic descritor pool in shared memory */
#pragma DATA_SECTION (monolithicDesc, ".desc");
#pragma DATA_ALIGN (monolithicDesc, 16)
UInt8               monolithicDesc[SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC];

#define NUM_MSGS_TO_PREALLOC (8000)

#pragma DATA_SECTION (txMsgPtrs, ".msgQ_ptrs");
TstMsg *txMsgPtrs[NUM_MSGS_TO_PREALLOC];

#pragma DATA_SECTION (rxMsgPtrs, ".msgQ_ptrs");
TstMsg *rxMsgPtrs[NUM_MSGS_TO_PREALLOC];

/**
 *  @b Description
 *  @n  
 *      This functions prints the statistics gathered for the transport during
 *      the latency test.
 */

void convertyuv422torgb565( unsigned char inbuf[],unsigned char outbuf[],int width,int height)
{
  int rows,cols;
  int y,u,v,r,g,b,rdif,invgdif,bdif;
  int YPOS,UPOS,VPOS;
  YPOS=0;
  UPOS=1;
  VPOS=3;
  for(rows=0;rows<height;rows++)
  {
    for(cols=0;cols<width;cols++)
    {
         y = inbuf[YPOS+cols*2+rows*1920*2];
		 if(cols%2==0)
		 {
                u = inbuf[UPOS+cols*2+rows*1920*2] - 128;
                v = inbuf[VPOS+cols*2+rows*1920*2] - 128;
		 }else{
         u = inbuf[UPOS+(cols-1)*2+rows*1920*2] - 128;
         v = inbuf[VPOS+(cols-1)*2+rows*1920*2] - 128;
		 }
         rdif = v + ((v * 103) >> 8);
         invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
         bdif = u +( (u*198) >> 8);

         r = y + rdif;
         g = y - invgdif;
         b = y + bdif;
         r=r>255?255:(r<0?0:r);
         g=g>255?255:(g<0?0:g);
         b=b>255?255:(b<0?0:b);
		 *(outbuf++) =( ((g & 0x1C) << 3) | ( b >> 3) );
         *(outbuf++) =( (r & 0xF8) | ( g >> 5) );
    }
  }
}



/**
 *  @b Description
 *  @n  
 *      This function initalizes the platform.  It has called at startup.  This is defined in the
 *      .cfg file via the Startup.firstFxns.$add('&initPlatform'); definition.
 */
void initPlatform(void)
{
  platform_init_flags  pFormFlags;
  platform_init_config pFormConfig;
  /* Status of the call to initialize the platform */
  UInt32 pFormStatus;

  /* Only run on single core */
  if (CSL_chipReadReg (CSL_CHIP_DNUM) == 0)
  {
    /*
     * You can choose what to initialize on the platform by setting the following
     * flags. Things like the DDR, PLL, etc should have been set by the boot loader.
    */
    memset( (void *) &pFormFlags,  0, sizeof(platform_init_flags));
    memset( (void *) &pFormConfig, 0, sizeof(platform_init_config));

    pFormFlags.pll = 0; /* PLLs for clocking  	*/
    pFormFlags.ddr  = 0; /* External memory 		*/
    pFormFlags.tcsl = 1; /* Time stamp counter 	*/
    pFormFlags.phy  = 0; /* Ethernet 			*/
    pFormFlags.ecc  = 0; /* Memory ECC 			*/

    pFormConfig.pllm = 0;	/* Use libraries default clock divisor */

    pFormStatus = platform_init(&pFormFlags, &pFormConfig);

    /* If we initialized the platform okay */
    if (pFormStatus != Platform_EOK)
    {
  	 /* Initialization of the platform failed. */
  	 System_printf("Platform failed to initialize. Error code %d \n", pFormStatus);
    }
  }
}



void convert_func(){
Int       status;
int i;
//UInt numReceived;
MessageQ_Msg     msg;
UInt64 timeStamp=0;
UInt64 timeAdj=0;
double throughPut;

if (selfId == 0) {
	System_printf("tsk0. selfproc=%d nextQueueName (%s) openned, nextQueueId=%d-%d-%d-%d-%d-%d-%d\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE1-7", nextQueueId1,nextQueueId2,nextQueueId3,nextQueueId3,nextQueueId4,nextQueueId5,nextQueueId6,nextQueueId7);
    msg= MessageQ_alloc(HEAP_ID, MESSAGE_SIZE_IN_BYTES);
    if (msg== NULL) {
       System_abort("MessageQ_alloc failed\n");
    }
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE1-7", msg);
    status = MessageQ_put(nextQueueId1, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId2, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId3, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId4, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId5, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId6, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }    status = MessageQ_put(nextQueueId7, msg);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    System_printf("core 0 MessageQ_put done\n");

	System_printf("convert start\n");
    /* Take time at start of test */
    timeStamp = getStartTime64();
	convertyuv422torgb565( (uint8_t *)0x90000000,(uint8_t *)0x91000000,1920,1080/8);
    for(i=1;i<=7;i++){
    status = MessageQ_get(messageQ, &msg, MessageQ_FOREVER);
    if (status < 0) {
        System_abort("MessageQ_get failed\n");
    }
    //System_printf("MessageQ_get %d time\n",i);
    }

    //System_printf("convert done\n");

    /* Get execution time to transfer all messages */
    timeLength = getExecutionTime64(timeStamp, timeAdj);
    throughPut = (double)CYCLES_TO_US(timeLength, 1000000000);
    System_printf("covert time is %f us\n",throughPut);
    //��DDR 91000000����ʼ����ת����rgb����
//	FILE *fp2;
//	fp2=fopen("conpspyzj.rgb","ab");
//	fwrite((void *)0x91000000, 1, 720*480*2, fp2);
//	fclose(fp2);
    MessageQ_free(msg);
}

if(1<=selfId <= 7){
	//System_printf("tsk0. selfproc=%d nextQueueName (%s) openned, nextQueueId=%d\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE0", nextQueueId);
	//System_printf("core %d call MessageQ_get",selfId);
    status = MessageQ_get(messageQ, &msg, MessageQ_FOREVER);
    if (status < 0) {
        System_abort("MessageQ_get failed\n");
    }
	convertyuv422torgb565( (uint8_t *)(0x90000000+(1920*1080/4)*selfId),(uint8_t *)(0x91000000+(1920*1080/4)*selfId),1920,1080/8);

			//System_printf("core %d call MessageQ_put\n ",selfId);
		    status = MessageQ_put(nextQueueId, msg);
		    if (status < 0) {
		        System_abort("MessageQ_put failed\n");
		    }
}
}

/**
 *  @b Description
 *  @n  
 *      This configures the descriptor region and initializes CPPI, and QMSS.
 *      This function should only be called once per chip.
 *
 *  @retval
 *      Success     - 0
 *  @retval
 *      Error       - <0
 */
Int32 systemInit (Void)
{
  Qmss_InitCfg qmssInitConfig;   /* QMSS configuration */
  Qmss_MemRegInfo memInfo; /* Memory region configuration information */
  Qmss_Result result;
  UInt32 coreNum;
  
  coreNum = CSL_chipReadReg (CSL_CHIP_DNUM);

  System_printf ("\n-----------------------Initializing---------------------------\n");
  
  System_printf ("Core %d : L1D cache size %d. L2 cache size %d.\n", coreNum, CACHE_getL1DSize(), CACHE_getL2Size());

  memset ((Void *) &qmssInitConfig, 0, sizeof (Qmss_InitCfg));
  
  /* Set up the linking RAM. Use the internal Linking RAM. 
   * LLD will configure the internal linking RAM address and maximum internal linking RAM size if 
   * a value of zero is specified.
   * Linking RAM1 is not used */
  qmssInitConfig.linkingRAM0Base = 0;
  qmssInitConfig.linkingRAM0Size = 0;
  qmssInitConfig.linkingRAM1Base = 0;
  qmssInitConfig.maxDescNum      = NUM_MONOLITHIC_DESC /*+ total of other descriptors here */;

#ifdef xdc_target__bigEndian
  qmssInitConfig.pdspFirmware[0].pdspId = Qmss_PdspId_PDSP1;
  qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_be;
  qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_be);
#else
  qmssInitConfig.pdspFirmware[0].pdspId = Qmss_PdspId_PDSP1;
  qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_le;
  qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_le);
#endif

  /* Initialize Queue Manager SubSystem */    //Qmss_init
  result = Qmss_init (&qmssInitConfig, &qmssGblCfgParams);
  if (result != QMSS_SOK)
  {
      System_printf ("Error Core %d : Initializing Queue Manager SubSystem error code : %d\n", coreNum, result);
      return -1;
  }

  //Cppi_init
  result = Cppi_init (&cppiGblCfgParams);
  if (result != CPPI_SOK)
  {
      System_printf ("Error Core %d : Initializing CPPI LLD error code : %d\n", coreNum, result);
  }

  System_printf ("address of monolithicDesc[] = 0x%x. Converted=0x%x\n", monolithicDesc, l2_global_address ((UInt32) monolithicDesc));

  /* Setup memory region for monolithic descriptors */
  memset ((Void *) &monolithicDesc, 0, SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC);
  memInfo.descBase       = (UInt32 *) monolithicDesc;	/* descriptor pool is in MSMC */
  memInfo.descSize       = SIZE_MONOLITHIC_DESC;
  memInfo.descNum        = NUM_MONOLITHIC_DESC;
  memInfo.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR;
  memInfo.memRegion      = (Qmss_MemRegion) descriptorMemRegion;
  memInfo.startIndex     = 0;

  result = Qmss_insertMemoryRegion (&memInfo);
  if (result < QMSS_SOK)
  {
      System_printf ("Error Core %d : Inserting memory region %d error code : %d\n", coreNum, memInfo.memRegion, result);
      return -1;
  }
  else
  {
      System_printf ("Core %d : Memory region %d inserted\n", coreNum, result);
  }

  /* Writeback the descriptor pool.  Writeback all data cache.
    * Wait until operation is complete. */    
  Cache_wb (monolithicDesc, 
                     SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC,
                     Cache_Type_ALLD, TRUE);
  
  return 0;
}

/**
 *  @b Description
 *  @n  
 *      Task which kicks off the latency and throughput tests
 */
Void tsk0(UArg arg0, UArg arg1)
{
    Int status;
    Int cnt=10;
    System_printf("tsk0 starting\n");

    /* Register this heap with MessageQ */
    if(selfId==0){
    MessageQ_registerHeap((IHeap_Handle)SharedRegion_getHeap(0), HEAP_ID);

    /* Open the 'next' remote message queue. Spin until it is ready. */
    do {
        status = MessageQ_open("CORE1", &nextQueueId1);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE2", &nextQueueId2);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE3", &nextQueueId3);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE4", &nextQueueId4);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE5", &nextQueueId5);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE6", &nextQueueId6);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE7", &nextQueueId7);
        Task_yield();
    }
    while (status < 0);
    }

    else{
    MessageQ_registerHeap((IHeap_Handle)SharedRegion_getHeap(0), HEAP_ID);
    do {
        status = MessageQ_open("CORE0", &nextQueueId);
        Task_yield();
    }
    while (status < 0);
    }
    while(cnt--){
    convert_func();
    System_printf("cnt=%d\n",cnt);
    }

    detachAll(MultiProc_getNumProcessors());
    System_exit(0);
}

/**
 *  @b Description
 *  @n  
 *      Main - Initialize the system and start BIOS
 */
Int main(Int argc, Char* argv[])
{
  Int32 result = 0;
  Types_Timestamp64 time64;
  UInt64 timeStamp = 0;

  Timestamp_getFreq(&timerFreq);	//Get the timestamp timer's frequency (in Hz) ��ʱ��
  System_printf("timerFreq.lo = %d. timerFreq.hi = %d\n", timerFreq.lo, timerFreq.hi);

  BIOS_getCpuFreq(&cpuFreq);	//Get CPU frequency in Hz
  System_printf("cpuFreq.lo = %d. cpuFreq.hi = %d\n", cpuFreq.lo, cpuFreq.hi);
  
  cpuTimerFreqRatio = (Float)cpuFreq.lo / (Float)timerFreq.lo;	//=1

  Timestamp_get64(&time64);		//Return a 64-bit timestamp
  timeStamp = TIMESTAMP64_TO_UINT64(time64.hi,time64.lo);
  timeAdj = TIMESTAMP64_TO_UINT64(time64.hi,time64.lo) - timeStamp;	//=0

  selfId = CSL_chipReadReg (CSL_CHIP_DNUM);
  
  System_printf("Core (\"%s\") starting\n", MultiProc_getName(selfId));
  
  if (numCores == 0) {
      numCores = 8;	//MultiProc_getNumProcessors();	 Number of processors configured with MultiProc   =2
  }

  if (selfId == 0)
  {
    /* QMSS, and CPPI system wide initializations are run on
      * this core */
    result = systemInit();		//systemInit
    if (result != 0) 
    {
    System_printf("Error (%d) while initializing QMSS\n", result);
    }
//	FILE *fp1;
//	fp1=fopen("conpsp.yuv","r");
//    fread((void *)0x90000000,1,720*480*2,fp1);
//    fclose(fp1);
//    System_printf("fread done\n");
    /* Attach all cores. */
    attachAll(numCores);
    System_printf("core 0 exec attachAll done\n");

//    prevCoreId = "1/2/3/4/5/6/7";
//
    System_sprintf(localQueueName, "CORE%d", selfId);		//localQueueName��ȫ�ֱ���
//    System_sprintf(nextQueueName, "CORE%s","1/2/3/4/5/6/7");
//    System_sprintf(prevQueueName, "CORE%s", prevCoreId);	//System_sprintf���Ǵ�ӡ����ʹprevQueueNameΪ��CORE%d���ַ���
//
//    System_printf("localQueueName=%s. nextQueueName=%s. prevQueueName=%s\n",
//                    localQueueName,  nextQueueName, prevQueueName);

    /* Create a message queue. */
    messageQ = MessageQ_create(localQueueName, NULL);
    if (messageQ== NULL) {
        System_abort("MessageQ_create failed\n" );
    }

  }
  else{

  /* Attach all cores. */
  attachAll(numCores);
     
  prevCoreId = 0;

  System_sprintf(localQueueName, "CORE%d", selfId);		//localQueueName��ȫ�ֱ���
  System_sprintf(nextQueueName, "CORE%d",0);
  System_sprintf(prevQueueName, "CORE%d", prevCoreId);	//System_sprintf���Ǵ�ӡ����ʹprevQueueNameΪ��CORE%d���ַ���

  System_printf("localQueueName=%s. nextQueueName=%s. prevQueueName=%s\n", 
                  localQueueName,  nextQueueName, prevQueueName);
        
  /* Create a message queue. */
  messageQ = MessageQ_create(localQueueName, NULL);
  if (messageQ== NULL) {
      System_abort("MessageQ_create failed\n" );
  }
  }

  BIOS_start();

  System_printf("done BIOS_start\n");

  return (0);
}


the log is:

[C66xx_6] timerFreq.lo = 1000000000. timerFreq.hi = 0
cpuFreq.lo = 1000000000. cpuFreq.hi = 0
Core ("CORE6") starting
[C66xx_7] timerFreq.lo = 1000000000. timerFreq.hi = 0
cpuFreq.lo = 1000000000. cpuFreq.hi = 0
Core ("CORE7") starting
[C66xx_0] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_1] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_2] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_3] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_4] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_5] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_0] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_1] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_2] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_3] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_4] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_5] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_0] Core ("CORE0") starting
[C66xx_1] Core ("CORE1") starting
[C66xx_2] Core ("CORE2") starting
[C66xx_3] Core ("CORE3") starting
[C66xx_4] Core ("CORE4") starting
[C66xx_5] Core ("CORE5") starting
[C66xx_0] 
-----------------------Initializing---------------------------
Core 0 : L1D cache size 4. L2 cache size 0.
address of monolithicDesc[] = 0xc100000. Converted=0x1c100000
Core 0 : Memory region 0 inserted
core 0 exec attachAll done
tsk0 starting
[C66xx_1] localQueueName=CORE1. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_2] localQueueName=CORE2. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_3] localQueueName=CORE3. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_4] localQueueName=CORE4. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_5] localQueueName=CORE5. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_6] localQueueName=CORE6. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_7] localQueueName=CORE7. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_1] tsk0 starting
[C66xx_2] tsk0 starting
[C66xx_3] tsk0 starting
[C66xx_4] tsk0 starting
[C66xx_5] tsk0 starting
[C66xx_6] tsk0 starting
[C66xx_7] tsk0 starting
[C66xx_0] tsk0. selfproc=0 nextQueueName (CORE1-7) openned, nextQueueId=65536-131072-196608-196608-262144-327680-393216
tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1-7). msg=0xc040380
core 0 MessageQ_put done
convert start
covert time is 16410.0000 us


//
    while(cnt--){
    convert_func();
    System_printf("cnt=%d\n",cnt);
    }

[C66xx_6] timerFreq.lo = 1000000000. timerFreq.hi = 0
cpuFreq.lo = 1000000000. cpuFreq.hi = 0
Core ("CORE6") starting
[C66xx_0] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_1] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_2] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_3] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_7] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_0] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_1] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_2] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_3] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_7] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_0] Core ("CORE0") starting
[C66xx_1] Core ("CORE1") starting
[C66xx_2] Core ("CORE2") starting
[C66xx_3] Core ("CORE3") starting
[C66xx_7] Core ("CORE7") starting
[C66xx_0] 
-----------------------Initializing---------------------------
Core 0 : L1D cache size 4. L2 cache size 0.
address of monolithicDesc[] = 0xc100000. Converted=0x1c100000
Core 0 : Memory region 0 inserted
[C66xx_4] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_5] timerFreq.lo = 1000000000. timerFreq.hi = 0
[C66xx_4] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_5] cpuFreq.lo = 1000000000. cpuFreq.hi = 0
[C66xx_4] Core ("CORE4") starting
[C66xx_5] Core ("CORE5") starting
localQueueName=CORE5. nextQueueName=CORE0. prevQueueName=CORE0
tsk0 starting
[C66xx_0] core 0 exec attachAll done
[C66xx_1] localQueueName=CORE1. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_2] localQueueName=CORE2. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_3] localQueueName=CORE3. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_4] localQueueName=CORE4. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_6] localQueueName=CORE6. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_7] localQueueName=CORE7. nextQueueName=CORE0. prevQueueName=CORE0
[C66xx_0] tsk0 starting
[C66xx_1] tsk0 starting
[C66xx_2] tsk0 starting
[C66xx_3] tsk0 starting
[C66xx_4] tsk0 starting
[C66xx_6] tsk0 starting
[C66xx_7] tsk0 starting
[C66xx_0] tsk0. selfproc=0 nextQueueName (CORE1-7) openned, nextQueueId=65536-131072-196608-196608-262144-327680-393216
tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1-7). msg=0xc040380
core 0 MessageQ_put done
convert start
covert time is 16410.0000 us
[C66xx_1] cnt=9
[C66xx_2] cnt=9
[C66xx_3] cnt=9
[C66xx_4] cnt=9
[C66xx_5] cnt=9
[C66xx_6] cnt=9
[C66xx_7] cnt=9
[C66xx_0] cnt=9
tsk0. selfproc=0 nextQueueName (CORE1-7) openned, nextQueueId=65536-131072-196608-196608-262144-327680-393216
tsk0. selfProc=0 calling MessageQ_put(nextQueueName=CORE1-7). msg=0xc040380
core 0 MessageQ_put done
convert start
[C66xx_1] cnt=8
[C66xx_2] cnt=8
[C66xx_3] cnt=8
[C66xx_4] cnt=8
[C66xx_5] cnt=8
[C66xx_6] cnt=8
[C66xx_7] cnt=8
[C66xx_0] covert time is 16411.0000 us
ti.sdo.ipc.MessageQ: line 257: assertion failure: A_heapIdInvalid: heapId is invalid
xdc.runtime.Error.raise: terminating execution

2.Second question

But when i add the pcie interrupt contextit is not successful

Core0 send the same msg to core1-7core1-7 receive the msg after core1-7 do their taskcore1-7 send the msg to core 0but core0 can not get the msg from core1-7core0 status is idle.why

the code is:

/* --COPYRIGHT--,BSD
 * 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.
 * --/COPYRIGHT--*/
#include<stdio.h>
#include <xdc/std.h>
#include <xdc/cfg/global.h>

/* XDC.RUNTIME module Headers */
#include <xdc/runtime/System.h>
#include <xdc/runtime/IHeap.h>
#include <xdc/runtime/Timestamp.h>

/* IPC module Headers */
#include <ti/ipc/MultiProc.h>
#include <ti/ipc/MessageQ.h>
#include <ti/ipc/SharedRegion.h>

/* PDK module Headers */
#include <ti/platform/platform.h>

/* BIOS6 module Headers */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/family/c66/Cache.h>

/* CSL modules */
#include <ti/csl/csl_cacheAux.h>
#include <ti/csl/csl_chip.h>

/* QMSS LLD*/
#include <ti/drv/qmss/qmss_drv.h>
#include <ti/drv/qmss/qmss_firmware.h>

/* CPPI LLD */
#include <ti/drv/cppi/cppi_drv.h>
 
#include <ti/transport/ipc/examples/common/bench_common.h>

#include <ti/transport/ipc/qmss/transports/TransportQmss.h>

#define uint32  unsigned int
#define int32   int
#define PCIEXpress_Legacy_INTA                 50
#define PCIE_IRQ_EOI                   0x21800050
#define PCIE_EP_IRQ_SET		           0x21800064
#define PCIE_LEGACY_A_IRQ_STATUS       0x21800184
#define INTC0_OUT3     63

#define BOOT_MAGIC_ADDRESS             0x87FFFC // for C6678
#define BOOT_ENTRY_ADDRESS             0x800000
#define IPC_INTERRUPT_CORE0            0x02620240
#define IPC_INTERRUPT_CORE1            0x02620244
#define IPC_INTERRUPT_CORE2            0x02620248
#define IPC_INTERRUPT_CORE3            0x0262024c

#define DEVICE_REG32_W(x,y)   *(volatile unsigned int *)(x)=(y)
#define DEVICE_REG32_R(x)    (*(volatile unsigned int *)(x))

/* undocumented register in data manual
 * Bit 0 of this register is supposed to give the status of PCIe PLL lock*/
#define PCIE_STS_REG    0x262015C

/* Workaround for PCIe boot mode support for C6678/C6670 */
/* This is a temporary workaround should be removed once fixed in RBL */

/* PCIe Config register base on C6678/C6670 */
#define PCIE_BASE_ADDR 0x21800000

/* PCIe Application registers */
#define PCIE_APP_CMD_STATUS  0x4
#define PCIE_APP_OB_SIZE     0x30
#define PCIE_APP_SERDES_CFG0 0x390
#define PCIE_APP_SERDES_CFG1 0x394

/* PCIe Local Configuration registers */
#define PCIE_VENDER_DEVICE_ID   0x1000
#define PCIE_STATUS_CMD         0x1004
#define PCIE_CLASSCODE_REVID    0x1008
#define PCIE_BAR0               0x1010
#define PCIE_BAR1               0x1014
#define PCIE_BAR2               0x1018
#define PCIE_BAR3               0x101c
#define PCIE_DEVICE_CAP         0x1074
#define PCIE_DEV_STAT_CTRL   	0x1078
#define PCIE_LINK_STAT_CTRL     0x1080
#define PCIE_ACCR	            0x1118
#define PCIE_DEBUG0             0x1728
#define PCIE_PL_GEN2            0x180C
#define LEGACY_A_IRQ_STATUS_RAW		   0x21800180

/* SERDES Configuration registers */
#define PCIE_SERDES_CFG_PLL 0x2620358

int32 devicePowerPeriph (int32 modNum)
{
    int32 ret;

    /* If the input value is < 0 there is nothing to power up */
    if (modNum < 0)
        return (0);


    if (modNum >= 30)
        return (-1);


    /* Note that if the sgmii power enable is requested the PA must be
     * powered up first */
    if (modNum == 8)  {
        ret = (int32)pscEnableModule (7);
        if (ret != 0)
            return (ret);
    }

    return ((int32)pscEnableModule(modNum));

}

void iblPCIeWorkaround()
{
    uint32  i;

     /* Power up PCIe */
    devicePowerPeriph (10);
    for(i=0; i<1000; i++) asm (" NOP");

    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG0), 0x00062320);  /* ss clock */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_SERDES_CFG1), 0x00022320);  /* ss clock */

    /* Wait for PCIe PLL lock */
    while(!(DEVICE_REG32_R(PCIE_STS_REG) & 1));


    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_CLASSCODE_REVID), 0x04800001);  /* class 0x04, sub-class 0x80, Prog I/F 0x00, Other multimedia device */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_LINK_STAT_CTRL), 0x10110080);  /* extended sync, slot_clk_cfg = 1 */

    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_VENDER_DEVICE_ID), 0xb005104c);  /* Vendor and Device ID */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEVICE_CAP), 0x288701); /* L0 = 4, L1 = 3 */

	DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_OB_SIZE), 0x00000003);     /* OB_SIZE = 8M */
	DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_PL_GEN2), 0x0000000F);   /* num_fts = 0xF*/

    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0020); /* Set dbi_cs2 to allow access to the BAR registers */


		DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0x00000FFF);   /* 4K */
		DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR1), 0x0007FFFF);   /* 512K */
		DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR2), 0x003FFFFF);   /* 4M */
		DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR3), 0x00FFFFFF);   /* 16M */

	DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0);    /* dbi_cs2=0 */

	DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_STATUS_CMD), 0x00100146); /* ENABLE mem access */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_DEV_STAT_CTRL), 0x0000281F); /* Error control */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_ACCR), 0x000001E0); /* Error control */
    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_BAR0), 0); /* non-prefetch, 32-bit, mem bar */

    DEVICE_REG32_W ((PCIE_BASE_ADDR + PCIE_APP_CMD_STATUS), 0x0000007);    /* enable LTSSM, IN, OB */
    while((DEVICE_REG32_R(PCIE_BASE_ADDR + PCIE_DEBUG0) & 0x11)!=0x11);    /* Wait for training to complete */


    /* Will never reach here */
    return;
}

/************************ EXTERN VARIABLES ********************/
/* QMSS device specific configuration */
extern Qmss_GlobalConfigParams  qmssGblCfgParams;
/* CPPI device specific configuration */
extern Cppi_GlobalConfigParams  cppiGblCfgParams;
/**************************************************************/

#define NUM_MONOLITHIC_DESC         numDescriptors
#define SIZE_MONOLITHIC_DESC        descriptorSize
#define MONOLITHIC_DESC_DATA_OFFSET 16

#define HEAP_ID         0

/* Number of times to run the loop */
#define NUMLOOPS        100
#define NUMIGNORED      (5)
#define NUM_MSGS        (10)

/* Benchmark parameters */
Char localQueueName[6];
Char nextQueueName[6];
Char prevQueueName[6];
Char core_temp[6];

UInt numCores = 0;
UInt16 prevCoreId;

UInt16 selfId;
UInt64 timeAdj = 0;
Types_FreqHz timerFreq, cpuFreq;

/* Results */
UInt32 rawtimestamps[NUMLOOPS];
UInt32 latencies[NUMLOOPS - 1];

MessageQ_Handle messageQ =NULL;
MessageQ_QueueId  prevQueueId;
MessageQ_QueueId  nextQueueId,nextQueueId1,nextQueueId2,nextQueueId3,nextQueueId4,nextQueueId4,nextQueueId5,nextQueueId6,nextQueueId7;

UInt64 timeLength = 0;

Float cpuTimerFreqRatio;
Statistics latencyStats;

/* Descriptor pool [Size of descriptor * Number of descriptors] */
/* place this monolithic descritor pool in shared memory */
#pragma DATA_SECTION (monolithicDesc, ".desc");
#pragma DATA_ALIGN (monolithicDesc, 16)
UInt8               monolithicDesc[SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC];

#define NUM_MSGS_TO_PREALLOC (8000)

#pragma DATA_SECTION (txMsgPtrs, ".msgQ_ptrs");
TstMsg *txMsgPtrs[NUM_MSGS_TO_PREALLOC];

#pragma DATA_SECTION (rxMsgPtrs, ".msgQ_ptrs");
TstMsg *rxMsgPtrs[NUM_MSGS_TO_PREALLOC];

/**
 *  @b Description
 *  @n  
 *      This functions prints the statistics gathered for the transport during
 *      the latency test.
 */

void convertyuv422torgb565( unsigned char inbuf[],unsigned char outbuf[],int width,int height)
{
  int rows,cols;
  int y,u,v,r,g,b,rdif,invgdif,bdif;
  int YPOS,UPOS,VPOS;
  YPOS=0;
  UPOS=1;
  VPOS=3;
  for(rows=0;rows<height;rows++)
  {
    for(cols=0;cols<width;cols++)
    {
         y = inbuf[YPOS+cols*2+rows*1920*2];
		 if(cols%2==0)
		 {
                u = inbuf[UPOS+cols*2+rows*1920*2] - 128;
                v = inbuf[VPOS+cols*2+rows*1920*2] - 128;
		 }else{
         u = inbuf[UPOS+(cols-1)*2+rows*1920*2] - 128;
         v = inbuf[VPOS+(cols-1)*2+rows*1920*2] - 128;
		 }
         rdif = v + ((v * 103) >> 8);
         invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
         bdif = u +( (u*198) >> 8);

         r = y + rdif;
         g = y - invgdif;
         b = y + bdif;
         r=r>255?255:(r<0?0:r);
         g=g>255?255:(g<0?0:g);
         b=b>255?255:(b<0?0:b);
		 *(outbuf++) =( ((g & 0x1C) << 3) | ( b >> 3) );
         *(outbuf++) =( (r & 0xF8) | ( g >> 5) );
    }
  }
}



/**
 *  @b Description
 *  @n  
 *      This function initalizes the platform.  It has called at startup.  This is defined in the
 *      .cfg file via the Startup.firstFxns.$add('&initPlatform'); definition.
 */
void initPlatform(void)
{
  platform_init_flags  pFormFlags;
  platform_init_config pFormConfig;
  /* Status of the call to initialize the platform */
  UInt32 pFormStatus;

  /* Only run on single core */
  if (CSL_chipReadReg (CSL_CHIP_DNUM) == 0)
  {
    /*
     * You can choose what to initialize on the platform by setting the following
     * flags. Things like the DDR, PLL, etc should have been set by the boot loader.
    */
    memset( (void *) &pFormFlags,  0, sizeof(platform_init_flags));
    memset( (void *) &pFormConfig, 0, sizeof(platform_init_config));

    pFormFlags.pll = 0; /* PLLs for clocking  	*/
    pFormFlags.ddr  = 0; /* External memory 		*/
    pFormFlags.tcsl = 1; /* Time stamp counter 	*/
    pFormFlags.phy  = 0; /* Ethernet 			*/
    pFormFlags.ecc  = 0; /* Memory ECC 			*/

    pFormConfig.pllm = 0;	/* Use libraries default clock divisor */

    pFormStatus = platform_init(&pFormFlags, &pFormConfig);

    /* If we initialized the platform okay */
    if (pFormStatus != Platform_EOK)
    {
  	 /* Initialization of the platform failed. */
  	 System_printf("Platform failed to initialize. Error code %d \n", pFormStatus);
    }
  }
}



void convert_func(){
Int       status;
int i;
//UInt numReceived;
MessageQ_Msg     msg[7];
//UInt64 timeStamp=0;
//UInt64 timeAdj=0;
//double throughPut;

if (selfId == 0) {
	System_printf("tsk0. selfproc=%d nextQueueName (%s) openned, nextQueueId=%d-%d-%d-%d-%d-%d-%d\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE1-7", nextQueueId1,nextQueueId2,nextQueueId3,nextQueueId3,nextQueueId4,nextQueueId5,nextQueueId6,nextQueueId7);
	for(i=0;i<=6;i++){
    msg[i]= MessageQ_alloc(HEAP_ID, MESSAGE_SIZE_IN_BYTES);
    if (msg[i]== NULL) {
       System_abort("MessageQ_alloc failed\n");
    }
	}
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE1", msg[0]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE2", msg[1]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE3", msg[2]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE4", msg[3]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE5", msg[4]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE6", msg[5]);
    System_printf("tsk0. selfProc=%d calling MessageQ_put(nextQueueName=%s). msg=0x%x\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE7", msg[6]);

	while(*((volatile unsigned int *)LEGACY_A_IRQ_STATUS_RAW)!=1)
	{}

	System_printf("get interrupt from 8168\n");

    status = MessageQ_put(nextQueueId1, msg[0]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId2, msg[1]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId3, msg[2]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId4, msg[3]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId5, msg[4]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    status = MessageQ_put(nextQueueId6, msg[5]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }    status = MessageQ_put(nextQueueId7, msg[6]);
    if (status < 0) {
        System_abort("MessageQ_put failed\n");
    }
    System_printf("core 0 MessageQ_put done\n");

	//System_printf("convert start\n");
    /* Take time at start of test */
    //timeStamp = getStartTime64();
	convertyuv422torgb565( (uint8_t *)0x90000000,(uint8_t *)0x91000000,1920,1080/8);

	//PCIE Interrupt
		/* clear PCIE interrupt */
	    DEVICE_REG32_W(PCIE_LEGACY_A_IRQ_STATUS, 0x1);
	    DEVICE_REG32_W(PCIE_IRQ_EOI, 0x0);

    for(i=0;i<=6;i++){
    status = MessageQ_get(messageQ, &msg[i], MessageQ_FOREVER);
    if (status < 0) {
        System_abort("MessageQ_get failed\n");
    }
    System_printf("MessageQ_get %d time\n",i);
    }

    System_printf("convert done\n");


    /* Get execution time to transfer all messages */
    //timeLength = getExecutionTime64(timeStamp, timeAdj);
    //throughPut = (double)CYCLES_TO_US(timeLength, 1000000000);
    //System_printf("covert time is %f us\n",throughPut);
    //��DDR 91000000����ʼ����ת����rgb����
//	FILE *fp2;
//	fp2=fopen("conpspyzj.rgb","ab");
//	fwrite((void *)0x91000000, 1, 720*480*2, fp2);
//	fclose(fp2);
    for(i=0;i<=6;i++)
    MessageQ_free(msg[i]);
    System_printf("MessageQ_free\n");
    /* generate interrupt to host */
	*((volatile uint32_t *)PCIE_EP_IRQ_SET) = 0x1;
	System_printf("INTERRUPT TO A8\n");
}

else{
	//System_printf("tsk0. selfproc=%d nextQueueName (%s) openned, nextQueueId=%d\n", CSL_chipReadReg (CSL_CHIP_DNUM), "CORE0", nextQueueId);
	while(*((volatile unsigned int *)LEGACY_A_IRQ_STATUS_RAW)!=1)
	{}

    status = MessageQ_get(messageQ, &msg[selfId-1], MessageQ_FOREVER);
    if (status < 0) {
        System_abort("MessageQ_get failed\n");
    }
    System_printf("core %d MessageQ_get done\n",selfId);
	convertyuv422torgb565( (uint8_t *)(0x90000000+(1920*1080/4)*selfId),(uint8_t *)(0x91000000+(1920*1080/4)*selfId),1920,1080/8);

			//System_printf("core %d call MessageQ_put\n ",selfId);
		    status = MessageQ_put(nextQueueId, msg[selfId-1]);
		    if (status < 0) {
		        System_abort("MessageQ_put failed\n");
		    }
    System_printf("core %d MessageQ_put done\n",selfId);
}
}

/**
 *  @b Description
 *  @n  
 *      This configures the descriptor region and initializes CPPI, and QMSS.
 *      This function should only be called once per chip.
 *
 *  @retval
 *      Success     - 0
 *  @retval
 *      Error       - <0
 */
Int32 systemInit (Void)
{
  Qmss_InitCfg qmssInitConfig;   /* QMSS configuration */
  Qmss_MemRegInfo memInfo; /* Memory region configuration information */
  Qmss_Result result;
  UInt32 coreNum;
  
  coreNum = CSL_chipReadReg (CSL_CHIP_DNUM);

  System_printf ("\n-----------------------Initializing---------------------------\n");
  
  System_printf ("Core %d : L1D cache size %d. L2 cache size %d.\n", coreNum, CACHE_getL1DSize(), CACHE_getL2Size());

  memset ((Void *) &qmssInitConfig, 0, sizeof (Qmss_InitCfg));
  
  /* Set up the linking RAM. Use the internal Linking RAM. 
   * LLD will configure the internal linking RAM address and maximum internal linking RAM size if 
   * a value of zero is specified.
   * Linking RAM1 is not used */
  qmssInitConfig.linkingRAM0Base = 0;
  qmssInitConfig.linkingRAM0Size = 0;
  qmssInitConfig.linkingRAM1Base = 0;
  qmssInitConfig.maxDescNum      = NUM_MONOLITHIC_DESC /*+ total of other descriptors here */;

#ifdef xdc_target__bigEndian
  qmssInitConfig.pdspFirmware[0].pdspId = Qmss_PdspId_PDSP1;
  qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_be;
  qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_be);
#else
  qmssInitConfig.pdspFirmware[0].pdspId = Qmss_PdspId_PDSP1;
  qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_le;
  qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_le);
#endif

  /* Initialize Queue Manager SubSystem */    //Qmss_init
  result = Qmss_init (&qmssInitConfig, &qmssGblCfgParams);
  if (result != QMSS_SOK)
  {
      System_printf ("Error Core %d : Initializing Queue Manager SubSystem error code : %d\n", coreNum, result);
      return -1;
  }

  //Cppi_init
  result = Cppi_init (&cppiGblCfgParams);
  if (result != CPPI_SOK)
  {
      System_printf ("Error Core %d : Initializing CPPI LLD error code : %d\n", coreNum, result);
  }

  System_printf ("address of monolithicDesc[] = 0x%x. Converted=0x%x\n", monolithicDesc, l2_global_address ((UInt32) monolithicDesc));

  /* Setup memory region for monolithic descriptors */
  memset ((Void *) &monolithicDesc, 0, SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC);
  memInfo.descBase       = (UInt32 *) monolithicDesc;	/* descriptor pool is in MSMC */
  memInfo.descSize       = SIZE_MONOLITHIC_DESC;
  memInfo.descNum        = NUM_MONOLITHIC_DESC;
  memInfo.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR;
  memInfo.memRegion      = (Qmss_MemRegion) descriptorMemRegion;
  memInfo.startIndex     = 0;

  result = Qmss_insertMemoryRegion (&memInfo);
  if (result < QMSS_SOK)
  {
      System_printf ("Error Core %d : Inserting memory region %d error code : %d\n", coreNum, memInfo.memRegion, result);
      return -1;
  }
  else
  {
      System_printf ("Core %d : Memory region %d inserted\n", coreNum, result);
  }

  /* Writeback the descriptor pool.  Writeback all data cache.
    * Wait until operation is complete. */    
  Cache_wb (monolithicDesc, 
                     SIZE_MONOLITHIC_DESC * NUM_MONOLITHIC_DESC,
                     Cache_Type_ALLD, TRUE);
  
  return 0;
}

/**
 *  @b Description
 *  @n  
 *      Task which kicks off the latency and throughput tests
 */
Void tsk0(UArg arg0, UArg arg1)
{
    Int status;

    System_printf("tsk0 starting\n");

    /* Register this heap with MessageQ */
    if(selfId==0){
    MessageQ_registerHeap((IHeap_Handle)SharedRegion_getHeap(0), HEAP_ID);

    /* Open the 'next' remote message queue. Spin until it is ready. */
    do {
        status = MessageQ_open("CORE1", &nextQueueId1);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE2", &nextQueueId2);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE3", &nextQueueId3);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE4", &nextQueueId4);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE5", &nextQueueId5);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE6", &nextQueueId6);
        Task_yield();
    }
    while (status < 0);
    do {
        status = MessageQ_open("CORE7", &nextQueueId7);
        Task_yield();
    }
    while (status < 0);
    }

    else{
    MessageQ_registerHeap((IHeap_Handle)SharedRegion_getHeap(0), HEAP_ID);
    System_sprintf(core_temp, "CORE%d", selfId);
    do {
        status = MessageQ_open(core_temp, &nextQueueId);
        Task_yield();
    }
    while (status < 0);
    }
    while(1)
    {
    convert_func();
    }

    detachAll(MultiProc_getNumProcessors());
    System_exit(0);
}

/**
 *  @b Description
 *  @n  
 *      Main - Initialize the system and start BIOS
 */
Int main(Int argc, Char* argv[])
{
  Int32 result = 0;
  Types_Timestamp64 time64;
  UInt64 timeStamp = 0;

  Timestamp_getFreq(&timerFreq);	//Get the timestamp timer's frequency (in Hz) ��ʱ��
  System_printf("timerFreq.lo = %d. timerFreq.hi = %d\n", timerFreq.lo, timerFreq.hi);

  BIOS_getCpuFreq(&cpuFreq);	//Get CPU frequency in Hz
  System_printf("cpuFreq.lo = %d. cpuFreq.hi = %d\n", cpuFreq.lo, cpuFreq.hi);
  
  cpuTimerFreqRatio = (Float)cpuFreq.lo / (Float)timerFreq.lo;	//=1

  Timestamp_get64(&time64);		//Return a 64-bit timestamp
  timeStamp = TIMESTAMP64_TO_UINT64(time64.hi,time64.lo);
  timeAdj = TIMESTAMP64_TO_UINT64(time64.hi,time64.lo) - timeStamp;	//=0

  selfId = CSL_chipReadReg (CSL_CHIP_DNUM);
  
  System_printf("Core (\"%s\") starting\n", MultiProc_getName(selfId));
  
  if (numCores == 0) {
      numCores = 8;	//MultiProc_getNumProcessors();	 Number of processors configured with MultiProc   =2
  }

  if (selfId == 0)
  {
    /* QMSS, and CPPI system wide initializations are run on
      * this core */
    result = systemInit();		//systemInit
    if (result != 0) 
    {
    System_printf("Error (%d) while initializing QMSS\n", result);
    }
	iblPCIeWorkaround();//��ʼ��PCIE���ȴ�������ɡ�
	DEVICE_REG32_W(PCIE_LEGACY_A_IRQ_STATUS, 0x1);
//	FILE *fp1;
//	fp1=fopen("conpsp.yuv","r");
//    fread((void *)0x90000000,1,720*480*2,fp1);
//    fclose(fp1);
//    System_printf("fread done\n");

    /* Attach all cores. */
    attachAll(numCores);
    System_printf("core 0 exec attachAll done\n");

//    prevCoreId = "1/2/3/4/5/6/7";
//
    System_sprintf(localQueueName, "CORE%d", selfId);		//localQueueName��ȫ�ֱ���
//    System_sprintf(nextQueueName, "CORE%s","1/2/3/4/5/6/7");
//    System_sprintf(prevQueueName, "CORE%s", prevCoreId);	//System_sprintf���Ǵ�ӡ����ʹprevQueueNameΪ��CORE%d���ַ���
//
//    System_printf("localQueueName=%s. nextQueueName=%s. prevQueueName=%s\n",
//                    localQueueName,  nextQueueName, prevQueueName);

    /* Create a message queue. */
    messageQ = MessageQ_create(localQueueName, NULL);
    if (messageQ== NULL) {
        System_abort("MessageQ_create failed\n" );
    }

  }
  else{
   iblPCIeWorkaround();//��ʼ��PCIE���ȴ�������ɡ�
  /* Attach all cores. */
  attachAll(numCores);
     
  prevCoreId = 0;

  System_sprintf(localQueueName, "CORE%d", selfId);		//localQueueName��ȫ�ֱ���
  System_sprintf(nextQueueName, "CORE%d",0);
  System_sprintf(prevQueueName, "CORE%d", prevCoreId);	//System_sprintf���Ǵ�ӡ����ʹprevQueueNameΪ��CORE%d���ַ���

  System_printf("localQueueName=%s. nextQueueName=%s. prevQueueName=%s\n", 
                  localQueueName,  nextQueueName, prevQueueName);
        
  /* Create a message queue. */
  messageQ = MessageQ_create(localQueueName, NULL);
  if (messageQ== NULL) {
      System_abort("MessageQ_create failed\n" );
  }
  }

  BIOS_start();

  System_printf("done BIOS_start\n");

  return (0);
}


the log is:

core0 it just in the messageQ_get, idle

3.third question:

if i do not use bios,can i use the messageQ module to IPC communication?i think can not,is it?

if i do not use bios,how can i do IPC communication,is there some example projects?

 

thanks. best regards

  • Hi,

    IPC over QMSS Benchmark Example, Did see the README.txt and follow the instruction to test this example?
    pdk_C6678_1_1_2_6\packages\ti\transport\ipc\examples\qmssIpcBenchmark\README.txt

    When you use IPC, It is comprised with other packages also for example:
    ti.sdo.ipc.heaps: Contains shared-memory Heaps
    ti.sdo.ipc: Contains multicore modules (e.g. MessageQ, Notify, ListMP, etc.)
    These packages are provided as source code and prebuilt libraries.

    Here you can find the dependencies for IPC
    IPC requires the following other software components and tools versions to successfully function:
    CCS, SYS/BIOS, XDCTools.

  • i have readed it.i use the demo project,modify and add my codes.

    can you see the codes.and the question in the original describe.

    and if i do not use sys/bios in a project,how can i do the IPC,is there any demo examples,where is it?

    thanks .best regards.

  • Cherish,

    There is no test code for IPC without BIOS, running on DSP. You can find the API calls from the IPC package, which is used in your IPC application. At the same time the memory configuration and hook the driver modules for IPC are implemented as well as able to configure through bios(.cfg). So when you try to implement the IPC on DSP side should use BIOS.