这是一个系统化的嵌入式开发项目,模拟真实的嵌入式系统启动流程。

项目目标

实现一个完整的嵌入式系统,包含:

  • Bootloader(从 Flash 加载程序到 SRAM)
  • 数据搬运(.data 段拷贝)
  • BSS 清零
  • 跳转到应用程序
  • UART 驱动和 Shell

系统架构

内存布局:
┌─────────────────────┐ 0x80000000
│   Bootloader        │ Flash (ROM)
│   - 初始化          │
│   - 数据拷贝        │
│   - 跳转到 SRAM     │
├─────────────────────┤ 0x80010000
│   应用程序镜像      │
│   - .text           │
│   - .rodata         │
│   - .data (初始值)  │
├─────────────────────┤ 0x80100000
│   SRAM              │
│   - .text (拷贝)    │
│   - .data (拷贝)    │
│   - .bss (清零)     │
│   - 栈              │
└─────────────────────┘

设计要求

1. 两阶段启动

  • Stage 1 (Bootloader):运行在 Flash (0x80000000)
  • Stage 2 (Application):运行在 SRAM (0x80100000)

2. 数据搬运

  • 将 .text 段从 Flash 拷贝到 SRAM
  • 将 .data 段从 Flash 拷贝到 SRAM
  • 清零 .bss 段

3. 地址重定位

  • 使用位置无关代码(PIC)
  • 正确处理符号地址

学习路径

第一部分:环境与基础

  1. QEMU RISC-V 入门
  2. RISC-V 内存布局
  3. 链接脚本详解

第二部分:启动流程

  1. Bootloader 原理
  2. 启动代码编写

第三部分:硬件驱动

  1. UART 串口协议
  2. UART 驱动实现
  3. BSP 板级支持包

第四部分:系统库

  1. Mini Libc 实现
  2. 标准输入输出

第五部分:应用开发

  1. Shell 程序设计
  2. 系统集成与调试

开始学习

QEMU RISC-V 入门 开始!

更新时间: