单片机怎么实现模块化编程?实用程度让人发指
在刚开始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺了点什么。
总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。
如果程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简单的功能。
对于程序提升这块,如果没有人一个厉害的人带你,真的很难提升。
主要难在两个方面:
1.你的认知
有时候不是你做得越久,写的代码就越好,因为你一直在自己的认知水平内写代码。
如果不提升你的认知,代码自然也不会提升,所以想要提升代码水平,首先要提升的是你的认知。
2.找不到好的教程或实例
终有一天你要做中大型项目的时候就会发现,自己的代码水平和思维要提升了,但是找不到好的教程和方法。
这块最好的提升办法就是去找那些大佬写的代码,比如说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。
一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得学习的,最重要的是他们实现功能的思维,然后用代码怎么去实现?
如果别人不愿意分享给你,那可以去挖一下现成稳定的,比如说STM32的标准库,蓝牙协议栈等等。
我当初的提升方法是在某个公司做产品的时候,正好有个工程师离职了,老大把他写的代码给我来维护。
当我第一眼看到他代码的时候,觉得写的很复杂,感觉在秀技术,完全没必要这样去写。
然后我用他的代码拿配套的产品来测试,发现很稳定,我尝试按照我的思维改了以后,就出现了各种问题。
慢慢地,研究越深,我越是深刻体会这位工程师为什么要那样去写,自己跟他完全不是一个级别的。
其实他的就是基于模块化编程的思维去做的,当时还没吃透他的代码,我是从那家公司离职后又过了几年才彻底领悟他的代码。
一、单片机模块化编程怎么实现?
基于他的这种思维和实现方法,再结合我自己多年经验,最后自己又创新了一个全新的架构。
这个架构分为2个部分:
1.内核
内核主要是用来管理任务的,除了管理还提供了一些队列算法接口,方便产品使用。
2.模块化编程思维
对于单片机产品开发来说,我觉得可以分为3层:硬件层、中间层、应用层 。
我们先来说说中间层 和应用层 。
中间层: 就是不算是真正产品的功能代码,比如说解析某种自定义协议,协议解析完以后的数据才是真正产品功能数据。
上图就是对云平台协议进行解析,比如说解析wifi是否连接的命令的程序,相对应用层来说,我们只需要”wifi已连接 ”和”wifi未连接 ”这两个明确的数据,而不做具体解析程序。
这样做最大的好处就是,假设我们换了一家云平台,应用层的程序不用改,只需要改硬件层和中间层程序即可,不至于因为换了一家云平台,导致整个产品程序崩盘的问题 。
一般来说,如果不是中大项目,我都直接省略中间层,毕竟代码量大了,会浪费批量生产时的时间 ,也浪费单片机资源 。
硬件层:我们重点来说说这个,这个真的是很多人痛到不能再痛的痛点,也是很多工作几年工程师一直不知道怎么解决的问题, 专门是用来采集单片机输入数据,或者控制硬件电路输出。
采集信号 有很多类型,比如说按键检测、ADC检测、红外信号接收、串口接收、SPI、IIC等这种就是属于硬件层输入数据。
我拿按键输入来举例 ,先来看看原理图:
电路非常简单,就几个按键串上电阻接了单片机引脚,按键按下就会有一个低电平的信号给到单片机,单片机就是通过检测对应引脚是否低电平来判断按键是否按下。
回到我们程序部分,按键检测过程我就不讲解了,我们的关键在于检测到某个按键按下以后,要怎么把这个值传给应用层。
那我是使用了回调函数来传递的,这样做的好处就是,真正能做到这个按键硬件层检测代码和应用层产品程序独立,增强移植性。
我们要使用按键功能的时候,直接注册下按键回调函数就可以了,如下图:
这样做还是比较灵活的,不管是应用层,还是中间层,哪里需要用到按键功能,我就在哪里调用注册函数。
Ok,硬件层采集数据基本上都可以用这种方式来处理,这样就能做到真正的模块化,这个也是我以前一直想不通研究了很久的处理方式。
下面说说控制硬件电路输出,这种输出型的没什么好说的,不涉及到硬件层的采集数据传递到应用层 ,直接调用硬件层的控制接口就行了。
比如说我应用层要控制一个LED灯点亮,代码简单到令人发指!
由于文章篇幅有限,很多代码不方便展示,如果想学程序架构这块的系统教程可以找无际单片机编程拿。
这套课程的内容我个人认为至少价值3000以上,每节课都为解决产品痛点,没有一个知识点是多余的,原本是录出来卖的,后面工作一忙就没时间去搞。
现在正好在做这块的,纠结了很久还是开源给大家学习,就当是对我铁粉的一些回馈,原创非常不易,如果你拿了,麻烦也给我点回馈,给我安排个三连就行!
单片机c语言基础知识,c语言必背100代码有哪些?
我记得刚开始接触编程的时候,觉得太难了。
也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧?
他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响。
一个程序几千行,错一个标点符号都不行这也太难了吧?
带着新手的灵魂拷问,作为从业单片机编程10年的开发者,我来为大家拨开云雾。
看完以后你就会明白,其实他们也没那么厉害!即便你是初中文凭,也照样能编程。
对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已。
你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的。
只是他们逻辑功能不一样,另外的那些英文,都是程序员自己起的,比如说一些变量的名字,函数的名字。
如果你喜欢你定义成abc都可以,只不过为了程序大了以后为了方便阅读和维护,我们一般起跟要实现的功能相同的英文缩写代替。
比如说我要存储一个电压值,那你可以定义一个变量,名字叫VoltageValue,或者这两个词的缩写VoltVal。
所以,大家不要把这个想得这么神秘和高大上。
而从事单片机编程,需要的编程水平比做纯软件还要低一些,毕竟单片机的内存很有限,太大的程序也放不下。
单片机的c语言基础知识大家可以参考以下目录学习:
这个教程找无际单片机编程就可以拿到。
这是课程就是针对零基础的小伙伴学习的,先从认识单片机开始,然后再到计算机的存储和计算方式二进制、十进制。
学完这些基础,开始学习c语言的基本语法。
在学习过程中,大家一定要勤动手,多在单片机开发板上面做实验。
千万不要让知识点停留看懂的层面,看懂和自己能写出来区别还是很大的,请相信我!
如果你这些都学完了,可以在开发板上做个小实验,比如说电子时钟之类的。
这个步骤非常有必要,写的过程可以培养你的项目思维,以及代码整合能力。
如果这步直接跳过,后续学习更高级的stm32就会碰到很多问题,最大的问题就是你都学完了做项目还是无从下手。
单个功能都能实现,但整合起来就不知道怎么做了。
这就是缺少项目思维和代码整合能力导致的,不要一味地去追求学习高端的单片机,等你基础打扎实了,你会发现高端的也不过如此,就是外设多一点,资源丰富一点。
甚至说你会觉得高端的用起来比低端的单片机更加方便。
典型的就是stm32和51的对比,stm32单片机都是基于固件库开发,也就是原厂提供一套程序给你,你按照他们的函数调用就能把stm32单片机的资源用起来。
而51单片机就需要你去配置他们最底层的寄存器才能把资源用起来。
相对来说,stm32用熟了,开发效率会比51的高很多倍。
最后来聊下,有些新手说的c语言必背100个代码。
这纯粹是在瞎扯淡,c语言只是工具,不同的人用这个工具去实现同一种功能,他们的实现方法可能是不一样的,因为每个人的思维不同。
这不像我们课文靠背的,也没必要去背,看代码最重要的是理解这段代码实现功能的思路和原理。
通过功能和原理去理解代码,而不是通过代码去理解功能原理。
这个顺序搞不对,你一辈子都学不好编程。
相关问答
51 单片机 的编写程序是什么?答51单片机的编写程序一般指的是单片机的编程语言有三种种:机器语言、汇编语言与高级语言。机器语言是计算机能够看懂的语言。(形式为一段二进制代码).汇编语...
51 单片机编程 程序怎么编?51单片机编程程序怎么编?♣这种技术性问题在今日头条上,几乎没有一个高手给你一个答复。因为学习51单片机编程程序是需要长篇大论,并且用电脑操作截图来说明...
哪几种编程语言可以用到 单片机编程 里?目前大部分单片机都可采用C语言和汇编语言,部分高级单片机如DSP,可采用C++进行面向对象的编程。1、汇编语言。采用汇编语言进行编程,优点是会对单片机的架构...
单片机 一般是用什么 编程 软件?Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和...
单片机编程 中,哪些方面经常用到指针?指针的使用又自带哪些优势?函数结构体和数组做为参数,直接访问内存或者寄存器,回调函数注册,动态分配内存,链表等优势:1.效率快,当函数形参中含有数组或者结构,使用指针传递,避免...
8脚 单片机 烧写程序步骤?第一步、先安装AT89C51单片机的开发工具软件,如KeilUV2第二步、在Keil中创建51单片机的工程,并编写相应的控制代码,之后生成HEX文件第三步、打开51单片机专用...
单片机编程 需要什么配置?1、需要一个编程编译软件,在此软件的编程窗口中编写用户程序,经过软件编译生成hex代码供单片机应用。2、需要一个烧录或下载软件,通过软件与单片机通讯,将用...
单片机编程 对电脑配置的要求?单机片流畅编程仅需要i53.5GCPU以上,16G内存,和高速的SSD,以上是本专业单片机实验室的大神的推荐,其实游戏本绰绰有余了,硬盘固态的(尽量大),内存8g就...单...
怎样提高对 单片机 的 编程 能力?我大学曾泡在实验室搞了一年多的单片机开发,可以分享一下心得。我觉得单片机的编程不单单是掌握C语言就可以了,首先要弄通单片机的基本硬件功能。比如说中断,...
谁能帮忙!! 单片机编程 ?,单片机编程哪家靠谱?[回答]如果你想找专业一点的建议找旺扬单片机开发吧,你们公司是这方面的专业服务公司。建议联系,他们是专业承接电路板设计开发的公司,做产品非常的负责...