当前位置:网站首页>分享一个适用于MCU项目的代码框架
分享一个适用于MCU项目的代码框架
2022-08-01 19:20:00 【李肖遥】
关注、星标公众号,直达精彩内容
来源:https://github.com/notrynohigh/BabyOS
一个好的代码架构直接影响项目的质量,今天为大家分享的是一个管理功能模块和外设驱动的框架:BabyOS.
BabyOS是什么?
BabyOS适用于MCU项目,它是一套管理功能模块和外设驱动的框架。
对项目而言,缩短开发周期。项目开发时选择适用的功能模块及驱动。直接进入功能代码编写的阶段。
对工程师而言,减少重复工作。调试过的功能模块和驱动代码放入BabyOS中进行管理,以后项目可以直接使用,去掉重复调试的工作。
适用项目
使用裸机开发的项目推荐基于BabyOS进行。
前世今生
说一说编写BabyOS原由
................
目前使用MCU裸机开发的项目不会很庞大,大多有两个要求:开发时间和产品功耗。99.874%产品是电池供电,功耗是重点考虑对象。工程师开发的多个项目之间总会碰到相同的功能点,那么是否可以有套代码框架可以容纳已经做过的功能点,去掉重复的工作,加快产品或者demo的开发。
功耗的考量
出于功耗考虑,对外设的操作是:唤醒外设,操作,最后进入休眠。这样的操作形式和文件的操作很类似,文件的操作步骤是打开到编辑到关闭。
因此将外设的操作看作是对文件的操作进行。每个外设打开后返回一个描述符,后续代码中对外设的操作都是基于这个描述符进行。关闭外设后回收描述符。
所以外设的驱动中打开和关闭的操作执行对设备的唤醒和睡眠。利用描述符来操作外设还有一个好处是,当更换外设后,只需更换驱动接口,业务部分的代码不需要变动
快速开发
小型项目的开发中,有较多使用率高的功能模块,例如:UTC、错误管理、电池电量、存储数据、上位机通信、固件升级等等。将这些功能都做成不依赖于硬件的模块交给BabyOS管理。将调试好的外设驱动也交给BabyOS管理。再次启动项目时,通过配置文件,选择当前项目使用的功能模块。以搭积木的方式缩短开发时间。
使用方法
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://gitee.com/notrynohigh/BabyOS/wikis
https://github.com/notrynohigh/BabyOS/wiki
Baby如何成长
之所以称之为BabyOS,从上面的介绍可以看出,她如果能在项目中发挥大的作用就需要有足够的功能模块以及驱动代码。
希望借助广大网友的力量,一起“喂养”她,是她成为MCU裸机开发中不可缺少的一部分。
码云:
https://gitee.com/notrynohigh/BabyOS
github:
https://github.com/notrynohigh/BabyOS
友情项目
BabyOS包含了第三方开源代码,这部分代码都是MCU项目中比较实用的。
b_shell 功能模块基于开源项目nr_micro_shell:
https://gitee.com/nrush/nr_micro_shell
(感谢作者Nrush)
b_button 功能模块基于开源项目FlexibleButton:
https://github.com/murphyzhao/FlexibleButton
(感谢作者Murphy)
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
边栏推荐
- 【综述专栏】IJCAI 2022 | 图结构学习最新综述:研究进展与未来展望
- MySQL开发技巧——并发控制
- ssh & scp
- MySQL中超键、主键及候选键的区别是什么
- Write code anytime, anywhere -- deploy your own cloud development environment based on Code-server
- [Server data recovery] Data recovery case of offline multiple disks in mdisk group of server Raid5 array
- 有点奇怪!访问目的网址,主机能容器却不行
- 重保特辑|拦截99%恶意流量,揭秘WAF攻防演练最佳实践
- Win11怎么安装语音包?Win11语音包安装教程
- 力扣刷题之合并两个有序数组
猜你喜欢
#yyds dry goods inventory# Interview must brush TOP101: the last k nodes in the linked list
MySQL开发技巧——并发控制
文库网站建设源码分享
odoo 编码规范(编程规范、编码指南)
MySQL开发技巧——存储过程
MySQL你到底都加了什么锁?
From ordinary advanced to excellent test/development programmer, all the way through
经验共享|在线文档协作:企业文档处理的最佳选择
Website construction process
No need to crack, install Visual Studio 2013 Community Edition on the official website
随机推荐
MySQL数据库————流程控制
[Kapok] #Summer Challenge# Hongmeng mini game project - Sudoku (3)
What are the application advantages of SaaS management system?How to efficiently improve the digital and intelligent development level of food manufacturing industry?
A simple Flask PIN
SaaS管理系统的应用优势在哪里?如何高效提升食品制造业数智化发展水平?
[National Programming] "Software Programming - Lecture Video" [Zero Basic Introduction to Practical Application]
Heavy cover special | intercept 99% malicious traffic, reveal WAF offensive and defensive drills best practices
cf:D. Magical Array【数学直觉 + 前缀和的和】
突破边界,华为存储的破壁之旅
Library website construction source code sharing
【综述专栏】IJCAI 2022 | 图结构学习最新综述:研究进展与未来展望
【服务器数据恢复】服务器Raid5阵列mdisk组中多块磁盘离线的数据恢复案例
面试必问的HashCode技术内幕
在全志V853开发板试编译QT测试
Combining two ordered arrays
Find the sum of two numbers
数值矩阵的图形表示
金鱼哥RHCA回忆录:CL210管理OPENSTACK网络--网络配置选项
数据库系统原理与应用教程(070)—— MySQL 练习题:操作题 101-109(十四):查询条件练习
shell脚本专题(07):文件由cfs到bos