单片机裸机编程框架
指导思想
- 每一个电路模块单独编写驱动 程序。
- 使用定时器或者cpu来进行时间调度(使用mcu编程框架)
- 文件分层、同级之间不可以互相调用数据
- 这样可以降低功能模块之间的耦合度,在统一平台下移植或者删减不同的功能模块之时,不会影响其他模块的功能。
- 各个子文件建立自己的缓冲数据域,使用函数接口的方式来实现缓冲数据的访问。
- 规范代码书写要求,统一变量和函数的命名格式方便阅读。
- 某个硬件不正常工作,不能影响其他的硬件。
- 函数和数据分开控制,不受时间约束。
电路整体的逻辑分层框架
- 如下图所示:
bsp层模块的开发方法
- 典型:中断类型服务函数的编写
- step1:查询相应状态标志位。
- step2:清除状态标志位
- step3:编写中断服务函数
- ** 越短越好最好仅仅指示记录一些标志状态位,逻辑处理放到前台程序里面执行。**
- 符合“快进快出”原则。
- bsp层尽量不开辟自己的数据缓冲区。
driver层编写方法
- 驱动层需要提供中断服务函数的具体函数,并且调用bsp层的回调函数注册接口,来实现相关中断外设的数据部分处理。
- 驱动函数部分,要开辟自己的数据缓冲区,
- 为了降低使用extern的频率,我们开辟对外的数据缓冲区访问接口,数组则传出首地址(比如,串口的环形缓冲区);
应用层编写方法
- 应用层之间不允许互相调用接口,必须完全不具有耦合性。
- 应用层需要处理的数据,都要通过下一级的驱动层数据缓冲访问接口来获取。
- 尽量少使用extern关键字。
数据之间的交互
- 整个系统的数据可以分成以下几类:
- 复杂外设的句柄封装
- 类似于stm32等复杂外设,需要建立外设句柄之时,该句柄作为内部变量使用,除了在it文件里面可以使用extern之外,不再对外访问使用。
- 从外设获取的各种数据
- 此类数据我们可以放置在应用层的数据缓冲区里,在应用层被处理。
- 全局变量(自上而下的数据)
- 此类数据的特点是增大了耦合性,它可能会作用在所有的app应用中。
- 我们可以使用一个头文件和源文件,头文件里面定义出它的数据类型,源文件里面则把初始化以及参数检查,参数保存等及接口实现,此时往往会调用EEprom或者dataflash模块。
头文件之间的包含关系
- bsp文件包含所有最基础的(如:数据类型,通用模块)头文件模块。
- driver部分的头文件,只包含用到的bsp.h文件即可。
- driver部分的源文件,只要去包含自己同名的模块头文件。
- app部分的头文件,只包含所有的用到的驱动头文件。
- app部分的源文件,只包含自己同名模块的头文件。
- main部分只包含所有的app头文件。
应用层的初始化函数包含关系
- 应用层的初始化调用驱动层的初始化,驱动层的初始化->bsp初始化。
应用层的初始化函数包含关系
- 应用层的初始化调用驱动层的初始化,驱动层的初始化->bsp初始化。
- main函数只用来包含应用层的初始化,不在包含被调用外设的初始化。
|