一、需求分析
当前项目状态较多,总线指令也持续较多,bug定位不是难事,难在主动发现bug,且原模块之间关联性较复杂,排查和改动都比较麻烦。所以决定在RTOS上重构代码。
RTOS方案选择有uCOS, Keil RTX, Free RTOS, RT-Thread。
二、方案选择
uCOS有稳定的主要优势,Keil RTX有开发上手简单顺畅的优势,Free RTOS是相对于uCOS有商业免费的优势,RT-Thread有完全开源免费,中文文档,更新支持活跃,以及组件丰富的优势。仅就目前需求来看,Keil RTX是最佳的选择,时间不多,它可以在最短时间内用起来,难度也最低,但是考虑到异常时方便排查,后续融合功能平台需求,也因为前期主要了解的是它,同时也看重其组件丰富,更新速度可观,先以RT-Thread作为初步方案。
选用RT-Thread的劣势不可忽视,现有MCU为F103C8,ROM大小是第一个难点。其可靠Flash为64k,最多可用128k。现有项目已划分16k(BootLoader)+4k(Config),则Application只有44k可靠容量,最多108k。原有APP工程大小为20k,所以首先要尝试将rtt kernel + shell的大小控制在20k以内,接下来是IAP功能和软复位(boot与app互相跳转而保持io状态)的移植。
三、过程
计划步骤:
1.kernel + shell ROM大小控制在20k以内;
2.iap+软复位功能实现;
3.功能移植;
4.稳定性评估;
5.平台与业务功能分离:通用基础框架,编译成库便于独立维护以及作为通用工程模板;
6.平台独立维护:细化为3个方向版本,体积小,适中,功能全;
1.方案初试
使用Keil Pack ,rtt 3.1.1,kernel + shell,额外增加串口驱动。
a. 实现console输出接口可在最小体积下实现调试信息输出,但还无法完成 rtt 强大的msh terminal.
void rt_hw_console_output(const char *str);
b. 实现串口驱动接口,注册驱动
uart_ops =
{
uart.init,
uart.open,
uart.close,
uart.read,
uart.write,
uart.control, //非必须
uart.user_date; //非必须
};
register:
INIT_BOARD_EXPORT(rt_hw_usart_init); //板级初始化
(other options)
INIT_PREV_EXPORT(comp_soft_init_fun); //纯参数、软件一类的初始化
INIT_DEVICE_EXPORT(dev_init_fun); //设备初始化
INIT_COMPONENT_EXPORT(comp_init_fun); //组件初始化
INIT_ENV_EXPORT(env_init_fun); //环境初始化
INIT_APP_EXPORT(app_init_fun); //应用初始化
c. 测试msh功能。
四、结果
五、总结