单片机怎么实现模块化编程?思维+实例+系统教程

发布时间:2022-12-27  

在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。

总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。

如果程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简单的功能。

对于程序提升这块,如果没有人一个厉害的人带你,真的很难提升。

主要难在两个方面:

1.你的认知

有时候不是你做了越久,写的代码就越好,因为你一直在自己的认知水平内写代码。

如果不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。

2.找不到好的教程或实例

终有一天你要做中大型项目的时候就会发现,自己的代码水平和思维要提升了,但是找不到好的教程和方法。

这块最好的提升办法就是去找那些大佬写的代码,比如说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。

一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得学习的,最重要的是他们实现功能的思维,然后用代码怎么去实现?

如果别人不愿意分享给你,那可以去挖一下现成稳定的,比如说STM32的标准库,蓝牙协议栈等等。

我当初的提升方法是在某个公司做产品的时候,正好有个工程师离职了,老大把他写的代码给我来维护。

当我第一眼看到他代码的时候,觉得写的很复杂,感觉在秀技术,完全没必要这样去写。

然后我用他的代码拿配套的产品来测试,发现很稳定,我尝试按照我的思维改了以后,就出现了各种问题。

慢慢地,研究越深,我越是深刻体会这位工程师为什么要那样去写,自己跟他完全不是一个级别的。

其实他的就是基于模块化编程的思维去做的,当时还没吃透他的代码,我是从那家公司离职后又过了几年才彻底领悟他的代码。

一、单片机模块化编程怎么实现?

基于他的这种思维和实现方法,再结合我自己多年经验,最后自己又创新了一个全新的架构。

这个架构分为2个部分:

1.内核

内核主要是用来管理任务的,除了管理还提供了一些队列算法接口,方便产品使用。

2.模块化编程思维

对于单片机产品开发来说,我觉得可以分为3层:硬件层、中间层、应用层

我们先来说说中间层应用层

中间层:就是不算是真正产品的功能代码,比如说解析某种自定义协议,协议解析完以后的数据才是真正产品功能数据。

上图就是对云平台协议进行解析,比如说解析wifi是否连接的命令的程序,相对应用层来说,我们只需要”wifi已连接”和”wifi未连接”这两个明确的数据,而不做具体解析程序。

这样做最大的好处就是,假设我们换了一家云平台,应用层的程序不用改,只需要改硬件层和中间层程序即可,不至于因为换了一家云平台,导致整个产品程序崩盘的问题

一般来说,如果不是中大项目,我都直接省略中间层,毕竟代码量大了,会浪费批量生产时的时间也浪费单片机资源

硬件层:我们重点来说说这个,这个真的是很多人痛到不能再痛的痛点,也是很多工作几年工程师一直不知道怎么解决的问题,专门是用来采集单片机输入数据,或者控制硬件电路输出。

采集信号有很多类型,比如说按键检测、ADC检测、红外信号接收、串口接收、SPI、IIC等这种就是属于硬件层输入数据。

我拿按键输入来举例,先来看看原理图:

电路非常简单,就几个按键串上电阻接了单片机引脚,按键按下就会有一个低电平的信号给到单片机,单片机就是通过检测对应引脚是否低电平来判断按键是否按下。

回到我们程序部分,按键检测过程我就不讲解了,我们的关键在于检测到某个按键按下以后,要怎么把这个值传给应用层。

那我是使用了回调函数来传递的,这样做的好处就是,真正能做到这个按键硬件层检测代码和应用层产品程序独立,增强移植性。

我们要使用按键功能的时候,直接注册下按键回调函数就可以了,如下图:

这样做还是比较灵活的,不管是应用层,还是中间层,哪里需要用到按键功能,我就在哪里调用注册函数。

Ok,硬件层采集数据基本上都可以用这种方式来处理,这样就能做到真正的模块化,这个也是我以前一直想不通研究了很久的处理方式。

下面说说控制硬件电路输出,这种输出型的没什么好说的,不涉及到硬件层的采集数据传递到应用层,直接调用硬件层的控制接口就行了。

比如说我应用层要控制一个LED灯点亮,代码简单到令人发指!

由于文章篇幅有限,很多代码不方便展示,如果想学程序架构这块的系统教程可以找无际单片机编程拿。

这套课程的内容我个人认为至少价值3000以上,每节课都为解决产品痛点,没有一个知识点是多余的,凡是看过的小伙伴反馈都如获至宝,原本是录出来卖的,后面工作一忙就没时间去搞。

现在正好在做这块的,纠结了很久还是开源给大家学习,就当是对我铁粉的一些回馈,原创非常不易,如果你拿了,麻烦也给我点回馈,给我来个三连就行!


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    PLC模块化编程实例;前言PLC模块化编程 PLC的模块化编程方式是基于程序库为设计作为核心的,其方式与目前的单片机编程方式有点类似。PLC编程可以借鉴单片机这种函数库的编程方式,将一......
    CubeMX和Keil的MDK-ARM等。   C语言是STM32单片机最常用的编程语言之一,它具有结构化、模块化和可移植性强的特点,可以很好地描述STM32单片机的各种操作和功能。在使用C语言......
    的功能。通过模块化编程,使整个系统稳定可靠,能够实现智能开窗器控制系统的设计要求。 系统整体设计 本设计采用直流推杆电机的正反转模拟开窗器的开关状态。开窗器的光控,采用......
    判断光照强度控制窗户开关、温湿度控制部分是采用温湿度模块监测环境温湿度,并实时显示在OLED屏幕上,通过判断温度高低控制窗户开关,同时实现了雨滴控制和4G控制的功能。通过模块化编程......
    单片机怎么实现模块化编程?思维+实例+系统教程;在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。 总是感觉自己写的程序不够完美,移植......
    模式也是日新月异,如基于传统51单片机C 语言编程技巧探讨,介绍了编程特点与技巧及模块化编程设计;张华林老师在单片机编程模块化设计研究中详细讲述了模块化编程方法;黎民山老师的基于流程图编程的单片机软件系统开发,将程......
    会发现原来梯形图和这些硬件电路是可以很好对应起来的。 2、了解PLC编程的方式 线性编程模块化编程、结构化编程。对于西门子plc,以结构化编程为主,但可以使用线性编程和模块化编程,对于结构化编程,需要有一定的结构化编程思想。 如果......
    出每个部分所需要的输入输出信号,然后将这些信号设置为PLC程序的输入输出。   2. 功能模块化编程法:将程序按照功能进行模块化设计,将每个功能模块当做一个独立的“小程序”,然后......
    建立关系,编程者不用再去记忆枯燥的指令,而且C语言编程的层次化、模块化编程也大大提高了代码的可读性。相比于汇编,C语言可以用更少的代码实现更复杂的功能,而且还更易于理解。这也是C语言......
    物联网网关那个课程项目来举例。 我采用了模块化编程的思维,从整体架构上分硬件层和应用层。 一般来说还有中间层,比如解析一些协议之类,项目中间层的代码不多,被我简化了。 每个功能模块的全局变量,都定......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>