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.

Memory Configuration TMS320C6678

Other Parts Discussed in Thread: TMS320C6678, SYSBIOS

Hi Guys ,

how to do a Memory Configuration using TMS320C6678 ? It is possible to do that automatically into CCS ?

Thank you for reply

Lopez

  • Hi Lopez,

    Could you elaborate your question?  What do you want exactly?

    If you use SYS/BIOS realtime operating system, you can refer the section "6.2.2 Creating a Custom Platform" and "6.3 Placing Sections into Memory Segments" of the SYS/BIOS Real-time Operating System User's Guide.  It is included in the SYS/BIOS distribution but you can download it separately at http://www.ti.com/lit/ug/spruex3m/spruex3m.pdf.

    Regards,
    Atsushi

  • Thank you for  Reply Atsushi . I only need this Document

  • Hi Atsushi ,,

    DSP Developpment is new world for me . I read the file included here : http://www.ti.com/lit/ug/spruex3m/spruex3m.pdf, but I don´t no exactly which Modules I need to configure to resolve my Problem.

    I have a  256 * 2080 data Buffer , and I want to parallelize the FFT on this data using the 8 Cores from TMS320C6678. Each Core Compute 256 FFT points . It is possible to do this using openMP ? How I can Configure Module or Memory to do that?

    Please I need Some idea

    Lopez

  • Lopez,

    I'm not (yet) familiar with OpenMP, could you please ask it (possibly in a different forum) separately?

    Regarding the memory configuration, the following is the basic idea.

    1. Determine where the working memory is located.  Local L2 (the fastest but the most expensive), Shared L2 (or MSMC SRAM), or external DDR memory if you have.  Shared L2 and DDR are suitable for sharing the working memory among multiple cores.  (Need to take care of cache coherency.)
    2. Define some memory segments if you don't find a predefined and appropriate memory segment.  Please refer "6.2.2.4 Setting Custom Base Addresses and Lengths for Segments" of the BIOS User Guide.
    3. Define a memory section and allocate it to the segment.  Please refer "6.3 Placing Sections into Memory Segments."
    4. In the C program, you can allocate a variable (even an array) in the section by "#pragma CODE_SECTION" or "#pragma DATA_SECTION".  Please refer the SPRU187 (http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=spru187&track=no).

    By the way, we provide FFT library in DSPLIB.  Please refer http://processors.wiki.ti.com/index.php/DSPLIB.  It may help.

    Regards,
    Atsushi

  • Hi Atsushi ,

    since ours last communication , I make progress to programming a DSP . For my Problem I have modified the Configuration file coming with the openMP Hello World example:

    That is My comfiguration File :

    * Copyright (c) 2012, Texas Instruments Incorporated
    *
    /*-----------------------------------------------------------------------------*/
    /* runtime module configuration */
    /*-----------------------------------------------------------------------------*/
    var Timestamp = xdc.useModule('xdc.runtime.Timestamp');
    /* load the common configuration file */
    xdc.loadCapsule('ti/omp/common.cfg.xs');
    var System = xdc.useModule('xdc.runtime.System');
    System.extendedFormats = "%$S";
    // allocate out of this shared region heap after IPC has been started.
    var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    /*-----------------------------------------------------------------------------*/
    /* configure openMP Module */
    /*-----------------------------------------------------------------------------*/
    // Configure HeapOMP for the shared memory heap
    var HeapOMP = xdc.useModule('ti.omp.utils.HeapOMP');
    var Timestamp = xdc.useModule('xdc.runtime.Timestamp');
    var OpenMP = xdc.useModule('ti.omp.utils.OpenMP');
    OpenMP.setNumProcessors(8);
    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",
    }
    );
    // Enable Cache Write-back for HEAPOMP
    var Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
    Cache.setMarMeta(0x80000000, 0x20000000, Cache.PC | Cache.WTE);
    /*-----------------------------------------------------------------------------*/
    /* define a Section to store Shared input data and private data for each Core */
    /*-----------------------------------------------------------------------------*/
    Program.sectMap["InputBuffer"] = new Program.SectionSpec();
    Program.sectMap["InputBuffer"].loadSegment = "DDR3";
    Program.sectMap[".threadprivateBuffer"] = new Program.SectionSpec();
    Program.sectMap[".threadprivateBuffer"].loadSegment = "L2SRAM";
    /*-----------------------------------------------------------------------------*/
    /* System Configuration : Memory for Variable and Program Code */
    /*-----------------------------------------------------------------------------*/
    Program.sectMap["systemHeapMaster"] = "DDR3"; // contains Heap Buffer
    Program.sectMap[".cinit"] = "MSMCSRAM_MASTER"; // contains tables for initializing variables and constants
    Program.sectMap[".const"] = "MSMCSRAM_MASTER"; // contains string literal, floating-point constant
    Program.sectMap[".text"] = "MSMCSRAM_MASTER"; // contains all executable code
    Program.sectMap[".far"] = "L2SRAM"; // reserve space for global variable declared with far

    I defined two region InputBuffer to store my shared input data  and threadprivatebuffer to store private input  data for each core .

    But I don´t no if all these Configuration is correct .

    QuestionS : how I can init a Array to store it in programSection InputBuffer ?

    thank for reply

    Lopez

  • Hi Lopez,

    If I don't correctly understand your question, please let me know.

    When you put a variable array in the section, we have two ways to initialize it as usual C language manner, namely (1) initialization by C start-up routine, or (2) initialing it by application.  In both cases, we can tell compiler to allocate a variable to a specific section by TI's special pragma.

    (1)

    #pragma DATA_SECTION(array_a, "InputBuffer");
    int array_a[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

    (2)

    #pragma DATA_SECTION(array_a, "InputBuffer");
    int array_a[16];

    int main(void)
    {
        int i;
        for (i = 0; i < 16; i ++)
            array_a[i] = i;
        // ...
    }

    Does this answer to your question?

    By the way, one notice is, if you put a variable in DDR memory and need to initialize it, we need to configure DDR memory interface (EMIF) prior to load the image into memory.  If you want to initialize DDR EMIF after going into the main() function, my recommendation is to take the (2) method shown above.  It's easy and still works well.

    Regards,
    Atsushi