博客链接:https://hanbaoaaa.xyz/id/1450
从问题出发
- 单片机种类繁杂,库也各不相同
- 无意义的学习成本:每学习一个ide可能就要花费大量时间来熟悉操作,快捷键
- 脱离开版本管理的代码,无法对学习有一个实质性的记录,代码的复用基于文件拷贝,相当低效
- 宏定义等配置性内容过度耦合在代码中,降低了复用性
=》一种解决思路:构建通用库,使用更现代的vscode进行代码编写
市面上最火的就是arduino,还有国内的rtthread在包环境管理方面都是做的不错的
比较推荐都去了解一下
=》但是有一个新的问题:
对于比赛,此类框架都很大型,不适宜自己进行不同平台的适配
=》整个协会,几个人之间,团队内,或者个人,构建自己的通用库
(推荐多人,个人有些浪费时间
大致思路:
-
关于通用库
- 基本代码部分分为
- 适配层
- 平台(mcu种类),
- 对应mcu的内置功能(延时,串口,adc,iic,spi…
- 外设层
- 显示
- 屏幕
- 图形库
- 传感器
- 各类传感器
- 显示
- 算法
- 信号处理算法
- 控制算法
- 适配层
- 开发的时候。我们调用都使用共同的api,这样在遇到新的平台要求时候,直接进行适配层的编写即可
- 基本代码部分分为
-
引入版本管理
进行模块化git管理,git的submodule功能为我们提供了项目的组合功能,这样便可以将每一个模块作为子仓库引入到项目中。但是submodule也存在一个缺点,不太容易管理,所以我专门在vscode上开发了一个插件
这个插件可以直接让你自己设计自己的项目子模块结构,并且根据需要进行加载,只要修改used标签,也可以对仓库进行重命名。
然后一键进行子模块仓库的加载
-
解决宏定义耦合在代码中问题
-
这个问题需要外部脚本的帮助,因为宏是一种死代码,像cmake这种管理工具就会提供这样的功能,各类ide也会提供,但是宏多起来之后就会混乱,所以我设计了一种层次化描述宏的插件,
大概的思路是在每一个库(模块)目录下创建一个描述文件(该文件名可以预先配置 下面我配置的是describe.txt
在describe.txt中写上
然后可以通过插件遍历整个项目结构中相关宏 以及 目标生成的头文件
header=目标头文件
宏定义名称|宏定义默认值
然后使用插件可以进行遍历项目结构中所有描述文件,并生成配置树
以后只要在树里面配置即可进行不同平台的迁移了
-
这些是我个人在电子类学习和比赛中发现的传统模式中的不足点和想到的较为有效的解决办法,希望可以对大家有所帮助,能让各位将精力更多的放到技术底层原理,拓宽技术的眼界,而不是繁琐冗余的不同工程平台学习中去,学习发现和解决问题本身的能力
ps:一篇文章没法具体的讲清各个细节,欢迎有兴趣,有能力的同学来进行交流
相关的项目以供参考
ActivePeter/paMcuLib: My commonLib for MCUs. 我的mcu通用库 (github.com)