本帖最后由 sunsili 于 2023-8-3 14:05 编辑
51单片机上用BabyOS
概述
专为MCU项目开发提速的代码框架BabyOS适用于MCU项目,
她是一套管理功能模块和外设驱动的框架。
对项目而言,缩短开发周期。项目开发时选择适用的功能模块及驱动。直接进入功能代码编写的阶段。 对工程师而言,减少重复工作。调试过的功能模块和驱动代码放入BabyOS中管理,以后项目可以直接使用,去掉重复调试的工作。
特性
- 以搭积木的方式节省开发时间
- 以友好的框架收集软件CBB模块
- 以开源共享的理念同各位爱好者一起成长
系统框架
代码目录
bos/algorithm 收集常用算法
bos/core 核心文件
bos/drivers 收集外设的驱动文件
bos/hal 硬件抽象层
bos/mcu 收集各型号MCU的底层代码
bos/modules 收集常用的软件CBB模块
bos/thirdparty 收集第三方开源代码
bos/utils 支撑其他模块的开发
bos/_config 全局配置文件
b_device_list.h 设备注册文件
b_hal_if.h 驱动接口文件
移植到51单片机
BabyOS开发者群里,有伙伴提出BabyOS能否在51单片机上跑。(⊙o⊙)…目前BabyOS使用的编程技巧需要C99支持,如果用C51编译器,资源和语法都会有很多问题。因此如果在51单片机上试,改动量还是挺大的。不管怎么样,还是先试试。安装开发环境后找来一张N年前的proteus仿真图,便可以开始了.... 找到使用C库和浮点的语句,使用常规语句进行替换。减少资源的消耗。 去掉b_log,因为51单片机上打印过于消耗资源。 找到形参数量多的接口,将形参数量改为1个指针。否则编译时会提示错误。 将能调整为uint8_t和uint16_t的变量进行都调整,以节省空间。 取消段的使用,设备注册的方式保持不变,但初始化方式变为手动加载(提供了加载接口)。 减少代码调用的深度,去掉句柄, 改为直接操作设备号。 对各项功能进行删减,仅保留必要的接口。b_task原先内容全部由宏代替。 .........
经过一顿折腾,终于编译过了。设备驱动无法复用,所以操作设备的统一接口没法使用。先直接操作IO,做一个灯闪烁的实验: 启动一个50ms的定时器作为心跳 - static uint16_t u16TimerCfg = 0;
- void vTimer0Init(uint8_t xms)
- {
- if (xms > (65536 * 12 / SYS_CLK / 1000))
- {
- xms = 65536 * 12 / SYS_CLK / 1000;
- }
-
- TMOD = 0X01;
- u16TimerCfg = 65536 - (xms * 1000 * SYS_CLK / 12);
- TH0 = (u16TimerCfg >> 8) & 0XFF;
- TL0 = u16TimerCfg & 0XFF;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- void vTimer0Handler() interrupt 1
- {
- TH0 = (u16TimerCfg >> 8) & 0XFF;
- TL0 = u16TimerCfg & 0XFF;
-
- bHalIncSysTick(); //调用tick自增
- }
复制代码
LED灯闪烁间隔1S - B_TASK_CREATE_ATTR(task_attr);
- uint8_t stat = 0;
- PT_THREAD(task_handler)(struct pt *pt)
- {
- PT_BEGIN(pt);
- while(1)
- {
- stat = (stat == 0) ? 0xff : 0;
- P1 = stat;
- bTaskDelayMs(pt, 1000);
- }
- PT_END(pt);
- }
- void main()
- {
- vTimer0Init(50);
- bInit();
- bTaskCreate(&task_attr, task_handler);
- while (1)
- {
- bExec();
- bTaskRun(&task_attr);
- }
- }
复制代码
实验现象是正常的,51单片机上运行的基础代码有了,接下来就慢慢扩展完善,整一套适合C51的代码。 目前BabyOS的代码是 bos_c51分支。 实验例子的代码:BabyOS_C51_Template 改完之后唯一的感受就是,以前在51单片机上开发没觉得资源是大问题,现在各种捉襟见肘...... 有兴趣开发51单片机的开发者,可以基于以上仓库提交代码。
再提一个主分支的改动吧:b_util_uart 废弃,其功能融入 b_hal_uart
其功能主要是对串口接收的数据进行空闲检测并调用回调。这次将其移入b_hal_uart主要是为了控制往bos投喂串口数据的通道,将以下接口作为唯一入口。 int bHalItInvoke(bHalItNumber_t it, uint8_t index, bHalItParam_t *param);
代码下载:bean/BabyOS_Example - 码云 - 开源中国 (gitee.com)
官方地址:BabyOS:专为MCU项目开发提速的代码框架 |