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.

openmp c6678 helloworld example

Other Parts Discussed in Thread: TMS320C6678, SYSBIOS

I do an experiment on ccs,on which I run an openmp program ,but I met some questions ,please help me.I run the Helloworld Demo on general board not on the EVM,the project could run successfully on simulator ,but failed on emulator,with the mistake ipc_attach ,and how to solve it?Besides ,I have some additional questions.

  1. I can not find the omp_config_oe66,and where is the library.  
  2.  . I used the ti.omp.examples.platforms.evm.6678 ,and what is the relationship between it and ti/omp-1-01-03-02/packages/ti/omp/platform/evm6678?  
  3. I want to know how to modify the platform ,and I want to use our own general board .Because the DDR’S address  range on evm is from 0x80000000 to 0x9fffffff,but on our general board is from ox80000000 to 0xffffffff .And the MSMSRAM_Nocache on EVM is oxa0100000,but on the general board is 0x50000000.How to modify the platform ?

        4.The tools I used are as the following :

Compiler version :TI v7.4.1

IPC           :1.25.0.04

MCSDK PDK TMS320C6678 : 1.1.2.6

OpenMP BIOS runtime library:1.1.3.0.2

SYS/BIOS     :6.34.2.18

Are there problems about the tools I used?

  • Hi,

    Only the ti.omp.ae66 is found at C:\ti\omp_1_01_03_02\packages\ti\omp\lib\debug, I cannot find the omp_config_oe66. The  ti.omp.examples.platforms.evm.6678 is to implement some function of cmd, refer to the attached to new a board platform to satisfy your requirments.

    Thanks.

     

    CCS5.1_RTSC_Setup.docx
  • Hi :

    We run OpenMP Helloworld examle on our custom TI 6678(not the EVM),and load the .exe program to core 0 and run core 0.We met some questions that after initializationand assure the DDR'S initialization  correctness ( writing data to DDR'S address space according to JTAG is correct ),which namely is our user's initialization over.And then wo continue our program to the OpenMP_masterTask() function ,and step into it continue to the init_navigator function ,after which the CPU abort occurs.The CPU abort  is as shown in annex init_navigator-except1.jpg

    We found OpenMP_masterTask() function's source code  in the openMP's installation directory (C:\ti\omp_1_01_03_02\packages\ti\omp\utils) ,and is shown in annex openMP.c.

    /*
     * Copyright (c) 2012, Texas Instruments Incorporated
     * http://www.ti.com
     * 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--*/
    /*
     *  ======== OpenMP.c ========
     */
    #include <xdc/std.h>
    #include <xdc/runtime/System.h>
    #include <xdc/runtime/Memory.h>
    #include <xdc/runtime/Assert.h>
    #include <xdc/runtime/Log.h>
    #include <xdc/runtime/Types.h>
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/sysbios/timers/timer64/Timer.h>
    #include <ti/ipc/MultiProc.h>
    #include <ti/ipc/ListMP.h>
    #include <ti/ipc/MessageQ.h>
    #include <ti/ipc/SharedRegion.h>
    #include <ti/ipc/GateMP.h>
    #include <ti/ipc/Ipc.h>
    #include <ti/omp/libgomp.h>
    #include <ti/omp/utils/SemaphoreMP.h>
    #include <ti/omp/config/sysbios/proc.h>
    #include "package/internal/OpenMP.xdc.h"
    #include <ti/omp/navigator/Navigator.h>
    #include <stdlib.h>
    // Defined in the C6000 RTS
    extern void __TI_cpp_init(void);
    typedef struct {
        MessageQ_MsgHeader header;
        Bool isPending;  /* Used to ack the thread spawn request */
        Ptr startData;
        Fxn fn;
        SizeT stackSize;
        Bool terminate;
    } OpenMP_SpawnElem;
    /* Must go into non-cached shared memory */
    static volatile UInt16 OpenMP_threadsPerCore[MAXPROCS];
    static volatile OpenMP_SpawnElem OpenMP_threadSpawnElems[MAXPROCS];
    static volatile UInt32 OpenMP_threadSpawnQIds[MAXPROCS];
    #pragma DATA_SECTION(OpenMP_threadsPerCore, "gomp_data")
    #pragma DATA_SECTION(OpenMP_threadSpawnElems, "gomp_data")
    #pragma DATA_SECTION(OpenMP_threadSpawnQIds, "gomp_data")
    /*!
     *  ======== OpenMP_masterTask ========
     */
    Void OpenMP_masterTask(UArg arg0, UArg arg1)
    {
        SemaphoreMP_Params semParams;
    UInt16 baseId = MultiProc_getBaseIdOfCluster();
        Int status;
        SharedRegion_Entry srEntry;
        Task_Params taskParams;
    Int i;
        SharedRegion_getEntry(1, &srEntry);
        srEntry.isValid = TRUE;
        SharedRegion_setEntry(1, &srEntry);
        
        //status = Ipc_start();
        /* Call Ipc_start() */
        status = Ipc_start();
        if (status < 0) {
          System_abort("Ipc_start failed!\n");
    }
            
        /* get region 0 information */
        SharedRegion_getEntry(0, &srEntry);
        /* if srEntry is not valid then return */
        if (srEntry.isValid == FALSE) {
          return;
        }
        
        /* Must attach to owner first to get default GateMP */
        if (MultiProc_self() != srEntry.ownerProcId) {
          do {
            status = Ipc_attach(srEntry.ownerProcId);
          } while (status == Ipc_E_NOTREADY);
                
           if (status < 0) {
            System_abort("ERROR: Ipc_start failed in OpenMP_masterTask\n");
           }
        }
        
        /* Must attach to owner first to get default GateMP */
            for (i = 0; i < MultiProc_getNumProcsInCluster(); i++, baseId++) {
                
    if ((baseId == MultiProc_self()) || (baseId == srEntry.ownerProcId)) {
                    continue;
                }
            
                /* Skip the processor if there are no interrupt lines to it */
                if (Notify_numIntLines(baseId) == 0) {
                    continue;
                }
                /* call Ipc_attach for every remote processor */
                do {
                    status = Ipc_attach(baseId);
                } while (status == Ipc_E_NOTREADY);
                
                
               if (status < 0) {
                 System_abort("ERROR: Ipc_start failed in OpenMP_masterTask\n");
               }
           }
        
       
        OpenMP_module->useSharedHeap = true;
        
        /* Store the handle to the default remote gate */
        OpenMP_module->gate = (ti_sdo_ipc_GateMP_Handle)GateMP_getDefaultRemote();
        
        /* Ensure that Ipc_start succeeded */
        if (status < 0) {
            System_abort("ERROR: Ipc_start failed in OpenMP_masterTask\n");
        }
        /* Initialize the SemaphoreMP module */
        SemaphoreMP_start();
        init_Navigator();
        OpenMP_module->threadSpawnQ = Create_Queue();
        OpenMP_threadSpawnQIds[MultiProc_self()-MultiProc_getBaseIdOfCluster()] = OpenMP_module->threadSpawnQ;
        
        if (MultiProc_self() == MultiProc_getBaseIdOfCluster()) {
            /* Keep track of the number of OMP threads the local core is running */
            OpenMP_threadsPerCore[0]++;
            
            /* Call compiler-lowered 'main' function */
            Task_Params_init(&taskParams);
            taskParams.priority = OpenMP_threadPriority;
            if (OpenMP_stackRegionId != -1) {
                taskParams.stackHeap = SharedRegion_getHeap(OpenMP_stackRegionId);
            }
            taskParams.stackSize = OpenMP_stackSize;
            taskParams.env       = (xdc_Ptr)-1; /* Indicate TLS required for task */
            Task_create(OpenMP_mainTask, &taskParams, NULL);
        }
    OpenMP_threadSpawnLoop();
    }
    /*!
     *  ======== OpenMP_mainTask ========
     */
    Void OpenMP_mainTask(UArg arg0, UArg arg1) 
    {
        UInt i;
        
        initialize_critical();
        initialize_env();
        
        if (getenv("OMP_STACKSIZE") == NULL) {
            gomp_thread_attr_setstacksize (&gomp_thread_attr, OpenMP_stackSize);
        }
        
        initialize_team();
        /* Execute the user-supplied 'main' function */
        
        OpenMP_masterFxn();
    /* 
         *  main() has returned.
         *  Tell the remote OpenMP_masterTask threads to terminate
         */
    }
    Void OpenMP_mainTaskExit(void *arg __attribute__((unused)))
    {
    int i;
        for (i = 1; i < MultiProc_getNumProcsInCluster(); i++) {
            
            /* All the other fields of the thread spawn message don't matter */
            while (OpenMP_threadSpawnElems[i].isPending == true)
    {
    Task_yield();
    }
    OpenMP_threadSpawnElems[i].terminate = true;
    OpenMP_threadSpawnElems[i].isPending = true;
            queue_push_elem(OpenMP_threadSpawnQIds[i], (MessageQ_MsgHeader *)&(OpenMP_threadSpawnElems[i].header));
    while(!Queue_empty(OpenMP_threadSpawnQIds[i]));
           
        }
    team_destructor();
        BIOS_exit(0);
    }
    /*!
     *  ======== OpenMP_threadSpawnTask ========
     */
    //Void OpenMP_threadSpawnTask(UArg arg0, UArg arg1)
    Void OpenMP_threadSpawnLoop(Void)
    {
        Task_Params params;
    Int status; 
        OpenMP_SpawnElem *elem;
        
        Task_Params_init(&params);
    if (OpenMP_stackRegionId != -1) {
            /* Thread stack should be placed in shared region */
            params.stackHeap = SharedRegion_getHeap(OpenMP_stackRegionId);
        }
        
        while (1) {
            /* Get a thread spawn request */
        elem =  (Ptr ) queue_pop_elem_wait( OpenMP_module->threadSpawnQ);
    ti_sysbios_knl_Task_deleteTerminatedTasksFunc();
    //if(tsk != NULL)
    // Task_delete(&tsk);
    if (elem->terminate) {
                /* main() complete, nothing else to do */
                BIOS_exit(0);
            }
            /* Initialize Task params. Set env  to -1  for TLS required */
            params.arg0 = (UArg)elem->startData;
            params.stackSize = elem->stackSize;
            params.env = -1;
            params.priority = OpenMP_threadPriority;
            
            /* Spawn a new thread locally */
            Task_create((Task_FuncPtr)elem->fn, &params, NULL);
            
            /* Free the elem */
            elem->isPending = FALSE;
        }
    }
    /*!
     *  ======== OpenMP_createThread ========
     */
    Void OpenMP_createThread(Fxn fn, Ptr startData, SizeT stackSize) 
    {
        UInt min = (UInt)-1;
        UInt16 minProcId;
        Int status, i;
        UInt key;
        
        /* Need to protect accesses to OpenMP_threadsPerCore by other threads */
        key = GateMP_enter((GateMP_Handle)OpenMP_module->gate);
        /* Determine the proc ID for the core with fewest # of worker threads */
        for (i = 0; i < MultiProc_getNumProcsInCluster(); i++) {
            if (OpenMP_threadsPerCore[i] < min) {
                min = OpenMP_threadsPerCore[i];
                minProcId = i;
            }
        }
        OpenMP_threadsPerCore[minProcId]++;
        
        /* Spin waiting for the previous message to be used up */
        while (OpenMP_threadSpawnElems[minProcId].isPending == true) {
            GateMP_leave((GateMP_Handle)OpenMP_module->gate, key);
            /* Yield to allow OpenMP_threadSpawnTask to run if ready */
            Task_yield();
            key = GateMP_enter((GateMP_Handle)OpenMP_module->gate);
        };
        
     //   MessageQ_staticMsgInit((MessageQ_MsgHeader *)&(OpenMP_threadSpawnElems[minProcId].header), sizeof(OpenMP_SpawnElem));
        OpenMP_threadSpawnElems[minProcId].startData = startData;
        OpenMP_threadSpawnElems[minProcId].fn = fn;
        OpenMP_threadSpawnElems[minProcId].stackSize = stackSize;
        OpenMP_threadSpawnElems[minProcId].isPending = true;
    OpenMP_threadSpawnElems[minProcId].terminate = false;
        
        /* 
         *  Safe to leave the gate here since any other thread trying to use the
         *  same control message will spin on the 'isPending' flag
         */
        GateMP_leave((GateMP_Handle)OpenMP_module->gate, key);
        queue_push_elem(OpenMP_threadSpawnQIds[minProcId], (MessageQ_MsgHeader *)&(OpenMP_threadSpawnElems[minProcId].header));
    }
    /*!
     *  ======== OpenMP_setProcId ========
     */
    Void OpenMP_setProcId()
    {
        extern cregister volatile UInt DNUM;
        
        if (DNUM >= (MultiProc_getBaseIdOfCluster() + MultiProc_getNumProcsInCluster()) || DNUM < MultiProc_getBaseIdOfCluster() ) { 
            BIOS_exit(0); /* This core is not used */
        }
        /* Set the local ID to DNUM + BaseIdOfCluster */
        MultiProc_setLocalId(DNUM);
    }
    Uint32 Threads_in_release(Uint32 Hnd)
    {
    return Queue_get_num_elem(Hnd) ;
    }
    /*!
     *  ======== OpenMP_exitThread ========
     */
    Void OpenMP_exitThread(void *arg __attribute__((unused)))
    {
    extern cregister volatile UInt DNUM; 
    int id=MultiProc_self() - MultiProc_getBaseIdOfCluster();
    /* Need to protect accesses to OpenMP_threadsPerCore by other threads */
        UInt key = GateMP_enter((GateMP_Handle)OpenMP_module->gate);
        OpenMP_threadsPerCore[id]--;
        GateMP_leave((GateMP_Handle)OpenMP_module->gate, key);
    }
    /*!
     *  ======== OpenMP_useSharedHeap ========
     */
    Bool OpenMP_useSharedHeap()
    {
        return OpenMP_module->useSharedHeap;
    }
    /*!
     *  ======== OpenMP_getTimerCount ========
     */
    UInt32 OpenMP_getTimerCount()
    {
        return (Timer_getCount(OpenMP_module->sharedTimer));
    }
    /*!
     *  ======== OpenMP_getTimerFreq ========
     */
    Void OpenMP_getTimerFreq(Types_FreqHz *freq)
    {
        Timer_getFreq(OpenMP_module->sharedTimer, freq);
    }

    Q1:we could not find  the  source code of init_navigator() function ,and did not know the operation of the init_navigator() function . How to solve the CPU abort  and why?

    Q2:we want to know the boot proess of the openmp,and what is the difference and relation between the openmp and SYS/BIOS?

    The following is our part of project:

    1)we use the TI default platform as our  RTSC platform,and the RTSC cfg configuration is as follows:

    mcsdk:mcsdk_2_01_02_06
    xdctools:xdctools_3_24_05_48
    IPC: ipc_1_24_03_32
    BIOS:bios_6_33_06_50
    OpenMP:omp_1_01_03_02

    2) The DDR'S access space on our custom board is from 0x80000000 to 0xFFFFFFFF,totally 2GB,and does it have some questions to use the TI EVM's platform?

    3) The cfg configuration file of our project  is as follows:

    /* 
    * Copyright (c) 2012, Texas Instruments Incorporated
    * http://www.ti.com
    * 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--*/


    /////////////////////////////////////////////////// (1)
    var Startup = xdc.useModule('xdc.runtime.Startup');
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Task = xdc.useModule('ti.sysbios.knl.Task');


    BIOS.taskEnabled = true;
    Task.common$.namedInstance = true;

    ///////////////////////////////////////////////////(1)

    // allocate out of this shared region heap after IPC has been started.

    var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');

    // Configure HeapOMP for the shared memory heap

    // HeapOMP created in ti/omp/common.cfg.xs

    var HeapOMP = xdc.useModule('ti.omp.utils.HeapOMP');
    HeapOMP.sharedRegionId = 2;
    HeapOMP.localHeapSize = 0x20000;
    HeapOMP.sharedHeapSize = 0x1000000;

    // Specify the Shared Region
    SharedRegion.setEntryMeta( HeapOMP.sharedRegionId,
    { base: 0x90000000,
    len: HeapOMP.sharedHeapSize,
    ownerProcId: 0,
    cacheEnable: true,
    createHeap: true,
    isValid: true,
    name: "heapomp",
    }

    );

    /* load the common configuration file */
    xdc.loadCapsule('ti/omp/common.cfg.xs');

    var System = xdc.useModule('xdc.runtime.System');
    System.extendedFormats = "%$S";

    var OpenMP = xdc.useModule('ti.omp.utils.OpenMP');
    OpenMP.setNumProcessors(8);

    ///////////////////////////////////////////////////(2)
    var Memory = xdc.useModule('xdc.runtime.Memory');
    Memory.defaultHeapSize = 0x40000;
    Program.heap = 0x40000;
    ///////////////////////////////////////////////////(2)


    Program.sectMap["ddr"] = new Program.SectionSpec();
    Program.sectMap["ddr"].loadSegment = "DDR3";

    Program.sectMap[".threadprivate"] = new Program.SectionSpec();
    Program.sectMap[".threadprivate"].loadSegment = "L2SRAM";

    // Enable Cache Write-back for HEAPOMP
    var Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
    Cache.setMarMeta(0x80000000, 0x20000000, Cache.PC | Cache.WTE);


    ///////////////////////////////////////////////////(3)
    /* Add init function */
    Startup.lastFxns.$add('&C6678_init');

    Program.sectMap[".ChipIntc"] = new Program.SectionSpec();
    Program.sectMap[".ChipIntc"].loadSegment = "MSMCSRAM";
    Program.sectMap[".CoreIntcL2Mem"] = new Program.SectionSpec();
    Program.sectMap[".CoreIntcL2Mem"].loadSegment = "L2SRAM";
    Program.sectMap[".cppiSharedMem"] = new Program.SectionSpec();
    Program.sectMap[".cppiSharedMem"].loadSegment = "MSMCSRAM";
    Program.sectMap[".csl_vect"] = new Program.SectionSpec();
    Program.sectMap[".csl_vect"].loadSegment = "L2SRAM";
    Program.sectMap[".qmssL2Mem"] = new Program.SectionSpec();
    Program.sectMap[".qmssL2Mem"].loadSegment = "L2SRAM";
    Program.sectMap[".qmssSharedMem"] = new Program.SectionSpec();
    Program.sectMap[".qmssSharedMem"].loadSegment = "MSMCSRAM";

    Program.sectMap[".far:taskStackSection"] = new Program.SectionSpec();
    Program.sectMap[".far:taskStackSection"].loadSegment = "MSMCSRAM";

    ///////////////////////////////////////////////////(3)

    /*
    * The BIOS module will create the default heap for the system.
    * Specify the size of this default heap.
    */

    ///////////////////////////////////////////////////(4)
    /* System stack size (used by ISRs and Swis) */
    Program.stack = 163840;

    ///////////////////////////////////////////////////(4)


    /* ===================== Optional ============================= */
    /* Advance User settings */
    /* The default settings are commented out. */
    /* Uncomment the same and modify, if different setting is desired */
    /* =============================================================================*/

    //OpenMP.qmssInit = true ;
    //OpenMP.qmssMemRegion = -1;
    //OpenMP.qmssStartIndex = 0;
    //OpenMP.qmssDestQueueNum = -1;
    //OpenMP.stackRegionId = -1;
    //OpenMP.internalOsal = true;
    //OpenMP.cppiHwSem = 3;
    //OpenMP.qmssHwSem = 4;
    //OpenMP.ompHwSem = 5;
    //OpenMP.mpaxIndex = 3;

    Compared to the TI default CFG,our cfg adds  some  content ,they are between the 
    ///////////////////////////////////////////////////(i)

    and

    ///////////////////////////////////////////////////(i)
    (1) ,(2) (3) (4) are referred to our previous program ,which we use to run SYS/BIOS configuration onour custom board .Especifically,our custom board is different from the EVM,and mang cfg files needs  our own driver to work completely ,and before the boot of main(),we ran to the C6678_init() function ,instead of  performming  the GEL file.And the C6678_init() function's mainly code is as follows:

    void C6678_init()
    {

    if(DNUM==0)
    {
    //初始化PLL
    if (C6678_Pll_Init(PLATFORM_PLL1_PLLM_val)!= TRUE)
    {
    // printf("PLL failed to initialize!!!!!!!!!!!!!!!!!!!!!!!!! \n" );
    }
    else
    {
    // printf("PLL successd to initialize\n" );
    }


    C6678_Power_UpDomains();
    C6678_Ecc_Enable();
    }

    //使能TIMER
    C6678_TimeCounter_Enable();


    if(DNUM==0)
    {
    //初始化DDR
    if (C6678_Ddr3_Init(PLLM_DDR3,DDR3_TYPE)!= TRUE)
    {
    // printf("*******DDR3 failed to initialize!******* \n" );
    }
    else
    {
    // printf("*******DDR3 successed to initialize!******* \n" );
    }
    }


    }
    C6678_init() function's mainly functions are  :
    1) configure the PLL of CPU
    2) initialize the DDR on the board

    Thanks for your carefully reading and early reply!

  • hello,

    中文?想请教一下,CCS里怎么才能使用openMP,要下载openMP库还是插件之类的安装文件?去哪下或者设置呢?

    谢谢!

    I don't know how to get it startted when using openMP in CCS.  Should I download  the openMP library or something? Can you send me a net link?

    Thanks.