历史上的今天
返回首页

历史上的今天

今天是:2025年12月27日(星期六)

2022年12月27日 | 单片机怎么实现模块化编程?思维+实例+系统教程

2022-12-27 来源:zhihu

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

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

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

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

主要难在两个方面:

1.你的认知

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

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

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

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

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

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

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

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

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

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

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

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

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

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

这个架构分为2个部分:

1.内核

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

2.模块化编程思维

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


推荐阅读

史海拾趣

苏州锋驰(Feng)公司的发展小趣事
控制调节响应速度快,能够迅速响应负载和输入电压的变化。
Hokuriku公司的发展小趣事

90年代初期,随着全球化进程的加速,Hokuriku Electric开始将目光投向国际市场。公司首先在欧洲和北美设立了销售分支机构,随后又逐步拓展至亚洲其他地区。通过参加国际展会、建立合作伙伴关系等多种方式,Hokuriku Electric成功将其优质产品推向全球市场。这一过程中,公司不仅积累了丰富的国际销售经验,还提升了品牌知名度和影响力,为后续的全球化发展奠定了坚实基础。

百蓉(ECE)公司的发展小趣事

随着全球对可持续发展的日益重视,百蓉公司也开始在这一领域进行探索。他们研发出了一系列节能环保的电子产品,如低功耗显示器、高效能电源管理器等。同时,公司还积极参与废旧电子产品的回收和再利用工作,致力于减少电子废物对环境的污染。这些举措不仅提升了百蓉公司的品牌形象,也为其赢得了更多的市场份额。

上述五个故事,客观描述了百蓉公司在电子行业的发展历程,展现了其在技术创新、市场拓展、智能制造和可持续发展等方面的努力和成果。

Belkin公司的发展小趣事

随着电子行业的快速发展,贝尔金也紧跟时代步伐,不断进行技术革新和产品线拓展。2002年,贝尔金为苹果Dock连接器研发了一系列产品,包括汽车套件、电池组、读卡器等,这标志着它与苹果公司的深度合作开始。此后,贝尔金逐渐成为苹果官方合作配件制造商,其产品在苹果用户中享有很高的声誉。

FOCI Fiber Optic Communications Inc公司的发展小趣事

贝尔金在创新方面的努力得到了行业的广泛认可。例如,在2015年,贝尔金获得了CES创新大奖,这充分证明了其在电子产品设计和技术创新方面的实力。此外,贝尔金还多次获得其他行业奖项和荣誉,这些成绩不仅提升了贝尔金的品牌形象,也为其未来的发展奠定了坚实的基础。

以上五个故事从不同的角度展示了Belkin公司在电子行业中的发展历程和成就。从创立初期的艰辛到逐步成长壮大,再到全球化布局和创新发展,贝尔金凭借坚定的信念和不懈的努力,成为了电子行业的佼佼者。

ETC2公司的发展小趣事

ETC2公司深知服务对于企业的重要性,因此不断优化服务体系以提升竞争力。他们建立了完善的客户服务体系,为用户提供24小时在线客服支持,确保用户在使用过程中遇到问题能够及时得到解决。此外,ETC2公司还定期举办用户培训活动,帮助用户更好地了解和使用ETC设备。这些举措不仅提高了用户的满意度和忠诚度,也为ETC2公司赢得了更多的市场份额。

问答坊 | AI 解惑

求助 猜一猜

后天考试,老师说用3个三级管,5个二级管(可能有稳压二级管),5个电阻,6个电容组成一个电路,说是一般高手都知道是什么电路,可俺不是高手,是很低的手,求高手帮忙给出电路图呀?…

查看全部问答>

关于AD的一个器件,见多识广的来

手头上有AD公司的器件一个AD80100是很早申请的样片,AD不给提供资料了。不知道有哪位高手认识他,有无资料可以提供?…

查看全部问答>

2007年电子设计大赛F题(小车跷跷板)分析

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 首先看基本要求: 第一点:从第一点看出车的速度要求,抛开车身长度,从A点出发后要到达C点,最小平均车速应该在750mm/30S=25mm/S以上,市售的小车很难达到这样的速度,因此需要使用PWM调速或者 ...…

查看全部问答>

嵌入式开发站点集锦

国内有关嵌入式开发的论坛 电子产品世界的论坛[2004年09月30日] http://bbs.edw.com.cn/index.asp 恒颐高科论坛[2004年09月30日] http://www.hyesco.com/forum/index.asp 国内站点 华恒公司的主页,里面有很多的相关资料,有待大家去发现 http://ww ...…

查看全部问答>

闭门学习WindowsEmbedded

             在现在日益信息化的社会中,计算机和网络已经全面渗透到日常生活的每一个角落。嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才投入其中。即使在现在这个被金融风暴席卷的市场很不景气,随着信息化,智 ...…

查看全部问答>

EEWORLD平台需要大家共同建设,单靠几个人很难做好(一段关于芯币制度的对话)

以下是一段与EEWORLD网友关于芯币制的对话,从中更为深切地感受到EEWORLD的发展靠大家: lian为EEWORLD论坛单片机板块版主njlianjian,单片机培训的核心人物。 lian说: 论坛下载能不能取消掉芯币啊       因为如果我想下载 ...…

查看全部问答>

如何删除微软默认的属性页?

在windowmobile操作系统中如何删除 “开始-设置—电话”中微软默认的属性页如“网络”、“服务”等??? …

查看全部问答>

wince 打2008年的补丁出错

wince打了2008年的补丁,怎么连基本的sysgen都出错呢? 错误提示 tbtcore无法nmake,不知道有谁碰到过这种情况,不知道打2007年的补丁能不能正常编译通过,不过现在微软网站不提供2007年的补丁了,那位朋友有,能共享一下。。。。。。…

查看全部问答>

各位手上有什么比较好用的bootloader吗?要求可以将nk.bin文件下载到内存中运行。

有的话给我发推荐一份啊,如果有时间的话麻烦给我发一份。 我的邮箱cy757#21cn.com(#改为@)…

查看全部问答>

哪位大虾用过hs5104解码

hs5104解码如何判断引导码…

查看全部问答>