sunsili 发表于 2023-8-3 13:47:11

51单片机上用BabyOS

本帖最后由 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仿真图,便可以开始了....
[*]为了先编译成功并在仿真软件上跑起来,开始大删减,仅保留了core、drivers和hal目录的关键文件。

[*]找到使用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灯闪烁间隔1SB_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项目开发提速的代码框架
页: [1]
查看完整版本: 51单片机上用BabyOS