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.

TMS320F28386S: Illegal operation with library flash command.

Part Number: TMS320F28386S
Other Parts Discussed in Thread: C2000WARE

In copyData() in this file:

C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f2838x\examples\c28x_dual\flash_kernel\flash_kernel_c28x_dual_ex1_boot_cpu1.c

My program crashes with an illegal operation on the 2nd call to

oReturnCheck = Fapi_doBlankCheck((uint32_t *)sectorAddress,
                                                             sectorSize,
                                                             &oFlashStatusWord);

Debug trace says

Intterupt_illegalOperationHandler() at interrrupt:158 0x0874A0

This is a library function with no source so I cannot debug it.

  • Hi John,

    Is this function placed in flash or RAM?

    Can you check whether or not the contents of the function are intact in the memory where it is placed?

    Thanks and regards,

    Vamsi

  • Thanks for the idea Vamsi, you were right. The pragma preamble for the function did not match the section name in the linker file. I fixed that and now have exposed a new problem. The error is:

    "../2838x_flash_lnk_cpu1.cmd", line 67: error #10099-D: program will not fit into available memory, or the section contains a call site that requires a trampoline that can't be generated for this section. run placement with alignment/blocking fails for section "lfuFuncsCpu1Cpu1" size 0x914 page 0.  Available memory ranges:
       RAMLS1_5     size: 0x2800       unused: 0x458        max hole: 0x458 

    This says there is unused memory so do you think it is a trampoline problem? Here is my cmd file.

    MEMORY
    {
    
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AE     /* Part of M0, BOOT rom will use this for stack */
       RAMM0_1          : origin = 0x0001B0, length = 0x000648
       // RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008         /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       CLA_MSGRAMLOW    : origin = 0x001480, length = 0x000080
       CLA_MSGRAMHIGH   : origin = 0x001500, length = 0x000080
       RAMD0_1          : origin = 0x00C000, length = 0x001000
       RAMLS0           : origin = 0x008000, length = 0x000800
       RAMLS1_5         : origin = 0x008800, length = 0x002800
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMGS0_1         : origin = 0x00D000, length = 0x002000
       RAMGS2_4         : origin = 0x00F000, length = 0x003000
       RAMGS5_6         : origin = 0x012000, length = 0x002000
       RAMGS7           : origin = 0x014000, length = 0x001000
       RAMGS8_9         : origin = 0x015000, length = 0x002000
       RAMGS10_15       : origin = 0x017000, length = 0x005FF8
       // RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008         /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 20012000
    GROUP {      /* GROUP memory ranges for crc/checksum of entire flash */
       #endif
    #endif
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2_5         : origin = 0x084000, length = 0x014000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10_11       : origin = 0x0B8000, length = 0x004000  /* on-chip Flash */
       FLASH12_13       : origin = 0x0BC000, length = 0x003FF0  /* on-chip Flash */
       // FLASH13_RSVD     : origin = 0x0BFFF0, length = 0x000010    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    #ifdef __TI_COMPILER_VERSION__
      #if __TI_COMPILER_VERSION__ >= 20012000
    }  crc(_table_name, algorithm=C28_CHECKSUM_16)
      #endif
    #endif
    
       CPUTOCMRAM      : origin = 0x039000, length = 0x000800
       CMTOCPURAM      : origin = 0x038000, length = 0x000800
       CPU1TOCPU2RAM   : origin = 0x03A000, length = 0x000800
       CPU2TOCPU1RAM   : origin = 0x03B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
       EMIF1_CS0n      : origin = 0x80000000, length = 0x01000000
    }
    
    SECTIONS
    {
       codestart           : > BEGIN, ALIGN(4)
       .text               : > FLASH2_5, ALIGN(4)
       .cinit              : > FLASH1, ALIGN(4)
       .switch             : > FLASH1, ALIGN(4)
       .reset              : > RESET, TYPE = DSECT /* not used, */
       .stack              : > RAMM0_1
    
          lfuFuncsCpu1Cpu1 :  LOAD = FLASH6 | FLASH7 | FLASH8
    	                       RUN = RAMLS1_5, //RAMGS10_15,
    		                   LOAD_START(lfuFuncsCpu1Cpu1LoadStart),
    		                   LOAD_SIZE (lfuFuncsCpu1Cpu1LoadSize),
    		                   LOAD_END  (lfuFuncsCpu1Cpu1LoadEnd),
    		                   RUN_START (lfuFuncsCpu1Cpu1RunStart),
    		                   RUN_SIZE  (lfuFuncsCpu1Cpu1RunSize),
    		                   RUN_END   (lfuFuncsCpu1Cpu1RunEnd),
    		                   ALIGN(8)
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH1, ALIGN(4)
       .bss             : > RAMGS2_4
       .bss:output      : > RAMGS2_4
       .bss:cio         : > RAMGS2_4
       .data            : > RAMGS5_6
       .sysmem          : > RAMGS2_4
       /* Initalized sections go in Flash */
       .const           : > FLASH12_13, ALIGN(4)
    #else
       .pinit           : > FLASH1, ALIGN(4)
       .ebss            : > RAMGS2_4
       .esysmem         : > RAMGS2_4
       .cio             : > RAMGS2_4
       /* Initalized sections go in Flash */
       .econst          : >> FLASH12_13, ALIGN(4)
    #endif
    
       .farbss          : > EMIF1_CS0n
       .farconst        : > EMIF1_CS0n
       .em1_cs0         : > EMIF1_CS0n
    
    /*** CLA Compiler Required Sections ***/
       .scratchpad         : > RAMLS7                /* Scratchpad memory for the CLA C Compiler */
       .const_cla          : > RAMLS7
    
       ramgs0 : > RAMGS0_1, type=NOINIT
       
       MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM    : > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU    : > CMTOCPURAM, type=NOINIT
    
       #if defined(__TI_EABI__)
           .TI.ramfunc : {} LOAD = FLASH0,
                            RUN = RAMLS0,
                            LOAD_START(RamfuncsLoadStart),
                            LOAD_SIZE(RamfuncsLoadSize),
                            LOAD_END(RamfuncsLoadEnd),
                            RUN_START(RamfuncsRunStart),
                            RUN_SIZE(RamfuncsRunSize),
                            RUN_END(RamfuncsRunEnd),
                            ALIGN(4)
        #else
           .TI.ramfunc : {} LOAD = FLASH0,
                            RUN = RAMLS0,
                            LOAD_START(_RamfuncsLoadStart),
                            LOAD_SIZE(_RamfuncsLoadSize),
                            LOAD_END(_RamfuncsLoadEnd),
                            RUN_START(_RamfuncsRunStart),
                            RUN_SIZE(_RamfuncsRunSize),
                            RUN_END(_RamfuncsRunEnd),
                            ALIGN(4)
        #endif
    
       DataBufferSection   : > RAMGS7, ALIGN(4)
       LogSection          : > RAMD0_1, ALIGN(4)
       ParamSection        : > RAMGS8_9, ALIGN(4)
       ClaToCpuMsgRAM      : > CLA_MSGRAMLOW              /* Link to CLA Message RAM */
       CpuToClaMsgRAM      : > CLA_MSGRAMHIGH             /* Link to CLA Message RAM */
       ClaData             : > RAMLS6                     /* Link to CLA Data RAM */
       .bss_cla            : > RAMLS6                     /* Link to CLA Data RAM */
    
       /* Link to CLA Program RAM */
       Cla1Prog            : LOAD = FLASH10_11,
                             RUN = RAMLS1_5,
                             LOAD_START(ClaProgLoadStart),
                             RUN_START(ClaProgRunStart),
                             LOAD_SIZE(ClaProgLoadSize) ,
                             ALIGN(4)
    
       /* crc/checksum section configured as COPY section to avoid including in executable */
       .TI.memcrc          : type = COPY
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

  • Hi John

    I assigned this to an expert to help you.  Please expect a reply in a day or two.

    Thanks and regards,
    Vamsi

  • Hi again Vamsi,

    I had read the document you had referenced and I thought I was using the techniques with these lines:

          lfuFuncsCpu1Cpu1 :  LOAD = FLASH6 | FLASH7 | FLASH8,
                               RUN = RAMLS1_5, //RAMGS10_15,

    It turns out that I needed to change the second line to

         RUN = RAMGS10_15,

    as the LS1_5 apparently was not large enough. My program keeps crashing because I keep finding new functions that need the linker pragma added. I really did not expect to find actual function definitions in header files. I think I have copied the necessary flash api files to my project directory and have removed flash api from my include options. So it is tedious but I think I am on the right path. You asked if the function was in flash or ram and then I immediately knew what I had overlooked.

    I will leave this unresolved until I get a clean run but I think it is solved. What is of the greatest concern is trying to set up the link file so that library function can be loaded in flash and run in ram. The simple trick of applying pragma statements can not be used in this case.

    Thanks again,

    John