-
Notifications
You must be signed in to change notification settings - Fork 0
/
Teensy31_flash.ld
158 lines (130 loc) · 3.29 KB
/
Teensy31_flash.ld
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* Teensy31_flash.ld generic linker script for Teensy 3.1 flash-based projects
*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_startup)
/*
* SRAM is split into two contiguous blocks of equal size. SRAM_L
* is the lower half of RAM and SRAM_H is the higher half.
*
* For devices with 64K, the low 32K will appear 0x1fff8000 to 0x2000000
* and the high 32K will appear 0x20000000 to 0x20007fff.
*/
MEMORY
{
sram (W!RX) : ORIGIN = 0x1fff8000, LENGTH = 64K
flash (RX) : ORIGIN = 0x00000000, LENGTH = 256K
}
/* Define the top our stack at the end of SRAM */
TOTAL_RESERVED_STACK = 8196; /* note that printf() and other stdio routines use 4K+ from stack! */
_top_stack = (0x1fff8000+64K); /* calc top of stack */
/*
* Define the amount of heap space to reserve.
*/
TOTAL_RESERVED_HEAP = 8K;
EXTERN(__interrupt_vector_table);
SECTIONS
{
.text :
{
CREATE_OBJECT_SYMBOLS
/* Insert the interrupt vector table first */
__interrupt_vector_table = .;
*(.interrupt_vector_table)
/* Startup assembly */
*(.startup)
/* Rest of the code (C) */
*(.text)
*(.text.*)
*(.glue_7)
*(.glue_7t)
/* Added following section for holding initializers for variables
* that will be accessed from RAM; see also the AT(_end_data_flash)
* usage below.
*
* The _data_size value will be used in the startup code to step through
* the image of data in flash and copy it to RAM.
*/
. = ALIGN(4);
*(.rodata)
*(.rodata*)
*(.init) /* added */
*(.fini) /* added */
. = ALIGN(4);
_end_data_flash = .;
} >flash
/*
* ------------------- Start of SRAM sections ---------------
*/
/*
* If moving vectors from flash to RAM, declare a reserved area for
* the RAM vector table. This section should appear first, so it gets
* assigned to the first available SRAM address. Due to requirements
* of the NVIC subsystem, this address MUST be on a 1024-byte
* boundary.
*/
.RAMVectorTable :
{
*(.RAMVectorTable)
}
. = ALIGN(4);
/* From generic.ld, supplied by CodeSourcery */
/* .ARM.exidx is sorted, so has to go in its own output section. */
PROVIDE_HIDDEN (__exidx_start = .);
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} >sram
PROVIDE_HIDDEN (__exidx_end = .);
/* .data : AT (_end_data_flash) */
.data :
{
_start_data_flash = LOADADDR(.data);
_start_data = .;
*(.data)
*(.data.*)
*(.shdata)
_end_data = .;
} >sram AT>flash
. = ALIGN(4);
_data_size = _end_data - _start_data;
.noinit :
{
*(.noinit)
*(.noinit.*)
} >sram
_start_bss = .;
.bss :
{
*(.bss)
*(.bss.*)
*(COMMON)
} >sram
. = ALIGN(4);
PROVIDE(_end_bss = .); /* make value of _end_bss available externally */
bss_size = _end_bss - _start_bss;
/* Stack can grow down to here, right after data and bss sections in
* SRAM */
_start_stack = _top_stack - TOTAL_RESERVED_STACK;
_top_stack = _top_stack; /* just to make the map file easier to read */
/*
* If you want a heap, declare it here.
*/
.heap :
{
PROVIDE(_startHeap = .);
*(.heap)
. += TOTAL_RESERVED_HEAP;
. = ALIGN(4);
PROVIDE(_endHeap = .);
} > sram
/* Linker wants .eh_frame section defined because of gcc 4.4.X bug,
* just discard it here. */
/DISCARD/ :
{
*(.eh_*)
}
}
_end = .;
PROVIDE(end = .);