说起RTOS移植,我们首先会想到32位单片机。
那么51单片机可以移植RTOS吗?
我的答案是,只要资源够用(ROM空间、RAM空间),可以移植。
前提是你对RTOS的实现原理非常清楚,并且可以自己完成移植工作。
不过,51单片机移植RTOS,已经有牛人做过这个工作,这位大佬移植的是 FreeRTOS操作系统。
今天主要分享一下这个项目(复制,在浏览器打开),如果有兴趣,可以参考学习一下。
https://gitee.com/open-ell/freertos.git
该作者将FreeRTOS移植到了STC32G系列单片机上。项目工程目录如下图
支持MCS-251(STC32G系列)的FreeRTOS。
使用说明
目前移植的 FreeRTOS 版本支持 STC32G 的 larg-ROM 和 huge-ROM 两个版本
切换larg-ROM的配置方法:
FreeRTOSConfig.h 里面配置configUSE_ROMHUGE 为 0
点击Keil工程配置按钮【Options for Target】
点击【Target】-> 【Code Rom Size】-> Larg模式
点击【Target】-> 【C251】 -> 【Define】 输入 configSUPPORT_MCS251
点击【Target】-> 【C251】 -> 【Level】 选择4级
点击【Target】-> 【C251】 勾选 Link Code
点击【Target】-> 【C251】 勾选 Generate reentrant
切换Huge-ROM的配置方式:
FreeRTOSConfig.h 里面配置configUSE_ROMHUGE 为 1
点击Keil工程配置按钮【Options for Target】
点击【Target】-> 【Code Rom Size】-> Huge模式
点击【Target】-> 【Exeternal Memory】-> 【ROM】 起始地址:0xFE2000 大小:0x1E000
点击【Target】-> 【C251】 -> 【Define】 输入 configSUPPORT_MCS251
点击【Target】-> 【C251】 -> 【Level】 选择4级
点击【Target】-> 【C251】 勾选 Link Code
点击【Target】-> 【C251】 勾选 Generate reentrant
port.c 为移植接口,注释用英文撰写,为了保持字体编码兼容。
为了方便阅读和学习,以C语言编写为主,但这不是最优方案,还可以使用汇编进行优化。
当前方案,在35M速度下:任务切换速度耗时在10us左右,使用汇编优化,可以到5~8us左右。
默认系统时钟24M,可以根据需要,自己调整。
如果要启动软件仿真,需要进行如下操作:
点击Keil工程配置按钮【Options for Target】-> 【Target】-> 【C251】 -> 【Define】 输入 SOFT_DEBUG (注意不要删除configSUPPORT_MCS251)
开启软件仿真以后,不能在真实硬件上跑。