Better generation of heap section.

With this change, the heap section occupy the whole space from the end of
the bss section to the start of the stack section instead of taking a
fixed size in RAM.

This change allows applications to make a more efficient use of the RAM
available and allows application to be compiled if the space between end
of bss and start of stack is less than 2048 bytes.
pull/1854/head
Vincent Coubard 2016-06-05 17:56:01 +01:00
parent 000e04d768
commit c0a6c7c6d4
4 changed files with 20 additions and 26 deletions

View File

@ -124,18 +124,20 @@ SECTIONS
__bss_end__ = .; __bss_end__ = .;
} > RAM } > RAM
.heap (COPY): .heap (NOLOAD):
{ {
__end__ = .; __end__ = .;
end = __end__; end = __end__;
__HeapBase = .;
*(.heap*) *(.heap*)
. = ORIGIN(RAM) + LENGTH(RAM) - Stack_Size;
__HeapLimit = .; __HeapLimit = .;
} > RAM } > RAM
/* .stack_dummy section doesn't contains any symbols. It is only /* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign * used for linker to calculate size of stack sections, and assign
* values to stack symbols later */ * values to stack symbols later */
.stack_dummy (COPY): .stack_dummy (NOLOAD):
{ {
*(.stack*) *(.stack*)
} > RAM } > RAM

View File

@ -124,18 +124,20 @@ SECTIONS
__bss_end__ = .; __bss_end__ = .;
} > RAM } > RAM
.heap (COPY): .heap (NOLOAD):
{ {
__end__ = .; __end__ = .;
end = __end__; end = __end__;
__HeapBase = .;
*(.heap*) *(.heap*)
. = ORIGIN(RAM) + LENGTH(RAM) - Stack_Size;
__HeapLimit = .; __HeapLimit = .;
} > RAM } > RAM
/* .stack_dummy section doesn't contains any symbols. It is only /* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign * used for linker to calculate size of stack sections, and assign
* values to stack symbols later */ * values to stack symbols later */
.stack_dummy (COPY): .stack_dummy (NOLOAD):
{ {
*(.stack*) *(.stack*)
} > RAM } > RAM

View File

@ -124,18 +124,20 @@ SECTIONS
__bss_end__ = .; __bss_end__ = .;
} > RAM } > RAM
.heap (COPY): .heap (NOLOAD):
{ {
__end__ = .; __end__ = .;
end = __end__; end = __end__;
__HeapBase = .;
*(.heap*) *(.heap*)
. = ORIGIN(RAM) + LENGTH(RAM) - Stack_Size;
__HeapLimit = .; __HeapLimit = .;
} > RAM } > RAM
/* .stack_dummy section doesn't contains any symbols. It is only /* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign * used for linker to calculate size of stack sections, and assign
* values to stack symbols later */ * values to stack symbols later */
.stack_dummy (COPY): .stack_dummy (NOLOAD):
{ {
*(.stack*) *(.stack*)
} > RAM } > RAM

View File

@ -1,4 +1,4 @@
/* /*
Copyright (c) 2013, Nordic Semiconductor ASA Copyright (c) 2013, Nordic Semiconductor ASA
All rights reserved. All rights reserved.
@ -28,8 +28,8 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/* /*
NOTE: Template files (including this one) are application specific and therefore NOTE: Template files (including this one) are application specific and therefore
expected to be copied into the application project folder prior to its use! expected to be copied into the application project folder prior to its use!
*/ */
@ -43,6 +43,7 @@ expected to be copied into the application project folder prior to its use!
#else #else
.equ Stack_Size, 2048 .equ Stack_Size, 2048
#endif #endif
.globl Stack_Size
.globl __StackTop .globl __StackTop
.globl __StackLimit .globl __StackLimit
__StackLimit: __StackLimit:
@ -53,21 +54,9 @@ __StackTop:
.section .heap .section .heap
.align 3 .align 3
#ifdef __HEAP_SIZE
.equ Heap_Size, __HEAP_SIZE
#else
.equ Heap_Size, 2048
#endif
.globl __HeapBase .globl __HeapBase
.globl __HeapLimit .globl __HeapLimit
__HeapBase:
.if Heap_Size
.space Heap_Size
.endif
.size __HeapBase, . - __HeapBase
__HeapLimit:
.size __HeapLimit, . - __HeapLimit
.section .Vectors .section .Vectors
.align 2 .align 2
.globl __Vectors .globl __Vectors
@ -129,7 +118,7 @@ __Vectors:
/* Reset Handler */ /* Reset Handler */
.equ NRF_POWER_RAMON_ADDRESS, 0x40000524 .equ NRF_POWER_RAMON_ADDRESS, 0x40000524
.equ NRF_POWER_RAMON_RAMxON_ONMODE_Msk, 0x3 .equ NRF_POWER_RAMON_RAMxON_ONMODE_Msk, 0x3
.text .text
.thumb .thumb
@ -148,7 +137,7 @@ Reset_Handler:
STR R2, [R0] STR R2, [R0]
/* Loop to copy data from read only memory to RAM. The ranges /* Loop to copy data from read only memory to RAM. The ranges
* of copy from/to are specified by following symbols evaluated in * of copy from/to are specified by following symbols evaluated in
* linker script. * linker script.
* __etext: End of code section, i.e., begin of data sections to copy from. * __etext: End of code section, i.e., begin of data sections to copy from.
* __data_start__/__data_end__: RAM address range that data should be * __data_start__/__data_end__: RAM address range that data should be
@ -167,7 +156,7 @@ Reset_Handler:
str r0, [r2,r3] str r0, [r2,r3]
bgt .LC1 bgt .LC1
.LC0: .LC0:
LDR R0, =SystemInit LDR R0, =SystemInit
BLX R0 BLX R0
LDR R0, =_start LDR R0, =_start
@ -259,4 +248,3 @@ Default_Handler:
.end .end