Loading...
Loading...
Bare-metal startup skill for reset-to-main bring-up. Use when writing startup code, vector tables, .data/.bss init, stack setup, or crt0 for Cortex-M/RISC-V. Activates on queries about reset vector, VTOR, startup.s, bss init, or bare-metal entry point.
npx skill4agent add mohitmishra786/low-level-dev-skills baremetal-startupmain().data.bssmain()startup.sReset_Handlerskills/embedded/linker-scriptsPower-on / reset
├── CPU loads SP from vector[0]
├── CPU branches to Reset_Handler from vector[1]
├── Reset_Handler: init clocks (optional), copy .data, zero .bss
├── Configure stack pointer (if not already from vector)
├── Call SystemInit() / platform_init()
└── Call main() — must not return (loop or WFI)| Index | Entry |
|---|---|
| 0 | Initial stack pointer ( |
| 1 | |
| 2 | |
| 3 | |
| 4+ | IRQ handlers per NVIC |
/* startup.s — minimal Cortex-M */
.syntax unified
.thumb
.section .isr_vector,"a",%progbits
.global g_pfnVectors
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
/* ... device IRQ vectors from vendor CMSIS ... */
.section .text.Reset_Handler
.thumb_func
.global Reset_Handler
Reset_Handler:
ldr r0, =_sidata /* .data load address (LMA) */
ldr r1, =_sdata /* .data VMA start */
ldr r2, =_edata
b LoopCopyDataInit
CopyDataInit:
ldr r3, [r0], #4
str r3, [r1], #4
LoopCopyDataInit:
cmp r1, r2
blt CopyDataInit
ldr r2, =_sbss
ldr r4, =_ebss
movs r3, #0
b LoopFillZerobss
FillZerobss:
str r3, [r2], #4
LoopFillZerobss:
cmp r2, r4
blt FillZerobss
bl SystemInit
bl main
b ./* Linker symbols — declared extern in startup */
extern uint32_t _estack, _sidata, _sdata, _edata, _sbss, _ebss;#include "core_cm4.h" /* CMSIS */
void relocate_vector_table(uint32_t base) {
SCB->VTOR = base & 0xFFFFFF80U; /* must be aligned per ARM ref manual */
__DSB();
__ISB();
}0x08020000/* entry.S — simplified */
.section .text.entry
.global _start
_start:
la sp, _stack_top
la t0, _bss_start
la t1, _bss_end
clear_bss:
beq t0, t1, bss_done
sw zero, 0(t0)
addi t0, t0, 4
j clear_bss
bss_done:
call main
j .mtvecskills/platform/riscv-privileged| Task | Who does it |
|---|---|
Copy | |
Zero | |
| Init stack | Vector[0] or explicit |
Heap ( | Optional; libc or custom |
| C++ constructors | |
| FPU enable | |
_estack = ORIGIN(RAM) + LENGTH(RAM);
_sidata = LOADADDR(.data);skills/embedded/linker-scripts/baremetal-startup My STM32 never reaches main — what should Reset_Handler do?
/baremetal-startup How do I relocate the vector table after bootloader jump?| Symptom | Cause | Fix |
|---|---|---|
| HardFault immediately | Stack pointer invalid | Set |
| Globals wrong at boot | | Copy LMA→VMA in Reset_Handler |
| BSS non-zero | | Add bss clear loop |
| IRQs don't fire | VTOR points to wrong table | |
| No loop after main | |
| C++ static init crash | Constructors before clocks | Call |
skills/embedded/linker-scripts_estackskills/baremetal/interrupts-and-exceptions-baremetalskills/baremetal/bootloaders-embeddedskills/embedded/openocd-jtagReset_Handlerskills/low-level-programming/assembly-armskills/platform/riscv-privileged