MCU GD32A启动流程及各个段的初始化

程序在编译和链接阶段会根据不同的段类型生成相应的段,并在启动时通过特定的机制来区分和初始化这些段。以下是具体的步骤和机制:

1. 编译阶段

在编译阶段,编译器会根据源代码中的变量声明和函数定义,将它们分配到不同的段中。常见的段包括:

  • 代码段(.text):包含程序的可执行代码和常量数据。
  • 数据段(.data):包含已初始化的全局变量和静态变量。
  • BSS段(.bss):包含未初始化的全局变量和静态变量。
  • 只读数据段(.rodata):包含只读数据,如字符串常量。

编译器会在生成的目标文件(如 .o 文件)中标记这些段的信息。

2. 链接阶段

在链接阶段,链接器会将多个目标文件中的段合并成一个最终的可执行文件或库文件。链接器会根据段的类型和属性,将它们放置在内存中的特定位置,并生成相应的符号表和重定位信息。

3. 启动文件

启动文件(如 startup_gd32a50x.s)负责在系统启动时初始化这些段。启动文件通常包含以下步骤:

在嵌入式系统的启动过程中,数据段、代码段和BSS段的区分和初始化通常在启动文件(如 startup_gd32a50x.s)中完成。具体来说,这些段的区分和初始化步骤如下:

1. 定义段

在启动文件中,首先定义各个段的属性和位置。例如:

assembly 复制代码
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
2. 初始化向量表

向量表中包含了各个中断和异常处理函数的地址,通常位于代码段(.intvec)中:

assembly 复制代码
__vector_table
DCD     sfe(CSTACK)                         ; top of stack
DCD     Reset_Handler                     ; Reset Handler
DCD     NMI_Handler                       ; NMI Handler
...
3. 复位处理函数

复位处理函数 Reset_Handler 是系统启动后的第一个执行点,它负责初始化各个段:

assembly 复制代码
PUBWEAK Reset_Handler
SECTION .text:CODE:NOROOT:REORDER(2)
Reset_Handler
LDR     r0, =0x1FFFF7E0
LDR     r2, [r0]
LDR     r0, = 0xFFFF0000
AND     r2, r2, r0
LSR     r2, r2, #16
LSL     r2, r2, #10
LDR     r1, =0x20000000
MOV     r0, #0x00
SRAM_INIT       STM     r1!, {r0}
SUBS    r2, r2, #4
CMP     r2, #0x00
BNE     SRAM_INIT                
LDR     R0, =SystemInit
BLX     R0
LDR     R0, =__iar_program_start
BX      R0
4. 数据段和BSS段的初始化

Reset_Handler 中,数据段和BSS段的初始化通常通过以下步骤完成:

4.1. 初始化数据段

数据段(.data)包含已初始化的全局变量和静态变量。这些变量的初始值存储在Flash中,需要在启动时复制到RAM中。

assembly 复制代码
LDR     R0, =__data_load
LDR     R1, =__data_start
LDR     R2, =__data_end
COPY_DATA
LDR     R3, [R0], #4
STR     R3, [R1], #4
CMP     R1, R2
BNE     COPY_DATA
4.2. 初始化BSS段

BSS段(.bss)包含未初始化的全局变量和静态变量。这些变量在启动时需要清零。

assembly 复制代码
LDR     R0, =__bss_start
LDR     R1, =__bss_end
CLR_BSS
MOV     R2, #0
STR     R2, [R0], #4
CMP     R0, R1
BNE     CLR_BSS
5. 跳转到主程序

完成所有初始化后,跳转到主程序的入口点 __iar_program_start

assembly 复制代码
LDR     R0, =__iar_program_start
BX      R0

总结

  • 编译阶段:编译器根据源代码生成不同类型的段。
  • 链接阶段:链接器将这些段合并并生成最终的可执行文件,同时生成符号表和重定位信息。
  • 启动文件 :启动文件中的复位处理函数 Reset_Handler 负责在系统启动时初始化各个段,包括数据段的复制和BSS段的清零。
  • 链接脚本:链接脚本定义了各个段在内存中的布局。

通过这些步骤,程序能够正确地区分和初始化各个段,确保系统在启动时处于正确的状态。

相关推荐
BBNbQKHXygfU4 分钟前
基于遗传算法优化BP神经网络的时间序列预测探索
mcu
LingLong_roar7 分钟前
手搓温湿度传感器(单片机普冉PY32F002AF15P6TU + 温湿度传感器 SHT40-AD1B-R2 + 0.96寸TFT IPS 显示屏)
单片机·嵌入式硬件
~光~~7 分钟前
【嵌入式linux学习】06_中断子系统
linux·单片机·学习
XINVRY-FPGA13 分钟前
中阶FPGA效能红线重新划定! AMD第2代Kintex UltraScale+登场,记忆体频宽跃升5倍
嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
不做无法实现的梦~19 分钟前
思翼mk32遥控器配置图传和数传教程
linux·嵌入式硬件·机器人·自动驾驶
上海合宙LuatOS24 分钟前
LuatOS ——Modbus RTU 通信模式
java·linux·服务器·开发语言·网络·嵌入式硬件·物联网
意法半导体STM3238 分钟前
【官方原创】FDCAN数据段波特率增加后发送失败的问题分析 LAT1617
javascript·网络·stm32·单片机·嵌入式硬件·安全
Lester_11011 小时前
嵌入式学习笔记 - 自举电路
笔记·嵌入式硬件·学习
想放学的刺客1 小时前
单片机嵌入式试题(第30期)全局变量“满天飞“!!!局限性和影响有哪些,什么情况下才不得不使用?
单片机·嵌入式硬件·mcu·物联网·51单片机
jl48638212 小时前
【选型指南】气密性检测仪显示屏如何兼顾IP65防护、-40℃~85℃宽温与快速交付?
大数据·人工智能·stm32·单片机·物联网