上个月把一台量产逆变器的控制板从瑞萨 RX24T 挪到了 RX26T,业务逻辑一行没动,全是底层功夫。复盘一下,给同样要跨内核移植的朋友省点时间。
移植前先画"差异地图"
不要上来就改代码。我先把三份手册摆在桌上:RX24T 用户手册、RX26T 用户手册、还有官方的差异说明(R01AN6502),逐项过一遍外设清单,标出三类:照搬 / 改寄存器 / 重新设计。时钟树是重灾区——24T 与 26T 的 PLL 倍频路径不同,我们锁 80MHz 主频的前提下,PCLKA-D 与 FCLK 的分频全要重排。
中断向量与启动文件
RX 系列的向量表是链接段问题的高发地。 old 工程里有依赖数组段摆放的代码,在新工程里直接换成了显式函数指针表,避免链接器把段合并顺序改了之后中断跳错门。
/* 显式向量注册,替代依赖段顺序的写法 */
void *const g_vectors[] = {
(void *)stack_top,
PowerON_Reset_PC, /* reset */
(void *)0, /* reserved */
isr_mtu0_underflow, /* SPWM 载波 */
};时钟与外设时钟门控
26T 外设多了独立的门控位,初始化顺序错了会读回全 0。我们的经验是外设初始化函数第一行先开时钟门控,最后一行再自检一遍寄存器复位值,不符合预期直接停在断言里。
踩过的坑
- 浮点:26T 带 FPU,但启动文件没开 FPCCR 时,硬浮点指令直接进 Fault;
- 位带操作别名区两代地址不同,宏别照抄;
- 编译器从 V2 升到 V3 后,
const常量默认进 CDcmp 段,老链接脚本要补段定义。
总结:移植不是"改寄存器",是把依赖芯片的假设全部显式化。地图画得越细,后面返工越少。