浅谈MCU模块化编程
软件设计,完成需求是最基本的,合格的软件还应该易维护可重用。
维护意味着修改,易修改即易维护。
重用意味着不改或少改,最好是不改,无需改动即使可重用。
模块化编程可以有效实现易维护和可重用。
国内嵌入式行业,普遍不太关注软件质量。一方面是由于,嵌入式项目体量小,业务逻辑简单。另一方面是由于过去MCU性能低,太复杂的软件对空间和时间资源的占用较多。嵌入式软件工程师很多又兼做硬件,难免无法面面俱到,代码组织能力普遍较低。写出的代码全局变量满天飞,一个函数上千行。笔者刚入职的公司就存在这样的代码。看代码常常要抽丝剥茧实在头疼。
我们写代码就是要处理依赖和变化。
模块化编程,站在模块的角度来说,要实现模块自己的功能,难免要依赖外部提供的功能(函数,输入信号。。。)。在外部依赖改变时,要保持模块本身的代码不需要改动。这里C语言里好用的工具有两个,宏定义 和函数指针。站在模块的角度外面要根据我给的形式提供给我我要的东西,也就是要依赖倒置。
我们还应该精心设计函数的接口,模块外部应该只依赖模块提供的接口编程,不能用到模块内的状态(属性、变量)。模块内的状态对外部应该不可见(static)。设计接口也可以用函数指针,可以实现多态,不过这是另外一个话题了。
按上面的方式做后,模块本身的实现基本做到了可重用。外部使用了模块的接口,需求不变时,模块外部也能不变。内外的变化不会相互影响,做到了解耦。