Repository navigation
Expand file tree
/
Copy pathSTM32F103C8Tx_FLASH.ld
More file actions
executable file
·92 lines (82 loc) · 2.75 KB
/
Copy pathSTM32F103C8Tx_FLASH.ld
File metadata and controls
executable file
·92 lines (82 loc) · 2.75 KB
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
/*
* Linker script for STM32F103C8T6 (128K Flash, 20K RAM)
* 基于 libopencm3 项目脚本[citation:6]
*/
/* 定义程序入口点为 Reset_Handler */
ENTRY(Reset_Handler)
/* 定义栈顶地址(RAM末尾) */
_estack = ORIGIN(ram) + LENGTH(ram); /* 栈顶位于RAM结束位置 */
/* 定义堆和栈的最小大小(可根据需要调整) */
_Min_Heap_Size = 0x200; /* 512字节的堆 */
_Min_Stack_Size = 0x400; /* 1024字节的栈 */
/* 定义内存区域[citation:1] */
MEMORY
{
/* Flash:可读可执行(rx),起始地址0x08000000,长度128K */
rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
/* RAM:可读可写可执行(rwx),起始地址0x20000000,长度20K[citation:6] */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}
/* 定义输出文件的段(Sections)布局[citation:1] */
SECTIONS
{
/* 中断向量表必须放在Flash最开始 */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* 使用KEEP确保启动文件中的向量表不被优化掉 */
. = ALIGN(4);
} >rom
/* 程序代码和只读数据 (.text .rodata) */
.text :
{
. = ALIGN(4);
*(.text) /* .text 段(代码) */
*(.text*) /* .text* 段(代码) */
*(.rodata) /* .rodata 段(只读常量数据) */
*(.rodata*) /* .rodata* 段 */
. = ALIGN(4);
_etext = .; /* 定义代码结束的全局符号 */
} >rom
/* 已初始化的全局/静态变量 (.data)
* 这些变量的初始值存储在Flash(LMA),上电后需拷贝到RAM(VMA)中[citation:1] */
_sidata = LOADADDR(.data); /* 获取.data段在Flash中的加载地址(LMA) */
.data :
{
. = ALIGN(4);
_sdata = .; /* 定义.data段在RAM中开始地址(VMA)的符号 */
*(.data)
*(.data*)
. = ALIGN(4);
_edata = .; /* 定义.data段在RAM中结束地址的符号 */
} >ram AT >rom /* VMA >ram, LMA >rom */
/* 未初始化的全局/静态变量 (.bss)
* 上电后需要将此区域在RAM中初始化为零 */
.bss :
{
. = ALIGN(4);
_sbss = .; /* 定义.bss段开始地址的符号 */
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
_ebss = .; /* 定义.bss段结束地址的符号 */
} >ram
/* 用户堆和栈空间检查 */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >ram
/* 移除标准库中可能不需要的部分(可选) */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
}