在我刚涉足研发工作的几年中,主要专注于单片机软件开发的开发工作。虽然能实现基本的功能需求,但总感觉有些许不足。
在程序提升方面,若无人引导,实则难以自我突破。其难点主要体现在两个方面。
首先是认知问题。并非工作时间越长,写的代码就越好。因为很多时候,我们都是在自己的认知水平内写代码。若不提升认知水平,代码质量自然难以提升。提升代码水平的前提是先提升我们的认知能力。
寻找合适的教程或实例也是一大挑战。随着项目的规模逐渐扩大,尤其是中大型项目,我们会发现自己的代码水平和思维方式需要提升。但此时往往难以找到合适的资源来帮助我们进步。
为解决这一问题,最好的办法是寻找资深工程师的代码进行学习。比如在公司里,与资深的同事建立良好关系,请教他们的问题并观察他们的编程思维。一般而言,他们都很乐意分享他们的经验和代码。除此之外,我们还可以从现成的稳定项目中学习,如STM32的标准库和蓝牙协议栈等。
这位工程师的代码是基于模块化编程思维构建的。当时我并未完全理解他的代码精髓,直到我离开公司多年后才彻底领悟其精髓。模块化编程的思维模式使得代码更加易于管理和扩展。
关于单片机模块化编程的实现方式,我结合了自己的经验和那位工程师的编程思维,创新出了一套全新的架构。
这个架构主要由两部分组成:内核和模块化编程思维。内核主要负责任务管理,并提供了一些队列算法接口以方便产品使用。而模块化编程思维则将单片机产品开发分为三层:硬件层、中间层和应用层。
中间层主要负责处理非产品功能的核心数据,如解析自定义协议等。这种架构的最大好处是,当我们需要更换云平台时,只需更改硬件层和中间层程序,而应用层程序无需改动。这有效避免了因更换云平台导致整个产品程序崩溃的问题。
在硬件层方面,我们专注于采集单片机输入数据和控制硬件电路输出。硬件层的输入数据采集涉及多种信号类型,如按键检测、ADC检测、信号接收等。我们采用回调函数的方式将硬件层的数据传递给应用层,这样就能实现硬件层与应用层的真正独立,增强了程序的移植性。
对于控制硬件电路输出这种输出型任务,直接调用硬件层的控制接口即可完成。例如,当我们需要在应用层控制一个LED灯点亮时,代码简单直观。