单片机怎么实现模块化编程?实用程度让人发指

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

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

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

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

主要难在两个方面:

1.你的认知

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

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

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

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

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

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

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

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

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

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

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

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

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

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

这个架构分为2个部分:

1.内核

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

2.模块化编程思维

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(0)

相关推荐

  • 原来搞单片机也可以面向对象

    摘要:在看别人单片机程序时,你也许是奔溃的,因为全局变量满天飞,不知道哪个在哪用了,哪个表示什么,而且编写极其不规范.自己写单片机程序时,也许你也是奔溃的.总感觉重新开启一个项目,之前的写过相似的代码 ...

  • 嵌入式开发中的两点编程思想

    嵌入式开发,除了掌握基本的编程语法之外,编程的思想也是很关键,下面说两点编程思想. 1分层思想 嵌入式分层思想,可能你不懂,但你肯定见到过很多类似下面这样的软件结构图. 比如,RT-Thread Na ...

  • 实例图解什么是西门子模块化编程?

    概述 模块化编程中OB1起着主程序的作用,FC或FB控制着不同的过程任务,相当于主循环程序的子程序.模块化编程中被调用块不向调用块返回数据. 模块化程序的执行 模块化编程中OB1起着主程序的作用,FC ...

  • 科研 |MOL BIOL EVOL:病毒适应度决定植物防御响应的转录组和表观基因组重编程的程度

    编译:YQ,编辑:景行.江舜尧. 原创微文,欢迎转发转载. 导读 植物应激可通过识别病原体蛋白质或RNA分子而触发.病原体相关分子模式(PAMP)可引发寄主免疫反应(PTI),而病原体特异蛋白被NLR ...

  • 关于PLC模块化编程和结构化编程的那些事

    概述 模块化编程中OB1起着主程序的作用,FC或FB控制着不同的过程任务,相当于主循环程序的子程序.模块化编程中被调用块不向调用块返回数据. 模块化程序的执行 模块化编程中OB1起着主程序的作用,FC ...

  • 模块化编程与不可信验证思维

    一.背景 在软件研发中,总会出现这样的形象,同事小甲研发一个子功能模块,同事小乙研发了另外一个子功能模块.一个业务完整流程需要调用两位同事研发的两个子功能模块.业务数据出现了异常,同事甲和同事乙根据业 ...

  • 模块化编程

    界面的拆分 尽可能不要把控件堆在一个窗体里,放到多个子窗体中. 尽可能不要把多个子窗体放在一个容器里,可以使用多个独立的顶层窗口. 对按钮点击执行的代码,尽可能不要全堆在一个文件里,可以尝试拆分出各种 ...

  • 干货 | ABB机器人编程实用技巧

    一.ABB机器人Pdisp 轨迹偏移使用 1.如果有下图两个产品,已经完成了右边产品轨迹,左边产品估计一样,如何快速生成左边轨迹(左边产品可能有平移和旋转).  2.完成右边轨迹示教Path_30,如 ...

  • PLC工程师:ABB机器人编程实用技巧,多项案例!

    ABB机器人Pdisp 轨迹偏移使用 1.如果有下图两个产品,已经完成了右边产品轨迹,左边产品估计一样,如何快速生成左边轨迹(左边产品可能有平移和旋转). 2.完成右边轨迹示教Path_30,如上图. ...

  • PLC模块化编程和结构化编程,看完这些不会那么难了

    概述 模块化编程中OB1起着主程序的作用,FC或FB控制着不同的过程任务,相当于主循环程序的子程序.模块化编程中被调用块不向调用块返回数据. 模块化程序的执行 模块化编程中OB1起着主程序的作用,FC ...

  • 数控车削编程实用技巧

    https://m.toutiao.com/is/JcGuaXX/ 虽然现在CAM编程已相当普遍,但手工编程仍将在想当一段时间内有广泛的应用市场,所以本文所述的数控车削编程技巧还很有实际意义的.文中所 ...