沁恒的 CH32V 系列是 RISC-V 内核,用 C 语言开发时有几个和 ARM 不太一样的地方:
1. 中断服务函数要用工具链规定的属性声明,函数名与启动文件中的向量表符号对应;漏写属性时编译能通过,但不会正确保护现场。
2. RISC-V 的中断控制器通过 CSR 配置,使能中断的读-改-写要用带原子语义的指令,避免与正在发生的中断竞争。
3. 内联汇编里访问 CSR 时,汇编模板中的寄存器约束要和 C 变量类型匹配,否则会出现高位被截断的隐蔽问题。
4. 全局中断的开与关建议用单条 CSR 指令完成,比先读再写更安全。
5. RISC-V 的调用约定与 ARM 不同,跨平台移植汇编代码时要重新检查参数寄存器和压栈顺序。
以上,供参考。 |