/* ----------------------------------------------------------------------------- * start.c —— C 运行时启动:设置栈指针、把控制权交给 main。 * * 这是全工程唯一非写不可的内联汇编(C 语言无法表达"设置 sp")。 * 复位时 PC = 0,所以 _start 必须落在 .text.init(见 linker.ld)。 * * 注意用的是 lui/addi 绝对寻址 + jalr,**不是** auipc —— 这颗核没有 auipc。 * ---------------------------------------------------------------------------*/ extern unsigned __stack_top[]; int main(void); __attribute__((naked, section(".text.init"), used, noreturn)) void _start(void) { __asm__ volatile( "lui sp, %hi(__stack_top)\n\t" "addi sp, sp, %lo(__stack_top)\n\t" "lui t0, %hi(main)\n\t" "addi t0, t0, %lo(main)\n\t" "jalr x0, t0, 0\n\t"); } /* 清 .bss(纯 C)。上电时 FPGA 里的 RAM 本来就是 0,这一步只是保险。 */ extern unsigned __bss_start[]; extern unsigned __bss_end[]; void crt_zero_bss(void) { unsigned *p = __bss_start; while (p < __bss_end) { *p = 0u; p = p + 1u; } }