谷动谷力

 找回密码
 立即注册
查看: 947|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机上用BabyOS

[复制链接]
跳转到指定楼层
楼主
发表于 2023-8-3 13:47:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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的定时器作为心跳
  1. static uint16_t u16TimerCfg = 0;
  2. void vTimer0Init(uint8_t xms)
  3. {
  4.   if (xms > (65536 * 12 / SYS_CLK / 1000))
  5.   {
  6.     xms = 65536 * 12 / SYS_CLK / 1000;
  7.   }
  8.   
  9.   TMOD = 0X01;
  10.   u16TimerCfg = 65536 - (xms * 1000 * SYS_CLK / 12);
  11.   TH0 = (u16TimerCfg >> 8) & 0XFF;
  12.   TL0 = u16TimerCfg & 0XFF;
  13.   ET0 = 1;
  14.   EA = 1;  
  15.   TR0 = 1;
  16. }


  17. void vTimer0Handler() interrupt 1
  18. {
  19.   TH0 = (u16TimerCfg >> 8) & 0XFF;
  20.   TL0 = u16TimerCfg & 0XFF;
  21.   
  22.   bHalIncSysTick();   //调用tick自增
  23. }
复制代码


LED灯闪烁间隔1S
  1. B_TASK_CREATE_ATTR(task_attr);
  2. uint8_t stat = 0;

  3. PT_THREAD(task_handler)(struct pt *pt)
  4. {
  5.   PT_BEGIN(pt);
  6.   while(1)
  7.   {
  8.     stat = (stat == 0) ? 0xff : 0;
  9.     P1 = stat;
  10.     bTaskDelayMs(pt, 1000);
  11.   }
  12.   PT_END(pt);
  13. }

  14. void main()
  15. {
  16.   vTimer0Init(50);
  17.   bInit();
  18.   bTaskCreate(&task_attr, task_handler);
  19.   while (1)
  20.   {
  21.     bExec();
  22.     bTaskRun(&task_attr);
  23.   }
  24. }
复制代码

实验现象是正常的,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项目开发提速的代码框架
+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-11-24 16:22 , Processed in 0.241596 second(s), 44 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表