单片机怎么实现模块化编程?实用程度让人发指
在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。
总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。
如果程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简单的功能。
对于程序提升这块,如果没有人一个厉害的人带你,真的很难提升。
主要难在两个方面:
1.你的认知
有时候不是你做得越久,写的代码就越好,因为你一直在自己的认知水平内写代码。
如果不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。
2.找不到好的教程或实例
终有一天你要做中大型项目的时候就会发现,自己的代码水平和思维要提升了,但是找不到好的教程和方法。
这块最好的提升办法就是去找那些大佬写的代码,比如说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。
一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得学习的,最重要的是他们实现功能的思维,然后用代码怎么去实现?
如果别人不愿意分享给你,那可以去挖一下现成稳定的,比如说STM32的标准库,蓝牙协议栈等等。
我当初的提升方法是在某个公司做产品的时候,正好有个工程师离职了,老大把他写的代码给我来维护。
当我第一眼看到他代码的时候,觉得写的很复杂,感觉在秀技术,完全没必要这样去写。
然后我用他的代码拿配套的产品来测试,发现很稳定,我尝试按照我的思维改了以后,就出现了各种问题。
慢慢地,研究越深,我越是深刻体会这位工程师为什么要那样去写,自己跟他完全不是一个级别的。
其实他的就是基于模块化编程的思维去做的,当时还没吃透他的代码,我是从那家公司离职后又过了几年才彻底领悟他的代码。
一、单片机模块化编程怎么实现?
基于他的这种思维和实现方法,再结合我自己多年经验,最后自己又创新了一个全新的架构。
这个架构分为2个部分:
1.内核
内核主要是用来管理任务的,除了管理还提供了一些队列算法接口,方便产品使用。
2.模块化编程思维
对于单片机产品开发来说,我觉得可以分为3层:硬件层、中间层、应用层 。
我们先来说说中间层 和应用层 。
中间层: 就是不算是真正产品的功能代码,比如说解析某种自定义协议,协议解析完以后的数据才是真正产品功能数据。
上图就是对云平台协议进行解析,比如说解析wifi是否连接的命令的程序,相对应用层来说,我们只需要”wifi已连接 ”和”wifi未连接 ”这两个明确的数据,而不做具体解析程序。
这样做最大的好处就是,假设我们换了一家云平台,应用层的程序不用改,只需要改硬件层和中间层程序即可,不至于因为换了一家云平台,导致整个产品程序崩盘的问题 。
一般来说,如果不是中大项目,我都直接省略中间层,毕竟代码量大了,会浪费批量生产时的时间 ,也浪费单片机资源 。
硬件层:我们重点来说说这个,这个真的是很多人痛到不能再痛的痛点,也是很多工作几年工程师一直不知道怎么解决的问题, 专门是用来采集单片机输入数据,或者控制硬件电路输出。
采集信号 有很多类型,比如说按键检测、ADC检测、红外信号接收、串口接收、SPI、IIC等这种就是属于硬件层输入数据。
我拿按键输入来举例 ,先来看看原理图:
电路非常简单,就几个按键串上电阻接了单片机引脚,按键按下就会有一个低电平的信号给到单片机,单片机就是通过检测对应引脚是否低电平来判断按键是否按下。
回到我们程序部分,按键检测过程我就不讲解了,我们的关键在于检测到某个按键按下以后,要怎么把这个值传给应用层。
那我是使用了回调函数来传递的,这样做的好处就是,真正能做到这个按键硬件层检测代码和应用层产品程序独立,增强移植性。
我们要使用按键功能的时候,直接注册下按键回调函数就可以了,如下图:
这样做还是比较灵活的,不管是应用层,还是中间层,哪里需要用到按键功能,我就在哪里调用注册函数。
Ok,硬件层采集数据基本上都可以用这种方式来处理,这样就能做到真正的模块化,这个也是我以前一直想不通研究了很久的处理方式。
下面说说控制硬件电路输出,这种输出型的没什么好说的,不涉及到硬件层的采集数据传递到应用层 ,直接调用硬件层的控制接口就行了。
比如说我应用层要控制一个LED灯点亮,代码简单到令人发指!
由于文章篇幅有限,很多代码不方便展示,如果想学程序架构这块的系统教程可以找无际单片机编程拿。
这套课程的内容我个人认为至少价值3000以上,每节课都为解决产品痛点,没有一个知识点是多余的,原本是录出来卖的,后面工作一忙就没时间去搞。
现在正好在做这块的,纠结了很久还是开源给大家学习,就当是对我铁粉的一些回馈,原创非常不易,如果你拿了,麻烦也给我点回馈,给我安排个三连就行!
十年老司机的单片机模块化编程
本课程为免费课程
本课程讲解单片机C语言模块化编程思维,利用结构体、枚举、指针、函数指针等将外设进行封装,方便程序的阅读、修改与移植。
课程主要内容
点击“了解更多”,即可免费观看视频
相关问答
单片机 编程为什么要进行 模块化 编程 - 圈小姐的freestyle 的...以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。模块化编...
为什么很多 单片机 的工作电压是5v?因为大多数芯片都是5V的TTL电平,要做到电平兼容,电平匹配,避免要电平转换操作,所有很多单片机的工作电压都是5V。TTL指的是TTL电平,0~5V之间,小于0.2V输出...因...
51 单片机 和stm32的低功耗特性对比?优点如下:1、STM32属于arm内核的一个版本,比传统的51单片机高级多了,有很多资源是51不具备的,如usb控制器。而且已经废除了机器周期什么的,速度不是51能比...
单片机 为什么还在用C语言编程?单片机为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言。这个问题的意思应该是:现在有很多很好用的高级语言,如java,python,VC等等,为...单片...
JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写 单片机 程序?菜农从1981年开始就涉足与嵌入式领域的编程,开始是汇编语言和宏汇编语言,后来是C语言及C++语言,其他语言可能有,但很少且无大出路。因为嵌入式领域的编程与...
开发 单片机 学什么语言好?单片机的出现使硬件设计变得更为简单,产品的功能也更强大,而程序就是单片机的灵魂。目前功能稍微复杂一点的电子产品,都是以单片机为...第一个优点:易于移植有...
树莓派和 单片机 的区别?树莓派和单片机的主要有以下三个区别:一、主体不同1、树莓派:是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。2、单片机:是一...
单片机 和PLC的区别和联系?PLC(可编程逻辑控制器)和单片机是工业控制领域常用的两种控制设备,它们有以下区别:1.功能:PLC主要用于工业自动化控制系统,能够处理大规模的控制任...PLC(...
mcs-51 单片机 的特点及应用?MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MC...
单片机 主要用c还是c++,还是ja?单片机开发,需要用软件来操控硬件,用到的开发语言应该能够直接操作硬件,因此常用的编程语言是汇编语言和C语言。目前大部分的开发选择C语言为主,也有部分场合...