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 @@
; Privileged Code:
; Start : 0x10040000
; End : 0x10047000 - 1
; Size : 28 Kbytes
; NOTE: 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:
; Start : 0x30008000
; End : 0x30009000 - 1
; Size : 4 Kbytes
LR_IROM_NS_PRIVILEGED 0x10040000 0x00007000 ; load region size_region
; Flash Layout
;
; ---------------------
; | Privileged Code |
; ---------------------
; | 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)
*(InRoot$$Sections) ; All sections that must be in a root region
*(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)
}
}
; System Calls:
; 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
ER_IRAM_NS_PRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{
*(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)
}
}
ER_IRAM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0
{
}
}

View File

@ -37,28 +37,40 @@
#include "tz_demo.h"
#include "mpu_demo.h"
/* Externs needed by the MPU setup code. These must match the memory map as
* specified in Scatter-Loading description file (FreeRTOSDemo_ns.sct). */
/* Externs needed by the MPU setup code. These are defined in Scatter-Loading
* 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. */
const uint32_t * __privileged_functions_start__ = ( uint32_t * ) ( 0x10040000 );
const uint32_t * __privileged_functions_end__ = ( uint32_t * ) ( 0x10047000 - 0x1 ); /* Last address in privileged Flash region. */
const uint32_t * __privileged_functions_start__ = ( uint32_t * ) &( Image$$ER_IROM_NS_PRIVILEGED$$Base );
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
* is unprivileged so that unprivileged tasks can make system calls.*/
const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) ( 0x10047000 );
const uint32_t * __syscalls_flash_end__ = ( uint32_t * ) ( 0x10048000 - 0x1 ); /* Last address in Flash region containing system calls. */
/* Flash containing system calls. */
const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) &( Image$$ER_IROM_NS_FREERTOS_SYSTEM_CALLS$$Base );
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. */
/* Unprivileged flash. */
const uint32_t * __unprivileged_flash_start__ = ( uint32_t * ) ( 0x10048000 );
const uint32_t * __unprivileged_flash_end__ = ( uint32_t * ) ( 0x10080000 - 0x1 ); /* Last address in un-privileged Flash region. */
/* Unprivileged flash. Note that the section containing system calls is
* unprivileged so that unprivileged tasks can make system calls. */
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. */
const uint32_t * __privileged_sram_start__ = ( uint32_t * ) ( 0x30008000 );
const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( 0x30009000 - 0x1 ); /* Last address in privileged RAM. */
/* 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_end__ = ( uint32_t * ) ( ( uint32_t ) &( Image$$ER_IRAM_NS_PRIVILEGED_ALIGN$$Limit ) - 0x1 ); /* Last address in privileged RAM. */
/* Unprivileged RAM. */
const uint32_t * __unprivileged_sram_start__ = ( uint32_t * ) ( 0x30009000 );
const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( 0x30018000 - 0x1 ); /* Last address in un-privileged RAM. */
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. */
/*-----------------------------------------------------------*/
/**

View File

@ -1,10 +1,7 @@
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
; NOTE: 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.
;
; 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 |
@ -13,8 +10,16 @@
; ---------------------
; | 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
{
@ -44,20 +49,7 @@ LR_CODE 0x00200000 ; load region
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
{
*(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. */
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. */
;
/* Unprivileged RAM. */
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. */