背景
当前 firmware 从 main.c 启动,通过 gpio_write_led()、uart_puts() 和 mmio_write(TEST_EXIT) 走完整的 CPU -> MMIO -> SoC 路径。你需要理解裸机 C 如何通过 MMIO 访问硬件。
任务
- 增加
uart_puthex32(unsigned int value),功能参照名称。
- 增加
perf_read_cycle() 和 perf_read_instret()。
- 在
main.c 中打印 LED 值、cycle、instret,例如:LED=0x00000005。
- 不使用
printf,不引入 libc。
- 更新构建脚本,把新增
.c 文件加入 firmware 构建。
- 自己测试自己。
建议文件:
firmware/drivers/uart.h
firmware/drivers/uart.c
firmware/drivers/perf.h
firmware/drivers/perf.c
firmware/main.c
scripts/build_firmware.sh
需要理解
- uart_puthex32 为什么最终还是调用 uart_putc?
- uart_putc 为什么要先读 UART_STATUS?
- 读 cycle/instret 是 load 还是 store?
- firmware 里的地址如何和 RTL 的 tinybus_defs.vh 对齐?
自我评判
scripts/build_firmware.sh
sim/run_sim.sh minisoc
scripts/test_local.sh
交付物
- 小 PR / commit
- 理解 C 函数 -> MMIO 地址 -> PicoRV32 load/store -> tinybus_decode -> SoC 行为
- 能解释反汇编里对应的 MMIO 访问
背景
当前 firmware 从
main.c启动,通过gpio_write_led()、uart_puts()和mmio_write(TEST_EXIT)走完整的 CPU -> MMIO -> SoC 路径。你需要理解裸机 C 如何通过 MMIO 访问硬件。任务
uart_puthex32(unsigned int value),功能参照名称。perf_read_cycle()和perf_read_instret()。main.c中打印 LED 值、cycle、instret,例如:LED=0x00000005。printf,不引入 libc。.c文件加入 firmware 构建。建议文件:
需要理解
自我评判
交付物