Use linker script variables for MPU setup for Nuvoton M2351 Keil Project

Earlier we were using hard-coded addresses for MPU setup which
were ensured to be the same as linker script setup. This change
updates the Keil uVision project for Nuvoton Numaker-PFM-M2351
to use the variables exported from the linker script. This ensures
that the MPU setup never goes out of sync with linker script.
This commit is contained in:
Gaurav Aggarwal 2019-12-17 01:45:53 +00:00
parent d449c8979d
commit d58e6a7b09
4 changed files with 92 additions and 77 deletions

View File

@ -1,59 +1,70 @@
; NOTE: ARMv8-M MPU requires that each region must start on a 32 byte aligned
; Privileged Code: ; address and the size of a region must be a multiple of 32 bytes.
; Start : 0x10040000
; End : 0x10047000 - 1
; Size : 28 Kbytes
; ;
; Privileged Data: ; Flash Layout
; Start : 0x30008000 ;
; End : 0x30009000 - 1 ; ---------------------
; Size : 4 Kbytes ; | Privileged Code |
LR_IROM_NS_PRIVILEGED 0x10040000 0x00007000 ; load region size_region ; ---------------------
; | System Calls |
; ---------------------
; | Unprivileged Code |
; ---------------------
;
; RAM Layout
;
; ---------------------
; | Privileged Data |
; ---------------------
; | Unprivileged Data |
; ---------------------
LR_APP 0x10040000 ; load region
{ {
ER_IROM_NS_PRIVILEGED +0 ; load address = execution address ER_IROM_NS_PRIVILEGED +0 ALIGN 32
{ {
*.o(RESET, +First) *.o(RESET, +First)
*(InRoot$$Sections) ; All sections that must be in a root region *(InRoot$$Sections) ; All sections that must be in a root region
*(privileged_functions) *(privileged_functions)
} }
ER_IRAM_NS_PRIVILEGED 0x30008000 0x00001000 ER_IROM_NS_PRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{
}
ER_IROM_NS_FREERTOS_SYSTEM_CALLS +0 ALIGN 32
{
*(freertos_system_calls)
}
ER_IROM_NS_FREERTOS_SYSTEM_CALLS_ALIGN +0 ALIGN 32 EMPTY 0x0
{
}
ER_IROM_NS_UNPRIVILEGED +0 ALIGN 32
{
*(+RO)
}
ER_IROM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{
}
ER_IRAM_NS_PRIVILEGED 0x30008000 ALIGN 32
{ {
*(privileged_data) *(privileged_data)
} }
}
; System Calls: ER_IRAM_NS_PRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
; Start : 0x10047000
; End : 0x10048000 - 1
; Size : 4 Kbytes
LR_IROM_NS_SYSTEM_CALLS 0x10047000 0x00001000 ; load region size_region
{
ER_IROM_NS_SYSTEM_CALLS +0 ; load address = execution address
{ {
*(freertos_system_calls)
}
}
; Unprivileged Code:
; Start : 0x10048000
; End : 0x10080000 - 1
; Size : 224 Kbytes
;
; Unprivileged Data:
; Start : 0x30009000
; End : 0x30018000 - 1
; Size : 60 Kbytes
LR_IROM_NS_UNPRIVILEGED 0x10048000 0x00038000 ; load region size_region
{
ER_IROM_NS_UNPRIVILEGED +0 ; load address = execution address
{
*(+RO)
} }
ER_IRAM_NS_UNPRIVILEGED 0x30009000 0x0000F000 ER_IRAM_NS_UNPRIVILEGED +0 ALIGN 32
{ {
*(+RW, +ZI) *(+RW, +ZI)
} }
}
ER_IRAM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{
}
}

View File

