EMU - 多架构 CPU 模拟器
一个模块化、可扩展的 CPU 模拟器框架,支持多种 CPU 架构和外设设备。
项目特性
已实现的 CPU 架构
1. RISC-V (RV32I)
- 完整的 RV32I 基础指令集 (47 条指令)
- 支持所有算术、逻辑、内存访问、控制流指令
- CSR (控制状态寄存器) 支持
- 系统调用 (ECALL, EBREAK)
- 内存屏障 (FENCE)
2. MCS-51/8051
- 经典 8051 微控制器架构
- 8 位累加器和 B 寄存器
- 程序状态字 (PSW) - 进位、辅助进位、溢出、奇偶校验
- 128 字节内部 RAM
- 128 字节特殊功能寄存器 (SFR)
- 16 位数据指针 (DPTR)
- 栈操作 (PUSH/POP)
- 寄存器组选择 (4 组 × 8 寄存器)
核心系统
- 内存总线系统: 支持 RAM 和 MMIO 设备的统一地址空间
- CPU 抽象接口: 易于添加新的 CPU 架构
- 设备框架: 标准化的设备接口 (read/write/tick)
- 中断控制器: 可配置优先级的中断管理
外设设备
UART (通用异步收发器)
- 16 字节 TX/RX FIFO
- 状态寄存器 (TX ready/empty, RX ready/full)
- 控制寄存器 (TX/RX enable, 中断使能)
- 波特率除数寄存器
- 中断生成 (TX/RX 事件)
- 输出回调机制
寄存器映射:
- 0x00: 数据寄存器 (RX/TX)
- 0x04: 状态寄存器
- 0x08: 控制寄存器
- 0x0C: 波特率除数
定时器
- 32 位计数器,可配置预分频器
- 比较寄存器 (周期中断)
- 自动重置模式 (周期定时器)
- 单次触发模式 (超时事件)
- 比较匹配中断
- 手动计数器设置/读取
寄存器映射:
- 0x00: 控制寄存器 (enable, IRQ, auto-reset, one-shot)
- 0x04: 状态寄存器 (running, match, overflow)
- 0x08: 计数器值
- 0x0C: 比较值
- 0x10: 预分频器除数
测试覆盖
- 9 个测试套件, 100% 通过
- 完整的单元测试覆盖所有组件
- 每个 CPU 架构都有专门的测试套件
- 设备功能的全面测试
示例应用
RISC-V 演示程序
位于 targets/freertos-riscv/demo.c
功能演示:
- CPU 初始化和复位
- 内存映射 I/O 访问
- UART 设备配置和数据传输
- 程序执行和设备交互
运行演示:
cd build
./targets/freertos-riscv/riscv_demo
输出:
=== RISC-V Emulator Demo ===
Simple program: Print 'Hi' via UART
Starting execution at 0x80000000
Output from UART:
----------------------------------------
Hi
----------------------------------------
Execution completed
构建说明
依赖
- CMake 3.12+
- C11 编译器 (GCC/Clang)
编译
mkdir build
cd build
cmake ..
make -j4
运行测试
make test
项目结构
EMU/
├── include/
│ ├── emu/ # 核心框架头文件
│ │ ├── cpu.h # CPU 抽象接口
│ │ ├── memory.h # 内存总线
│ │ ├── device.h # 设备接口
│ │ ├── interrupt.h
│ │ └── machine.h
│ ├── cpu/ # CPU 架构头文件
│ │ ├── riscv.h
│ │ └── mcs51.h
│ └── devices/ # 设备头文件
│ ├── uart.h
│ └── timer.h
├── src/
│ ├── core/ # 核心实现
│ ├── cpu/ # CPU 实现
│ │ ├── riscv/
│ │ └── mcs51/
│ └── devices/ # 设备实现
├── tests/
│ └── unit/ # 单元测试
├── targets/ # 示例应用
│ └── freertos-riscv/
└── CMakeLists.txt
扩展性
添加新的 CPU 架构
- 在
include/cpu/创建头文件 - 实现
emu_cpu_ops_t接口 - 在
src/cpu/实现 CPU 逻辑 - 调用
emu_cpu_register()注册
添加新设备
- 在
include/devices/创建头文件 - 实现
emu_device_t接口 (read/write/tick) - 在
src/devices/实现设备逻辑 - 通过
emu_memory_bus_add_region()映射到地址空间
内存映射示例 (RISC-V 演示)
| 基地址 | 大小 | 设备 |
|---|---|---|
| 0x80000000 | 64KB | RAM |
| 0x10000000 | 4KB | UART |
| 0x10001000 | 4KB | Timer |
已完成的任务
✅ RISC-V RV32I 完整指令集 - 所有基础指令,47 条
✅ UART 设备 - 串口通信,带 FIFO 和中断
✅ 定时器设备 - RTOS 时钟源,多种模式
✅ RISC-V 演示程序 - 可运行的示例应用
✅ MCS-51/8051 架构 - 经典 8 位微控制器
待实现功能
- GDB 远程调试支持 - GDB RSP 协议实现
- 更多 8051 指令 - 扩展指令集覆盖
- 更多外设 - GPIO, SPI, I2C, ADC
- NES/6502 架构 - 第三个 CPU 架构
- 完整的 FreeRTOS 移植 - 任务调度和 RTOS API
技术亮点
- 架构抽象清晰: CPU、内存、设备完全解耦
- 高度可扩展: 通过注册机制轻松添加新组件
- 内存映射 I/O: 统一的地址空间,设备访问透明
- 测试驱动: 所有功能都有单元测试保证
- 实用性: 可以运行真实的二进制程序
性能特点
- 指令级模拟,准确度高
- 设备 tick 机制支持周期性操作
- 高效的内存访问(最近访问缓存)
- 适合教学、原型开发、固件测试
使用场景
- 嵌入式系统开发: 在 PC 上测试固件
- 教学: 学习 CPU 架构和汇编语言
- 逆向工程: 分析未知固件
- 原型验证: 在硬件可用前验证算法
- 自动化测试: CI/CD 中的固件测试
许可证
MIT License
贡献者
- Initial implementation by Claude Sonnet 4.6
- Project architecture and design
最后更新: 2026-06-20
版本: 0.1.0
状态: 活跃开发中