ARM Cortex-M4 (Nuvoton NUC472) not booting with External RAM on EBI Interface

Hi,

We are working on ARM Cortex-M4 (Nuvoton NUC472) based SoC as per our requirement.We are facing one critical issue like board is not booting when we enabled and used extrenal RAM on EBI.

We have ported following BSP package with below toolchain for NUC472.

We have created bare framework with above BSP and we are able to start the board with existing ld script provided in BSP with internal RAM support.

Now, We have added the support for external RAM of 512KB on EBI in linker script as per our requirement to move few libraries into external RAM.So, We have added one test library and placed in external ram to validate and test external RAM with our bare build.
But, Board does not starts if we make any variable as extern to use from library which is placed into external RAM.

It is working fine If we are putting that library into internal RAM then board gets up and running without any stuck up issue.

Please find following CFLAGS and LDFLAGS options which we are using into our compilation support.

CFLAGS :
        -mcpu=cortex-m4
        -mthumb
        -mfpu=fpv4-sp-d16
        -mfloat-abi=hard
        -g2
        -Wall
        -c
        -DNUC442RI8AE
        -D__FPU_USED -std=c99
        -ffunction-sections -fdata-sections
        -fstrict-volatile-bitfields
        -fno-short-enums


LDFLAGS :
        -Wl,--gc-sections
        -Wl,-static
        -Xlinker --no-enum-size-warning
        -Xlinker --wrap=_malloc_r
        -Xlinker --wrap=_free_r
        -Xlinker --wrap=_calloc_r
        -Xlinker --wrap=_realloc_r
        -Wl,--start-group
        -lgcc -lc -lm -lnosys
        -Wl,--end-group

Please find following list of libraries which we have moved into external RAM

  1. test library
  2. FreeRTOS Heap Memory

Please find attached sample multi RAM linker script (for reference) and our own sample linker script which we have used into our example

  • Sample multi RAM linker script (for reference)

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Linker script to configure memory regions.
* Need modifying for a specific board.
* FLASH.ORIGIN: starting address of flash
* FLASH.LENGTH: length of flash
* RAM.ORIGIN: starting address of RAM bank 0
* RAM.LENGTH: length of RAM bank 0
*/
MEMORY
{
FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x20000 /* 128K */
RAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* 8K */
RAM2 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x2000 /* 8K */
}
/* Linker script to place sections and symbol values. Should be used together
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
* Reset_Handler : Entry of reset handler
*
* It defines following symbols, which code can use without definition:
* __exidx_start
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • Our own sample linker script

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Linker script to configure memory regions. */
APP_START = DEFINED(APP_START_LOC) ? APP_START_LOC : 0 ;
APP_SIZE = DEFINED(APP_START_LOC) ? 0x80000 - APP_START : 0x80000 ;
FREE_RAM_REQ = DEFINED(MIN_FREE_RAM) ? MIN_FREE_RAM : 0;
MEMORY
{
FLASH (rx) : ORIGIN = APP_START, LENGTH = APP_SIZE /* 512k */
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000 /* 64k */
RAM_EXTERN (rwx) : ORIGIN = 0x60000000, LENGTH = 0x80000 /* 64k */
}
/* Library configurations */
GROUP(libgcc.a libc.a libm.a libnosys.a)
/* Linker script to place sections and symbol values. Should be used together
* with other linker script that defines memory regions FLASH and RAM.
* It references following symbols, which must be defined in code:
* Reset_Handler : Entry of reset handler
*
* It defines following symbols, which code can use without definition:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Also, Please find below code execution flow of our sample project on which external RAM on EBI is not working
    
    1) On Board Boot Up, Linker script is calling Reset_Handler from which _start is called
    2) after that main function will be called from main.c file of BSP
    3) Then it will create Hardware Setup, EBI Init, Data Copy and init heap section
    4) After that we have created one sample task to test freeRTOS functionality

So, check above details with linker script and let me know if need any more details from my side regarding same.

0