关于驱动最底层的硬件处理并没有全篇展开,基于MCU打造一套驱动都需要不断地迭代测试慢慢的变为一套成熟的驱动,你不可能看完我的长篇废话后就能去写出一套完美的驱动,那么我们的驱动工程师就太不值钱了,文章的目的是让你了解驱动的机制,驱动的调用关系,框架如何完美的匹配驱动程序,了解了这些以后,刚开始可能写的驱动有些蹩脚,但是你知知道驱动和框架的服务关系,你只要不断地尝试慢慢它会越来越好。
那么你对注册机制的了解有多少呢?你想要APP ——框架——驱动完美的统一,就需要对注册机制有清楚的了解,它实现了一套松耦合的调用关系的建立(我是这样理解的)。
还记得我最初写裸机程序的时候,程序内部的藕合非常严重,那时候还分什么应用程序、驱动程序、框架还有啥存在的意义?一套函数嵌套的调用关系打天下~!当然不是说逻辑不好或者是嵌套不好,不同的应用场合作用不同,小的项目还是裸奔or实时框架更舒坦。偏题了,我们先看下应用到驱动的调用关系,基于uart的serial层来完成框架关系的建立:
通过函数指针赋值的方式建立松耦合关系,而不是通过函数嵌套来实现,嵌套是定死的,只能调用固定名称的函数,而函数指针的方式是通过变量的赋值来实现松耦合,你只需要调用函数指针,而不需要关系指针的函数名(或者这里讲地址更精确):
serial层本质是一个承上启下的框架层,关于承上,上面的代码说明了,APP通过device对象的相关操作就可以操控到serial层的函数,那么serial层最终还要调用真实的uart驱动才能实现:
关于serial层如何实现底层驱动的访问,假如我们写的是应用那么它是怎么调用的呢?