好记性不如烂笔头,记录点滴移植经历,一方面便于总结提炼,二是分享,让别人少走有些弯路,自己以后踩坑了也爬的利索点。
首先梳理一下移植框架,FreeRTOS还是非常简单的, 体量上要比RT-Thread,Nuttx等偏重型的系统轻量不少,这可能也是FreeRTOS一般不会用在偏重型方案上的一个因素吧,毕竟仅仅一个调度器,支持的组件和框架较少,所以FreeRTOS比较多的用在如工业控制,智能小家电等功能单一的应用场合。
FreeRTOS V10.4.3的移植
整体的移植框架如下:
下面说下具体的移植步骤:
0.起动设计
- 搭建构建环境,准备利用melis上已经建好的环境,借”鸡“生”蛋".目标是移植FreeRTOS 系统,所以这部分不重点记录,总之,环境已建好。
- 用不用sbi? SBI主要为runtime提供M模式下的支持。暂时先用,后续优化掉,因为与Melis相比,FreeRTOS构建的系统相对简单很多,不用支持MMU,整个FreeRTOS系统加上应用都可以运行在M模式,sbi也就失去的存在的必要,但是还是决定先保留着,移植完成后再优化掉。主要考虑三点,1.环境和sbi之间有依赖,包括链接脚本,一些汇编等等,不想这个时候动它,2.SBI本身提供了一些vendor的扩展接口,这些东西暂时还不确定将来会不会用到,如果省去,万一需要还得以某种形式加回来,麻烦。所以暂时先用SBI启动,后续逐渐做减法。3.利用sbi中已经封装好的串口驱动,最小系统启动。用SBI启动,需要都SBI固件做一些小小的修改,改动如下:
-
diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S index afbcec0..79b3de8 100644 --- a/firmware/fw_jump.S +++ b/firmware/fw_jump.S @@ -84,7 +84,7 @@ fw_next_addr: * The next address should be returned in 'a0' */ fw_next_mode: - li a0, PRV_S + li a0, PRV_M ret
修改fw_next_addr 的实现,使用返回的next状态为PRV_M,也就是下阶段是M-Mode,非Linux and Melis运行的S-Mode.,验证如下:0x40010600是OS _star地址,可以正确从SBI跳出,进入这个地址,表示可以进行接下来的CPU引导了.
-
下图代表当前处理器功能组件的打开状态,可以
-