@ -37,28 +37,40 @@
#include "tz_demo.h" #include "tz_demo.h"
#include "mpu_demo.h" #include "mpu_demo.h"
/* Externs needed by the MPU setup code. These must match the memory map as /* Externs needed by the MPU setup code. These are defined in Scatter-Loading
* specified in Scatter-Loading description file (FreeRTOSDemo_ns.sct). */ * description file (FreeRTOSDemo_ns.sct). */
extern uint32_t Image$$ER_IROM_NS_PRIVILEGED$$Base;
extern uint32_t Image$$ER_IROM_NS_PRIVILEGED_ALIGN$$Limit;
extern uint32_t Image$$ER_IROM_NS_FREERTOS_SYSTEM_CALLS$$Base;
extern uint32_t Image$$ER_IROM_NS_FREERTOS_SYSTEM_CALLS_ALIGN$$Limit;
extern uint32_t Image$$ER_IROM_NS_UNPRIVILEGED$$Base;
extern uint32_t Image$$ER_IROM_NS_UNPRIVILEGED_ALIGN$$Limit;
extern uint32_t Image$$ER_IRAM_NS_PRIVILEGED$$Base;
extern uint32_t Image$$ER_IRAM_NS_PRIVILEGED_ALIGN$$Limit;
extern uint32_t Image$$ER_IRAM_NS_UNPRIVILEGED$$Base;
extern uint32_t Image$$ER_IRAM_NS_UNPRIVILEGED_ALIGN$$Limit;
/* Privileged flash. */ /* Privileged flash. */
const uint32_t * __privileged_functions_start__ = ( uint32_t * ) ( 0x10040000 ); const uint32_t * __privileged_functions_start__ = ( uint32_t * ) &( Image$$ER_IROM_NS_PRIVILEGED$$Base );
const uint32_t * __privileged_functions_end__ = ( uint32_t * ) ( 0x10047000 - 0x1 ); /* Last address in privileged Flash region. */ const uint32_t * __privileged_functions_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IROM_NS_PRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in privileged Flash region. */
/* Flash containing system calls. Note that the section containing system calls /* Flash containing system calls. */
* is unprivileged so that unprivileged tasks can make system calls.*/ const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) &( Image$$ER_IROM_NS_FREERTOS_SYSTEM_CALLS$$Base );
const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) ( 0x10047000 ); const uint32_t * __syscalls_flash_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IROM_NS_FREERTOS_SYSTEM_CALLS_ALIGN$$Limit ) - 0x1 ); /* Last address in Flash region containing system calls. */
const uint32_t * __syscalls_flash_end__ = ( uint32_t * ) ( 0x10048000 - 0x1 ); /* Last address in Flash region containing system calls. */
/* Unprivileged flash. */ /* Unprivileged flash. Note that the section containing system calls is
const uint32_t * __unprivileged_flash_start__ = ( uint32_t * ) ( 0x10048000 ); * unprivileged so that unprivileged tasks can make system calls. */
const uint32_t * __unprivileged_flash_end__ = ( uint32_t * ) ( 0x10080000 - 0x1 ); /* Last address in un-privileged Flash region. */ const uint32_t * __unprivileged_flash_start__ = ( uint32_t * ) &( Image$$ER_IROM_NS_UNPRIVILEGED$$Base );
const uint32_t * __unprivileged_flash_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IROM_NS_UNPRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in un-privileged Flash region. */
/* Privileged RAM. It contains kernel data. */ /* RAM with priviledged access only. This contains kernel data. */
const uint32_t * __privileged_sram_start__ = ( uint32_t * ) ( 0x30008000 ); const uint32_t * __privileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_PRIVILEGED$$Base );
const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( 0x30009000 - 0x1 ); /* Last address in privileged RAM. */ const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_PRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in privileged RAM. */
/* Unprivileged RAM. */ /* Unprivileged RAM. */
const uint32_t * __unprivileged_sram_start__ = ( uint32_t * ) ( 0x30009000 ); const uint32_t * __unprivileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_UNPRIVILEGED$$Base );
const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( 0x30018000 - 0x1 ); /* Last address in un-privileged RAM. */ const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_UNPRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in un-privileged RAM. */
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/** /**

View File

@ -1,10 +1,7 @@
; ************************************************************* ; NOTE: ARMv8-M MPU requires that each region must start on a 32 byte aligned
; *** Scatter-Loading Description File generated by uVision *** ; address and the size of a region must be a multiple of 32 bytes.
; ************************************************************* ;
; Flash Layout ; Flash Layout
; [ ARMv8-M MPU requires that each region must start on a 32 byte aligned
; address and the size of a region must be a multiple of 32 bytes. ]
; ;
; --------------------- ; ---------------------
; | Privileged Code | ; | Privileged Code |
@ -13,8 +10,16 @@
; --------------------- ; ---------------------
; | Unprivileged Code | ; | Unprivileged Code |
; --------------------- ; ---------------------
;
; RAM Layout
;
; ---------------------
; | Privileged Data |
; ---------------------
; | Unprivileged Data |
; ---------------------
LR_CODE 0x00200000 ; load region LR_APP 0x00200000 ; load region
{ {
ER_IROM_NS_PRIVILEGED +0 ALIGN 32 ER_IROM_NS_PRIVILEGED +0 ALIGN 32
{ {
@ -44,20 +49,7 @@ LR_CODE 0x00200000 ; load region
ER_IROM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0 ER_IROM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{ {
} }
}
; RAM Layout
; [ ARMv8-M MPU requires that each region must start on a 32 byte aligned
; address and the size of a region must be a multiple of 32 bytes. ]
;
; ---------------------
; | Privileged Data |
; ---------------------
; | Unprivileged Data |
; ---------------------
LR_DATA 0x20200000 ; load region
{
ER_IRAM_NS_PRIVILEGED 0x20200000 ALIGN 32 ER_IRAM_NS_PRIVILEGED 0x20200000 ALIGN 32
{ {
*(privileged_data) *(privileged_data)

View File

@ -63,7 +63,7 @@ const uint32_t * __unprivileged_flash_end__ = ( uint32_t * ) ( ( uint32_t ) &(
/* RAM with priviledged access only. This contains kernel data. */ /* RAM with priviledged access only. This contains kernel data. */
const uint32_t * __privileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_PRIVILEGED$$Base ); const uint32_t * __privileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_PRIVILEGED$$Base );
const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_PRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in privileged RAM. */ const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_PRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in privileged RAM. */
;
/* Unprivileged RAM. */ /* Unprivileged RAM. */
const uint32_t * __unprivileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_UNPRIVILEGED$$Base ); const uint32_t * __unprivileged_sram_start__ = ( uint32_t * ) &( Image$$ER_IRAM_NS_UNPRIVILEGED$$Base );
const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_UNPRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in un-privileged RAM. */ const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_UNPRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in un-privileged RAM. */