系列文章目录
面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程
程序分层
通过面向对象的编程思想来编程单片机程序,可以增强程序的可移植性,对于初入嵌入式单片机行业的小白,也更容易转向嵌入式Linux方向,对于如何抽象对于的结构体相关文章在本专栏前两篇,通过程序分层可以有效的将硬件与软件进行隔离,本文主要记录如何对程序进行分层,增加程序的兼容性。
本文以上一篇的输入设备的例子为例,来写如何进行程序分层:
输入针对输入系统可分为以下4层:
对输入设备初始化可分为4层,本文以
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
文章中已抽象出来的结构体为例来写如何分层。
1、管理层
初始化函数管理层代码如下:
void Init_InputDevice(void){
p_InputDevice pDev = g_pInputDevice; //g_pInputDevice 为自己定义的结构体类型
while(pDev){
pDev->DeviceInit(); //执行具体设备层的初始化函数
pDev = pDev->p_next;
}
}
g_pInputDevice 是结构体指针类型,可以通过自己定义赋值,也可以通过函数来获得设备。
2、具体设备层
初始化函数具体设备层代码如下:
static int GPIOKeyInit(void)
{
KAL_GPIOKeyInit(); //调用下一层(KAL层)初始化函数
return 0;
}
static InputDevice g_KeyDevice = { //为按键构造一个结构体
"GPIO_Key",
NULL,
GPIOKeyInit,
NULL,
NULL
};
可为具体设备构造一个结构体,也可以自己写一个添加具体设备的函数。
3、内核抽象(KAL)层
初始化函数内核抽象(KAL)层代码如下:
void KAL_GPIOKeyInit(void)
{
#if defined(CONFIG_NORTOS) //如果配置 CONFIG_NORTOS 执行 CAL_GPIOKeyInit();
CAL_GPIOKeyInit(); //调用下一层(CAL层)初始化函数
#elif defined(CONFIG_FREERTOS)
FreeRTOS_GPIOKeyInit();
#elif defined(CONFIG_RTTREAD)
RTTread_GPIOKeyInit();
}
根据不同的操作系统、不同的宏定义,执行不同的初始化函数;
4、芯片抽象(CAL)层
初始化函数芯片抽象(KAL)层代码如下:
void CAL_GPIOKeyInit(void)
{
#if defined(CONFIG_ST_HAL) //如果配置 CONFIG_ST_HAL 执行
KEY_GPIO_ST_Init(); // 对于 ST 芯片
#else
KEY_GPIO_Re_Init(); //其他系列
#endif
}
可以根据不同系列的芯片、HAL库(标准库)等,来执行不同的初始化函数。
通过程序这样的分层可提高程序的兼容性,
不同的操作系统、不同系列的芯片、不同的输入设备,分别执行不同的程序。
还可以
通过管理层对外提供两个接口(新增设备、初始化),通过新增设备可以添加不同的输入设备,并将这些设备利用链表保存起来;
数据产生流程
具体程序执行过程如下图:
小结
本文主要讲述单片机程序的面向对象的编程思想中,程序如何进行分层。感谢各位观看。
学习
百问网资源
总结笔记。
本专栏文章:
面向对象的编程思想写单片机程序——(1)学习笔记 之 程序设计
面向对象的编程思想写单片机程序——(2)学习笔记 之 怎么抽象出结构体
面向对象的编程思想写单片机程序——(3)学习笔记 之 程序分层、数据产生流程