一个好的代码架构直接影响项目的质量,今天为大家分享的是一个管理功能模块和外设驱动的框架:BabyOS.

BabyOS是什么?

BabyOS适用于MCU项目,它是一套管理功能模块和外设驱动的框架

对项目而言,缩短开发周期。项目开发时选择适用的功能模块及驱动。直接进入功能代码编写的阶段。

对工程师而言,减少重复工作。调试过的功能模块和驱动代码放入BabyOS中进行管理,以后项目可以直接使用,去掉重复调试的工作。

适用项目

使用裸机开发的项目推荐基于BabyOS进行。

前世今生

说一说编写BabyOS原由

................

目前使用MCU裸机开发的项目不会很庞大,大多有两个要求:开发时间和产品功耗。99.874%产品是电池供电,功耗是重点考虑对象。工程师开发的多个项目之间总会碰到相同的功能点,那么是否可以有套代码框架可以容纳已经做过的功能点,去掉重复的工作,加快产品或者demo的开发。

功耗的考量

出于功耗考虑,对外设的操作是:唤醒外设,操作,最后进入休眠。这样的操作形式和文件的操作很类似,文件的操作步骤是打开到编辑到关闭。

因此将外设的操作看作是对文件的操作进行。每个外设打开后返回一个描述符,后续代码中对外设的操作都是基于这个描述符进行。关闭外设后回收描述符。

所以外设的驱动中打开和关闭的操作执行对设备的唤醒和睡眠。利用描述符来操作外设还有一个好处是,当更换外设后,只需更换驱动接口,业务部分的代码不需要变动

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:嵌入式物联网学习资料(头条)

系统内部控制框架(分享一个管理功能模块和外设驱动的框架)(1)

系统内部控制框架(分享一个管理功能模块和外设驱动的框架)(2)

快速开发

小型项目的开发中,有较多使用率高的功能模块,例如:UTC、错误管理、电池电量、存储数据、上位机通信、固件升级等等。将这些功能都做成不依赖于硬件的模块交给BabyOS管理。将调试好的外设驱动也交给BabyOS管理。再次启动项目时,通过配置文件,选择当前项目使用的功能模块。以搭积木的方式缩短开发时间。

系统内部控制框架(分享一个管理功能模块和外设驱动的框架)(3)

使用方法

1.添加文件

bos/core/src 核心文件及功能模块全部添加至工程

bos/driver/src 选择需要的驱动添加至工程

bos/hal/ 添加至工程,根据具体平台进行修改

2.选择功能模块

对于b_config.h进行配置,根据自己的需要选择功能模块。

3.列出需要使用的设备

找到b_device_list.h,在里面添加使用的外设。例如当前项目只需要使用flash和模拟串口,那么添加如下代码:

// 设备 驱动接口 描述 B_DEVICE_REG(W25QXX, bW25X_Driver, "flash") B_DEVICE_REG(SUART, SUART_Driver, "suart")

4.使用范例

#include "b_os.h" //头文件 //b_config.h配置文件中使能KV存储 int main() { uint8_t buf[128]; //...... bInit(); //初始化,外设的初始化会在此处调用 //下面举例使用:W25QXX和KV存储功能模块,其中W25QXX已经添加到b_device_list.h if(0 == bKV_Init(W25QXX, 0xA000, 4096 * 4, 4096)) //初始化KV存储,指定存储设备W25QXX { b_log("bKV_Init ok...\r\n"); } //存储键值对(可用于存储系统配置信息) b_log("save ip, name\r\n"); bKV_Set((uint8_t *)"ip", (uint8_t *)"192.168.1.155", sizeof("192.168.1.155")); bKV_Set((uint8_t *)"name", (uint8_t *)"BabyOS", sizeof("BabyOS")); //获取值 b_log("read ip, name...\r\n"); bKV_Get((uint8_t *)"ip", buf); b_log("ip: %s\r\n", buf); bKV_Get((uint8_t *)"name", buf); b_log("name %s\r\n", buf); //修改键值对的值 b_log("change name...\r\n"); bKV_Set((uint8_t *)"name", (uint8_t *)"abcde", sizeof("abcde")); //重新获取值 bKV_Get((uint8_t *)"name", buf); b_log("new name: %s\r\n", buf); //...... while(1) { //..... bExec(); //循环调用此函数 //..... } }

举例使用W25QXX读取数据,从0地址读取128个字节数据至buf:

{ int fd = -1; fd = bOpen(W25QXX, BCORE_FLAG_RW); if(fd == -1) { return; } bLseek(fd, 0); bRead(fd, buf, 128); bClose(fd); }

原文链接:https://mp.weixin.qq.com/s/3yeVTiNWkLj1yevq3lSb9Q

转载自:嵌入式大杂烩

原文链接:分享一个管理功能模块和外设驱动的框架

本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

,