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.

TMS570LS3137: Contents of F021 flash library being partially placed into .text section of executable with GCC+LD

Part Number: TMS570LS3137
Other Parts Discussed in Thread: RM48L952, , HALCOGEN

Hi,

I am trying to adapt one of the Hercules Bootloader examples to use the GCC toolchain. In the TI linker script, the flash API is placed in its own section in Flash to later be loaded into RAM. I've added the same sections to my GCC linker script, however when I execute the program, it triggers a prefetch abort when it gets to the Flash routines. When I check the executable with objdump, it turns out that it's not placing all of the flash API into the explicit section I created for it; some of the symbols get placed in the .text section.

Any guidance on this?

Here is my linker script and objdump output:

/*----------------------------------------------------------------------------*/
/* sys_link.ld                                                              */
/*                                                                            */
/* (c) Texas Instruments 2009-2013, All rights reserved.                      */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* Entry Point */
ENTRY(_c_int00)

/* Highest address of the stack */
_estack = 0x8040000;    /* end of 256K RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x400;      /* required amount of heap  */

/* Specify the memory areas */
MEMORY
{
  VECTORS(rx)     : ORIGIN = 0x00000000, LENGTH = 0x00000020
  FLASH_API  (rx) : ORIGIN = 0x00000020, LENGTH = 0x000014E0
  FLASH  (rx)     : ORIGIN = 0x00001500, LENGTH = 0x002FEB00
  CPU_STACK (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00002000 /* Stack is configured in sys_core.asm */
  RAM (xrw)       : ORIGIN = 0x08002000, LENGTH = 0x0002D000
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
}

/* Define output sections */
SECTIONS
{
  /* The ISR vector goes first into RAM */
  .intvecs :
  {
    . = ALIGN(4);
    KEEP(*(.intvecs)) /* ISR vector */
    . = ALIGN(4);
  } >VECTORS

  /* used by the startup to initialize flashAPI */
  _siflashAPI = LOADADDR(.flashAPI);

.flashAPI :
  {
    . = ALIGN(4);

    _sflashAPI = .;         /* create a global symbol at data start */
    *Fapi_UserDefinedFunctions.c.o (.text .text*)
    *bl_flash.c.o (.text .text*)
    *F021_API_CortexR4_BE_V3D16.lib (.text .text*)

    . = ALIGN(4);
    _eflashAPI = .;            /* define a global symbol at data end */
  } >RAM AT> FLASH_API
  /* The program code and other data goes into RAM */

  . = ALIGN(4);


  .text :
  {
    . = ALIGN(4);
    /* original placement */
     *(.text)            /* .text sections (code) */
     *(.text*)             /* .text sections (code) */

    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH




  /* Constant data goes into RAM */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH

   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM
    .ARM : {
    __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
    } >FLASH

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = LOADADDR(.data);
 
  /* Initialized data sections goes into RAM, load LMA copy after code */
  .data :
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM AT> FLASH

  /* Uninitialized data section */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss secion */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  PROVIDE ( end = _ebss );
  PROVIDE ( _end = _ebss );
  PROVIDE ( __end__ = _ebss );

  /* MEMORY_bank1 section, code must be located here explicitly            */
  /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
  .memory_b1_text :
  {
    *(.mb1text)        /* .mb1text sections (code) */
    *(.mb1text*)       /* .mb1text* sections (code)  */
    *(.mb1rodata)      /* read-only data (constants) */
    *(.mb1rodata*)
  } >MEMORY_B1

  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }
 
  .ARM.attributes 0 : { *(.ARM.attributes) }
}

objdump output.elf -t | grep Fapi
00000000 l    df *ABS*  00000000 Fapi_UserDefinedFunctions.c
00015839 l     F .text  00000000 .hidden _Fapi_divideUnsignedLong
080024c8 l     F .flashAPI      00000008 __Fapi_setActiveFlashBank_from_arm
080024d0 l     F .flashAPI      00000008 __Fapi_initializeFlashBanks_from_arm
080024d8 l     F .flashAPI      00000008 __Fapi_doMarginReadByByte_from_arm
080024e0 l     F .flashAPI      00000008 __Fapi_issueAsyncCommandWithAddress_from_arm
080024e8 l     F .flashAPI      00000008 __Fapi_enableMainBankSectors_from_arm
080024f0 l     F .flashAPI      00000008 __Fapi_issueProgrammingCommand_from_arm
00016099 l     F .text  0000000c __Fapi_serviceWatchdogTimer_from_thumb
000160a4 l     F .text  00000008 __Fapi_BlockProgram_veneer
000160ac l     F .text  00000008 __Fapi_UpdateStatusProgram_veneer
000160b4 l     F .text  00000008 __Fapi_BlockErase_veneer
00016049 g     F .text  00000000 .hidden Fapi_isAddressEEPROM
08002028 g     F .flashAPI      00000024 Fapi_setupBankSectorEnable
00015e05 g     F .text  00000000 .hidden Fapi_doMarginReadByByte
08002138 g     F .flashAPI      00000084 Fapi_Init
00015ee5 g     F .text  00000000 .hidden _Fapi_readDword
00015e51 g     F .text  00000000 .hidden Fapi_calculateEcc
00015f11 g     F .text  00000000 .hidden _Fapi_exitMarginMode
00015b11 g     F .text  00000000 .hidden Fapi_setActiveFlashBank
00015ff9 g     F .text  00000000 .hidden Fapi_isAddressEcc
00015f3d g     F .text  00000000 .hidden _Fapi_enterMarginMode
00015ead g     F .text  00000000 .hidden _Fapi_readLword
00015c8d g     F .text  00000000 .hidden Fapi_issueProgrammingCommand
08002284 g     F .flashAPI      00000058 Fapi_UpdateStatusProgram
00015e65 g     F .text  00000000 .hidden Fapi_calculateFletcherChecksum
00015e9d g     F .text  00000000 .hidden Fapi_getNumberOfBankSectors
0800246c g     F .flashAPI      00000058 Fapi_BlockRead
00015fa5 g     F .text  00000000 .hidden Fapi_flushPipeline
00015e45 g     F .text  00000000 .hidden _Fapi_checkWdService
08002330 g     F .flashAPI      0000013c Fapi_BlockErase
00015ab5 g     F .text  00000000 .hidden _Fapi_issueFsmCommand
00015fc7 g     F .text  00000000 .hidden Fapi_waitDelay
000157c9 g     F .text  00000000 .hidden Fapi_enableMainBankSectors
00015855 g     F .text  00000000 .hidden Fapi_initializeFlashBanks
00015799 g     F .text  00000000 .hidden Fapi_issueAsyncCommandWithAddress
080021bc g     F .flashAPI      000000c8 Fapi_BlockProgram
08002000 g     F .flashAPI      00000008 .hidden Fapi_serviceWatchdogTimer
08002008 g     F .flashAPI      00000020 Fapi_setupEepromSectorEnable

  • From the dumped memory content, no all flash APIs are copied to RAM, and the functions in bl_flash.c are not copied to RAM.

  • Yes that's correct. As you can see in the linker script above, I am instructing the linker to place the library and all related functions in the .flash_api section. However, it's not placing all of the symbols there.

    .flashAPI :
      {
        . = ALIGN(4);

        _sflashAPI = .;         /* create a global symbol at data start */
        *Fapi_UserDefinedFunctions.c.o (.text .text*)
        *bl_flash.c.o (.text .text*)
        *F021_API_CortexR4_BE_V3D16.lib (.text .text*)

        . = ALIGN(4);
        _eflashAPI = .;            /* define a global symbol at data end */
      } >RAM AT> FLASH_API
      /* The program code and other data goes into RAM */

      . = ALIGN(4);

    Do you have an example of a properly formatted linker script that will place all flash symbols in the correct section?

  • I have example of linker cmd file used for TI CCS, but I don't have example for GCC.

  • Do you have an example of a properly formatted linker script that will place all flash symbols in the correct section?

    Since sections from a library need to be placed, you appear to need to use a :* suffix after the library name to specify all object files; as found on CortexFan - Re: Linker question. How to change memory section for functions that com (gnu.org).

    The attached example is for a RM48L952 using GNU v9.2.1 with CCS 10.3, and links the F021_API_CortexR4_LE_V3D16 (little-endian) version of the library. Used a RM48L952 (little-endian Cortex-R4F) as don't have a TMS570LS3137 (big-endian Cortex-R4F)

    The following was used in the linker script:

      /* used by the startup to initialize flashAPI */
       _siflashAPI = LOADADDR(.flashAPI);
    
      .flashAPI :
      {
        . = ALIGN(4);
    
        _sflashAPI = .;         /* create a global symbol at data start */
        *Fapi_UserDefinedFunctions.o (.text*)
        *F021_API_CortexR4_LE_V3D16.lib:* (.text*)
    
        . = ALIGN(4);
        _eflashAPI = .;            /* define a global symbol at data end */
      } >RAM AT> FLASH_API
    

    The linker .map file shows the the sections from the F021 API library being given a run address in SRAM:

                    0x00000020                _siflashAPI = LOADADDR (.flashAPI)
    
    .flashAPI       0x08001500      0x888 load address 0x00000020
                    0x08001500                . = ALIGN (0x4)
                    0x08001500                _sflashAPI = .
     *Fapi_UserDefinedFunctions.o(.text*)
     .text          0x08001500        0x8 ./source/Fapi_UserDefinedFunctions.o
                    0x08001500                Fapi_serviceWatchdogTimer
     *F021_API_CortexR4_LE_V3D16.lib:*(.text*)
     .text          0x08001508        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Async.obj)
     .text:Fapi_issueAsyncCommand
                    0x08001508       0x2a C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Async.obj)
                    0x08001508                Fapi_issueAsyncCommand
     .text          0x08001532        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Async.WithAddress.obj)
     *fill*         0x08001532        0x2 
     .text:Fapi_issueAsyncCommandWithAddress
                    0x08001534       0x30 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Async.WithAddress.obj)
                    0x08001534                Fapi_issueAsyncCommandWithAddress
     .text          0x08001564        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(BlankCheck.obj)
     .text:Fapi_doBlankCheck
                    0x08001564       0x94 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(BlankCheck.obj)
                    0x08001564                Fapi_doBlankCheck
     .text          0x080015f8        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.EnableEepromSectors.obj)
     .text:_Fapi_EnableSectors
                    0x080015f8       0x44 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.EnableEepromSectors.obj)
                    0x080015f8                _Fapi_EnableSectors
     .text:Fapi_enableEepromBankSectors
                    0x0800163c       0x80 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.EnableEepromSectors.obj)
                    0x0800163c                Fapi_enableEepromBankSectors
     .text          0x080016bc        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.InitializeFlashBanks.obj)
     .text:_Fapi_divideUnsignedLong
                    0x080016bc       0x1c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.InitializeFlashBanks.obj)
     .text:Fapi_initializeFlashBanks
                    0x080016d8      0x260 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.InitializeFlashBanks.obj)
                    0x080016d8                Fapi_initializeFlashBanks
     .text          0x08001938        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.IssueFsmCommand.obj)
     .text:_Fapi_issueFsmCommand
                    0x08001938       0x3c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.IssueFsmCommand.obj)
                    0x08001938                _Fapi_issueFsmCommand
     .text          0x08001974        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.ScaleFclk.obj)
     .text:_scaleMainFclk
                    0x08001974       0x10 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.ScaleFclk.obj)
                    0x08001974                _scaleMainFclk
     .text:_scaleEEFclk
                    0x08001984       0x10 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.ScaleFclk.obj)
                    0x08001984                _scaleEEFclk
     .text          0x08001994        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.SetActiveBank.obj)
     .text:Fapi_setActiveFlashBank
                    0x08001994      0x17c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.SetActiveBank.obj)
                    0x08001994                Fapi_setActiveFlashBank
     .text          0x08001b10        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.FlushPipeline.obj)
     .text:Fapi_flushPipeline
                    0x08001b10       0x22 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.FlushPipeline.obj)
                    0x08001b10                Fapi_flushPipeline
     .text          0x08001b32        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.LoopDword.obj)
     .text:_Fapi_loopRegionForValue
                    0x08001b32       0x5e C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.LoopDword.obj)
                    0x08001b32                _Fapi_loopRegionForValue
     .text          0x08001b90        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.WdService.obj)
     .text:_Fapi_checkWdService
                    0x08001b90        0xc C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.WdService.obj)
                    0x08001b90                _Fapi_checkWdService
     .text          0x08001b9c        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.CalculateFletcher.obj)
     .text:Fapi_calculateFletcherChecksum
                    0x08001b9c       0x40 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.CalculateFletcher.obj)
                    0x08001b9c                Fapi_calculateFletcherChecksum
     .text          0x08001bdc        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.WaitDelay.obj)
     .text:Fapi_waitDelay
                    0x08001bdc       0x30 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.WaitDelay.obj)
                    0x08001bdc                Fapi_waitDelay
     .text          0x08001c0c        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.GetNumberOfSectors.obj)
     .text:Fapi_getNumberOfBankSectors
                    0x08001c0c       0x10 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Utilities.GetNumberOfSectors.obj)
                    0x08001c0c                Fapi_getNumberOfBankSectors
     .text          0x08001c1c        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.Common.obj)
     .text:_Fapi_readLword
                    0x08001c1c       0x36 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.Common.obj)
                    0x08001c1c                _Fapi_readLword
     .text:_Fapi_readDword
                    0x08001c52       0x2c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.Common.obj)
                    0x08001c52                _Fapi_readDword
     *fill*         0x08001c7e        0x2 
     .text:_Fapi_exitMarginMode
                    0x08001c80       0x2c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.Common.obj)
                    0x08001c80                _Fapi_exitMarginMode
     .text:_Fapi_enterMarginMode
                    0x08001cac       0x68 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(Read.Common.obj)
                    0x08001cac                _Fapi_enterMarginMode
     .text          0x08001d14        0x0 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.Hercules.IsEccAddress.obj)
     .text:Fapi_isAddressEcc
                    0x08001d14       0x50 C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.Hercules.IsEccAddress.obj)
                    0x08001d14                Fapi_isAddressEcc
     .text:Fapi_isAddressEEPROM
                    0x08001d64       0x1c C:/ti/Hercules/F021 Flash API/02.01.01/F021_API_CortexR4_LE_V3D16.lib(FlashStateMachine.Hercules.IsEccAddress.obj)
                    0x08001d64                Fapi_isAddressEEPROM
     .text:Fapi_isAddressEEPROM.__stub
                    0x08001d80        0x8 linker stubs
                    0x08001d88                . = ALIGN (0x4)
                    0x08001d88                _eflashAPI = .
                    0x08001d88                . = ALIGN (0x4)
    

    As does the objdump output:

    c:\ti\ccs1030\ccs\tools\compiler\gcc-arm-none-eabi-9-2019-q4-major\bin\arm-none-eabi-objdump.exe -t RM48L952_GCC_FEE_read_write.out | find "Fapi"
    00000000 l    df *ABS*  00000000 Fapi_UserDefinedFunctions.c
    080016bc l     F .flashAPI      00000000 .hidden _Fapi_divideUnsignedLong
    0000e890 l     F .text  00000008 __Fapi_issueAsyncCommand_from_arm
    0000e898 l     F .text  00000008 __Fapi_issueAsyncCommandWithAddress_from_arm
    0000e8a0 l     F .text  00000008 __Fapi_initializeFlashBanks_from_arm
    0000e8a8 l     F .text  00000008 __Fapi_doBlankCheck_from_arm
    0000e8b0 l     F .text  00000008 __Fapi_setActiveFlashBank_from_arm
    0000e8b8 l     F .text  00000008 __Fapi_enableEepromBankSectors_from_arm
    08001d80 l     F .flashAPI      00000008 __Fapi_serviceWatchdogTimer_from_thumb
    08001d64 g     F .flashAPI      00000000 .hidden Fapi_isAddressEEPROM
    0800163c g     F .flashAPI      00000000 .hidden Fapi_enableEepromBankSectors
    08001508 g     F .flashAPI      00000000 .hidden Fapi_issueAsyncCommand
    08001b32 g     F .flashAPI      00000000 .hidden _Fapi_loopRegionForValue
    08002302 g     O .bss   00000001 TI_Fee_FapiInitCalled
    08001c52 g     F .flashAPI      00000000 .hidden _Fapi_readDword
    08001c80 g     F .flashAPI      00000000 .hidden _Fapi_exitMarginMode
    08001994 g     F .flashAPI      00000000 .hidden Fapi_setActiveFlashBank
    08001d14 g     F .flashAPI      00000000 .hidden Fapi_isAddressEcc
    080015f8 g     F .flashAPI      00000000 .hidden _Fapi_EnableSectors
    08001cac g     F .flashAPI      00000000 .hidden _Fapi_enterMarginMode
    08001c1c g     F .flashAPI      00000000 .hidden _Fapi_readLword
    08001b9c g     F .flashAPI      00000000 .hidden Fapi_calculateFletcherChecksum
    08001c0c g     F .flashAPI      00000000 .hidden Fapi_getNumberOfBankSectors
    08001b10 g     F .flashAPI      00000000 .hidden Fapi_flushPipeline
    08001b90 g     F .flashAPI      00000000 .hidden _Fapi_checkWdService
    08001938 g     F .flashAPI      00000000 .hidden _Fapi_issueFsmCommand
    08001bdc g     F .flashAPI      00000000 .hidden Fapi_waitDelay
    080016d8 g     F .flashAPI      00000000 .hidden Fapi_initializeFlashBanks
    08001564 g     F .flashAPI      00000000 .hidden Fapi_doBlankCheck
    08001534 g     F .flashAPI      00000000 .hidden Fapi_issueAsyncCommandWithAddress
    08001500 g     F .flashAPI      00000008 .hidden Fapi_serviceWatchdogTimer
    The attached example project is based upon the C:\ti\Hercules\HALCoGen\v04.07.01\examples\RM48x\example_TI_Fee_Write_Read.c example, and I checked it ran successfully with the F021 flash API functions running in SRAM.

    RM48L952_GCC_FEE_read_write.zip