From b96b050609514cfc4f3eaceeb128272db20d17c5 Mon Sep 17 00:00:00 2001 From: gaurav-aws Date: Tue, 17 Dec 2019 00:14:26 +0000 Subject: [PATCH] Use the linker script variables for MPU setup for Keil Simulator Demo 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 Simulator demo to use the variables exported from the linker script. This ensures that the MPU setup does not go out of sync with linker script. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2761 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../NonSecure/FreeRTOSDemo_ns.sct | 83 +++++++++++-------- .../NonSecure/main_ns.c | 48 ++++++----- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/FreeRTOSDemo_ns.sct b/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/FreeRTOSDemo_ns.sct index dc3c9ae85..e523fa16a 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/FreeRTOSDemo_ns.sct +++ b/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/FreeRTOSDemo_ns.sct @@ -2,60 +2,77 @@ ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* -; Privileged Code: -; Start : 0x00200000 -; End : 0x00208000 - 1 -; Size : 32 Kbytes +; 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 Data: -; Start : 0x20200000 -; End : 0x20201000 - 1 -; Size : 4 Kbytes -LR_IROM_NS_PRIVILEGED 0x00200000 0x00008000 ; load region size_region +; --------------------- +; | Privileged Code | +; --------------------- +; | System Calls | +; --------------------- +; | Unprivileged Code | +; --------------------- + +LR_CODE 0x00200000 ; 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 0x20200000 0x00001000 + ER_IROM_NS_PRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0 { - *(privileged_data) } -} -; FreeRTOS System Calls: -; Start : 0x00208000 -; End : 0x00209000 - 1 -; Size : 4 Kbytes -LR_IROM_NS_FREERTOS_SYSTEM_CALLS 0x00208000 0x00001000 ; load region size_region -{ - ER_IROM_NS_FREERTOS_SYSTEM_CALLS +0 ; load address = execution address + 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 { - *(freertos_system_calls) } } -; Unprivileged Code: -; Start : 0x00209000 -; End : 0x00400000 - 1 -; Size : 2012 Kbytes +; 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. ] ; -; Unprivileged Data: -; Start : 0x20201000 -; End : 0x20220000 - 1 -; Size : 124 Kbytes -LR_IROM_NS_UNPRIVILEGED 0x00209000 0x001F7000 ; load region size_region +; --------------------- +; | Privileged Data | +; --------------------- +; | Unprivileged Data | +; --------------------- + +LR_DATA 0x20200000 ; load region { - ER_IROM_NS_UNPRIVILEGED +0 ; load address = execution address + ER_IRAM_NS_PRIVILEGED 0x20200000 ALIGN 32 + { + *(privileged_data) + } + + ER_IRAM_NS_PRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0 { - *(+RO) } - ER_IRAM_NS_UNPRIVILEGED 0x20201000 0x0001F000 + ER_IRAM_NS_UNPRIVILEGED +0 ALIGN 32 { *(+RW, +ZI) } + + ER_IRAM_NS_UNPRIVILEGED_ALIGN +0 ALIGN 32 EMPTY 0x0 + { + } } diff --git a/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/main_ns.c b/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/main_ns.c index edb4bdd14..42ac4f49a 100644 --- a/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/main_ns.c +++ b/FreeRTOS/Demo/CORTEX_MPU_M33F_Simulator_Keil_GCC/NonSecure/main_ns.c @@ -33,30 +33,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 * ) ( 0x00200000 ); -const uint32_t * __privileged_functions_end__ = ( uint32_t * ) ( 0x00208000 - 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. */ -const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) ( 0x00208000 ); -const uint32_t * __syscalls_flash_end__ = ( uint32_t * ) ( 0x00209000 - 0x1 ); /* Last address in Flash region containing system calls. */ - -/* Unprivileged flash. Note that the section containing - * system calls is unprivilged so that unprivleged tasks - * can make system calls. */ -const uint32_t * __unprivileged_flash_start__ = ( uint32_t * ) ( 0x00209000 ); -const uint32_t * __unprivileged_flash_end__ = ( uint32_t * ) ( 0x00400000 - 0x1 ); /* Last address in un-privileged Flash region. */ - -/* 512 bytes (0x200) of RAM starting at 0x30008000 is - * priviledged access only. This contains kernel data. */ -const uint32_t * __privileged_sram_start__ = ( uint32_t * ) ( 0x20200000 ); -const uint32_t * __privileged_sram_end__ = ( uint32_t * ) ( 0x20201000 - 0x1 ); /* Last address in privileged RAM. */ +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. 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. */ + +/* 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 * ) ( 0x20201000 ); -const uint32_t * __unprivileged_sram_end__ = ( uint32_t * ) ( 0x20220000 - 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. */ /*-----------------------------------------------------------*/ /** -- 2.39.2