用途:引导代理完成裸机固件从复位到 main() 的启动流程,覆盖复位与异常向量、.data/.bss 初始化、栈与堆设置、C 运行时与链接脚本集成,以及 Cortex-M 和 RISC-V 常见 bring-up 问题。
适用场景:固件在到达 main() 前挂起;移植到无厂商 HAL 的新 MCU;编写自定义 startup.s 或 Reset_Handler;与链接脚本技能集成;调试启动时未初始化全局变量或栈溢出。
启动顺序模型:上电/复位后 CPU 从 vector[0] 加载 SP,从 vector[1] 跳转到 Reset_Handler;Reset_Handler 初始化时钟(可选)、复制 .data、清零 .bss、配置栈指针、调用 SystemInit()/platform_init(),最后调用 main(),main 不得返回(循环或 WFI)。
Cortex-M 向量表:索引 0 为初始栈指针 _estack,1 为 Reset_Handler,2 为 NMI_Handler,3 为 HardFault_Handler,4 起为 NVIC 各 IRQ。资料给出最小 startup.s 示例,包含 .isr_vector 段、Reset_Handler 中 .data 的 LMA→VMA 复制循环与 .bss 清零循环,并调用 SystemInit 与 main。
VTOR 重定位:通过 SCB->VTOR = base & 0xFFFFFF80U 设置,需 __DSB() 与 __ISB();引导程序跳转到应用时通常需将 VTOR 指向应用向量表地址(如 STM32 flash 的 0x08020000)。
RISC-V 启动:entry.S 中 _start 设置 sp 为 _stack_top,清零 _bss_start 到 _bss_end,调用 main 后循环;陷阱向量使用 M 模式的 mtvec。
crt0 职责:复制 .data LMA→VMA、清零 .bss、初始化栈、可选堆(_sbrk)、C++ 构造函数(__libc_init_array())、FPU 使能(Cortex-M4F/M7 的 SystemInit)。
链接脚本集成:_estack = ORIGIN(RAM) + LENGTH(RAM); _sidata = LOADADDR(.data); 需与链接脚本技能配合完成 MEMORY/SECTIONS 布局。
常见问题:立即 HardFault 多为栈指针无效,需将 _estack 设为有效 RAM 顶部;启动时全局变量错误因 .data 未复制;BSS 非零因未清零;IRQ 不触发因 VTOR 指向错误表;main 返回进入垃圾代码因缺少循环;C++ 静态初始化崩溃因构造函数早于时钟初始化,应先调用 SystemInit。
用法示例:/baremetal-startup My STM32 never reaches main — what should Reset_Handler do? 以及 /baremetal-startup How do I relocate the vector table after bootloader jump?
限制:资料未提供具体安装命令、收费方式或平台支持范围,暂未提供。