mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 187:0387e8f68319 1 /* mbed Microcontroller Library - stackheap
AnnaBridge 187:0387e8f68319 2 * Copyright (C) 2009-2011 ARM Limited. All rights reserved.
AnnaBridge 187:0387e8f68319 3 *
AnnaBridge 187:0387e8f68319 4 * Setup a fixed single stack/heap memory model,
AnnaBridge 187:0387e8f68319 5 * between the top of the RW/ZI region and the stackpointer
AnnaBridge 187:0387e8f68319 6 */
AnnaBridge 187:0387e8f68319 7
AnnaBridge 187:0387e8f68319 8 #ifdef __cplusplus
AnnaBridge 187:0387e8f68319 9 extern "C" {
AnnaBridge 187:0387e8f68319 10 #endif
AnnaBridge 187:0387e8f68319 11
AnnaBridge 187:0387e8f68319 12 #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
AnnaBridge 187:0387e8f68319 13 #include <arm_compat.h>
AnnaBridge 187:0387e8f68319 14 #endif
AnnaBridge 187:0387e8f68319 15
AnnaBridge 187:0387e8f68319 16 #include <rt_misc.h>
AnnaBridge 187:0387e8f68319 17 #include <stdint.h>
AnnaBridge 187:0387e8f68319 18
AnnaBridge 187:0387e8f68319 19 extern char Image$$ARM_LIB_STACK$$ZI$$Limit[];
AnnaBridge 187:0387e8f68319 20 extern char Image$$ARM_LIB_HEAP$$Base[];
AnnaBridge 187:0387e8f68319 21 extern char Image$$ARM_LIB_HEAP$$ZI$$Limit[];
AnnaBridge 187:0387e8f68319 22 extern __value_in_regs struct __initial_stackheap _mbed_user_setup_stackheap(uint32_t R0, uint32_t R1, uint32_t R2, uint32_t R3) {
AnnaBridge 187:0387e8f68319 23
AnnaBridge 187:0387e8f68319 24 struct __initial_stackheap r;
AnnaBridge 187:0387e8f68319 25 r.heap_base = (uint32_t)Image$$ARM_LIB_HEAP$$Base;
AnnaBridge 187:0387e8f68319 26 r.heap_limit = (uint32_t)Image$$ARM_LIB_HEAP$$ZI$$Limit;
AnnaBridge 187:0387e8f68319 27 return r;
AnnaBridge 187:0387e8f68319 28 }
AnnaBridge 187:0387e8f68319 29
AnnaBridge 187:0387e8f68319 30 #if !defined(MBED_CONF_RTOS_PRESENT) || !MBED_CONF_RTOS_PRESENT
AnnaBridge 187:0387e8f68319 31
AnnaBridge 187:0387e8f68319 32 /* The single region memory model would check stack collision at run time, verifying that
AnnaBridge 187:0387e8f68319 33 * the heap pointer is underneath the stack pointer. With two-region memory model/RTOS-less or
AnnaBridge 187:0387e8f68319 34 * multiple threads(stacks)/RTOS, the check gets meaningless and we must disable it. */
AnnaBridge 187:0387e8f68319 35 #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
AnnaBridge 187:0387e8f68319 36 __asm(".global __use_two_region_memory\n\t");
AnnaBridge 187:0387e8f68319 37 __asm(".global __use_no_semihosting\n\t");
AnnaBridge 187:0387e8f68319 38 #else
AnnaBridge 187:0387e8f68319 39 #pragma import(__use_two_region_memory)
AnnaBridge 187:0387e8f68319 40 #endif
AnnaBridge 187:0387e8f68319 41
AnnaBridge 187:0387e8f68319 42 /* Fix __user_setup_stackheap and ARM_LIB_STACK/ARM_LIB_HEAP cannot co-exist in RTOS-less build
AnnaBridge 187:0387e8f68319 43 *
AnnaBridge 187:0387e8f68319 44 * According AN241 (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0241b/index.html),
AnnaBridge 187:0387e8f68319 45 * __rt_entry has the following call sequence:
AnnaBridge 187:0387e8f68319 46 * 1. _platform_pre_stackheap_init
AnnaBridge 187:0387e8f68319 47 * 2. __user_setup_stackheap or setup the Stack Pointer (SP) by another method
AnnaBridge 187:0387e8f68319 48 * 3. _platform_post_stackheap_init
AnnaBridge 187:0387e8f68319 49 * 4. __rt_lib_init
AnnaBridge 187:0387e8f68319 50 * 5. _platform_post_lib_init
AnnaBridge 187:0387e8f68319 51 * 6. main()
AnnaBridge 187:0387e8f68319 52 * 7. exit()
AnnaBridge 187:0387e8f68319 53 *
AnnaBridge 187:0387e8f68319 54 * Per our check, when __user_setup_stackheap and ARM_LIB_STACK/ARM_LIB_HEAP co-exist, neither
AnnaBridge 187:0387e8f68319 55 * does __user_setup_stackheap get called and nor is ARM_LIB_HEAP used to get heap base/limit,
AnnaBridge 187:0387e8f68319 56 * which are required to pass to __rt_lib_init later. To fix the issue, by subclass'ing
AnnaBridge 187:0387e8f68319 57 * __rt_lib_init, heap base/limit are replaced with Image$$ARM_LIB_HEAP$$ZI$$Base/Limit if
AnnaBridge 187:0387e8f68319 58 * ARM_LIB_HEAP region is defined in scatter file.
AnnaBridge 187:0387e8f68319 59 *
AnnaBridge 187:0387e8f68319 60 * The overriding __rt_lib_init is needed only for rtos-less code. For rtos code, __rt_entry is
AnnaBridge 187:0387e8f68319 61 * overridden and the overriding __rt_lib_init here gets meaningless.
AnnaBridge 187:0387e8f68319 62 */
AnnaBridge 187:0387e8f68319 63 extern __value_in_regs struct __argc_argv $Super$$__rt_lib_init(unsigned heapbase, unsigned heaptop);
AnnaBridge 187:0387e8f68319 64
AnnaBridge 187:0387e8f68319 65 __value_in_regs struct __argc_argv $Sub$$__rt_lib_init (unsigned heapbase, unsigned heaptop)
AnnaBridge 187:0387e8f68319 66 {
AnnaBridge 187:0387e8f68319 67 return $Super$$__rt_lib_init((unsigned) Image$$ARM_LIB_HEAP$$Base, (unsigned) Image$$ARM_LIB_HEAP$$ZI$$Limit);
AnnaBridge 187:0387e8f68319 68 }
AnnaBridge 187:0387e8f68319 69
AnnaBridge 187:0387e8f68319 70 #endif
AnnaBridge 187:0387e8f68319 71
AnnaBridge 187:0387e8f68319 72 #ifdef __cplusplus
AnnaBridge 187:0387e8f68319 73 }
AnnaBridge 187:0387e8f68319 74 #endif