拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FPGA SoC 的 RISC-V 固件开发全攻略(一):PH1P35 开发避坑指南

FPGA SoC 的 RISC-V 固件开发全攻略一PH1P35 开发避坑指南本文是《FPGA SoC 的 RISC-V 固件开发全攻略》专栏第 1 篇。下一篇第 2 篇《开发环境搭建与工具链避坑》本文面向准备在 PH1P35国产 FPGA SoC内嵌 RISC-V 硬核上开发固件的工程师梳理开发前必须了解的硬件能力边界与常见踩坑点。内容基于芯片公开规格与通用嵌入式开发经验不涉及任何具体产品实现。一、先认清硬件能力边界PH1P35 的 MCU 侧是一颗RISC-V 32 位内核RV32IMAF含单精度 FPU 与位操作扩展与外设通过片上总线直连。开发前先把有什么、没什么搞清楚能避开一大半的返工。1.1 硬核外设清单外设说明USART ×2串口常用调试/升级通道I2C ×1传感器等低速外设QSPI ×2含 QSPI-XIP代码就地执行 普通 QSPIFlash 读写UDMADMA 控制器LGPIO通用 GPIOAHB / APB片上总线直连 FPGA 逻辑fabric的寄存器映射IOMUX引脚复用1.2 有三个没有务必提前规划这是 PH1P35 最容易被忽略的硬件边界缺失项影响替代方案硬件 CRC不能靠外设算校验软件查表实现注意多项式/初值/结果异或须与对端一致加密引擎AES/SHA/TRNG无法做固件加密、安全启动、防篡改校验只能防传输错误防不了恶意篡改安全需求需在 FPGA 侧或外部解决硬件看门狗 WDT没有独立看门狗硬核用内核定时器做软件看门狗或在 FPGA 侧搭计数器 总线寄存器喂狗结论CRC、看门狗、安全启动这三件事都要软件造轮子或挪到 FPGA 侧不能想当然地假设芯片自带。1.3 有的能力FPU单精度浮点硬件指令集 RV32IMAF。mtime/mtimecmpRISC-V 内核机器定时器可做软件超时、临时看门狗。I-Cache / D-Cache内核带指令/数据缓存部分运行模式下启动即使能。二、避坑一Cache 与外设/共享内存的一致性最隐蔽这是 PH1P35 上最容易埋雷、又最难排查的问题。2.1 D-Cache 使能后MMIO 区必须 non-cacheable内核启用 D-Cache 后通过 AHB/APB 总线访问的外设寄存器映射区MMIO其缓存属性必须明确为non-cacheable。现象如果 MMIO 区默认被当成 cacheable读写外设寄存器时CPU 可能命中缓存中的旧值导致读到的外设状态不更新、写出去的配置不生效——表现为寄存器操作时灵时不灵极难定位。建议开发早期就确认 MMIO 区外设寄存器地址段的默认缓存属性若默认 cacheable需用芯片提供的 memory attribute 配置接口把它显式设为 non-cacheable。2.2 FPGA 写内存 MCU 读的共享数据一致性PH1P35 的 FPGA 逻辑fabric可以通过片上总线直接访问 DDR。当FPGA 写 DDR、MCU 同时读时典型如视频帧缓存、高速数据缓冲D-Cache 会让 MCU 拿到陈旧数据。建议对 FPGA 与 MCU 共享的内存区优先配置为non-cacheable若必须 cacheable则要在读取前做cache invalidate失效数据缓存写入后做cache flush刷写回内存并遵循芯片提供的维护 API 的调用时机。这一条在MCU FPGA 共享内存的架构里几乎必然会踩到务必在驱动合入前就把一致性方案定下来。三、避坑二中断控制器 ECLIC 与标准 RISC-V 不同PH1P35 用的是 Nuclei 核特有的ECLIC增强型核心本地中断控制器不是标准 RISC-V 的 CLINT/PLIC。向量表机制ECLIC 用独立的向量表基址寄存器而非标准 MTVEC 低两位的模式位来区分向量/非向量模式中断向量表里可以直接放指令。中断分发非向量模式下所有中断先进入统一入口再由软件查询 pending 寄存器找出最高优先级中断号查表分发到具体 ISR。注意点如果是从标准 RISC-V 或 ARMNVIC迁移中断初始化代码需要按 ECLIC 的寄存器模型重写不能照搬向量 vs 非向量模式的中断延迟有差异对实时性敏感的应用如高频中断要提前评估中断优先级、嵌套、与 RTOS 的集成方式需参考 ECLIC 的专用文档而非通用 RISC-V 资料。四、避坑三启动流程与运行模式PH1P35 的启动不是跳进 main 就完事中间有几步关键初始化理解它能少踩很多坑。4.1 两种运行模式模式代码位置说明XIP直接在 Flash 上就地执行启动快但 Flash 带宽有限DDR 运行启动时把代码从 Flash 拷贝到 DDR 再执行性能好需先完成拷贝4.2 启动汇编的典型步骤关闭全局中断、关闭 Cache启动阶段线性执行Cache 反而引入不确定性搬运并执行时钟配置代码配置 QSPI 分频、AHB 分频、锁相环DPLL——DPLL 锁定是同步阻塞等待必须完成才能继续初始化全局指针 GP、线程指针 TP、栈指针 SP配置 ECLIC 中断控制器向量表基址、异常入口使能 FPU设置浮点状态位、清浮点 CSR搬运.data段、清零.bss段进入 C 运行时调用芯片初始化 → 板级初始化 → 组件初始化 →main()。4.3 两个易忽视的细节复位向量处放的是指令而不是地址向量表第 0 项存放的是一条跳转指令call _start本身而非函数指针。这与 ARM Cortex-M 的首字节放初始 SP、次字节放复位向量地址完全不同。异常入口会切换启动早期用一个极简异常入口死循环等待C 初始化完成后才切换到完整异常处理入口保存上下文 分发。若在初始化早期就触发异常容易卡在死循环。五、避坑四Flash 擦写期间中断被长时间关闭在 XIP 运行模式下擦写 Flash 前往往需要退出 XIP 并关闭全局中断擦写完成后再恢复。后果SPI NOR Flash 的扇区擦除耗时几十到上百毫秒整块擦除更久。若在擦写期间全局中断被关闭会导致串口/网络等通信通道因长时间得不到服务而丢数据、甚至对端超时断链实时任务如传感器轮询停摆。建议若代码已搬移到 DDR 执行确认擦写 Flash 是否仍必须关全局中断或是否有只暂停取指、不关中断的机制优先把擦写操作拆成小块缩短单次关中断时间评估后台擦写DMA 中断方案避免阻塞主流程。六、避坑五内存资源紧张需提前规划PH1P35 内核自带很小的本地内存ILM 指令本地内存 DLM 数据本地内存典型各几十 KB大块代码和数据要放到外部 DDR。问题中断频繁的热代码、中断向量放 DDR 会有访问延迟影响实时性栈、全局变量是放本地内存还是 DDR容量是否够需提前算清。建议确认本地内存容量与链接脚本支持把热代码/关键数据放到本地内存核对 DDR 实际可用的地址空间大小链接脚本里配置的未必是硬件全量评估 DDR 访问延迟对中断响应的影响必要时调整关键代码位置。七、避坑六跳转 APP 的复位序列Bootloader 跳转应用固件前必须做完整的上下文清理否则应用可能因残留状态异常。典型序列RISC-Vvoidjump_to_app(uint32_tapp_entry){disable_irq();/* 1. 关全局中断 */flush_dcache();/* 2. 刷写数据缓存 */invalidate_icache();/* 3. 失效指令缓存 */fence();/* 4. 内存屏障确保缓存/流水线一致 */((void(*)(void))app_entry)();/* 5. 跳转应用复位入口不再返回 */}关键点跳转目标是应用的复位入口reset entry不是main()——应用的启动代码会重新走完整初始化设栈、配中断、搬运段Bootloader 无需手动设栈或搬运镜像跳转前必须清理 I/D Cache残留的缓存数据会让应用看到旧代码/旧数据这与 ARM Cortex-M 的跳转方式手动设 MSP 跳复位向量不同不能照搬。八、避坑七FPU 上下文RTOS 移植注意PH1P35 带单精度 FPU在移植 RTOS 时任务切换必须正确处理 FPU 上下文。问题任务切换时若不同步保存/恢复浮点寄存器f0-f31 及浮点状态寄存器使用浮点的任务间会互相污染数据。RISC-V 的惰性保存优化通过检查mstatus.FS浮点状态位判断任务是否真的用过 FPU没用过则跳过 30 多个浮点寄存器的保存降低上下文切换开销。建议确认所选 RTOS 是否自动处理 FPU 上下文以及是否支持惰性保存中断服务程序里若使用浮点也要纳入上下文保存范围。九、开发前检查清单把上面的坑浓缩成一张清单开发前逐项确认CRC确认软件查表实现多项式/初值/结果异或与对端一致看门狗软件定时器或 FPGA 侧方案已定且有可靠的喂狗路径安全确认是否接受无加密、无安全启动的能力边界CacheMMIO 区已设为 non-cacheableFPGA 共享内存一致性方案已定中断按 ECLIC 模型初始化向量/非向量模式已选型启动运行模式XIP/DDR、时钟配置、段搬运已理解并验证Flash擦写期间的中断影响已评估通信超时已规避内存本地内存/DDR 的代码、数据、栈布局已规划跳转APP 复位序列含缓存清理RTOSFPU 上下文保存/恢复已确认十、总结PH1P35 作为 FPGA SoC其 MCU 侧开发最大的特点是“硬件边界清晰但能力有取舍”好处是外设通过片上总线直连 FPGA 逻辑带宽和灵活性高代价是没有硬件 CRC/加密/看门狗且 Cache、ECLIC、启动流程都有其特殊性。开发前把这几个能力边界和坑点摸清楚尤其是Cache 一致性和无硬件看门狗这两条能显著降低后期的调试成本。本文仅介绍 PH1P35 芯片的公开硬件特性与通用嵌入式开发经验不涉及任何具体产品或项目的私有实现。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门