一、硬件驱动
1、硬件设备与开发板通过引脚相连,进行数据传输。同一类型硬件有不同厂家。为了更好的兼容,通常将软硬件模块化,通过各种接口进行数据传输和功能实现。微服务、组件、文件、类、函数等因此应运而生。需要抽象的点如下:
①、软件层面上,需要实现的方法或功能。
②、软件操作硬件,需要执行动作的接口。一般使用结构体指针。参考硬件文档对硬件编程。
③、硬件对于操作自身的方法。 具体实现于其独立文件中,封装在结构体或类中供上层调用。
2、原理及操作步骤(结构体存放硬件信息及函数指针;指针数组存放指针的数组,用于调用;函数指针调用函数操作硬件):
①、定义结构体,供系统使用:
typedef struct module {
char name[];
bool (*function)(int param);
} moduleT, *p_module;
②、系统中使用结构体定义的指针数组:(ID可以通过系统读取,也可交给合入模块自己验证)
static p_module module_list[] = {
&g_module1,
&g_module2,
... ... };
③、在系统中使用:
moduleT g_current_module = module_list[index]; // index 为读取到的ID在数组中的对应
二、中断注册
1、通过中断关联的指针数组,直接注册及使用中断函数。无需在代码中重复定义中断。指针数组存放指针的数组,用于调用指针;函数指针调用函数。可以直接调用,或者作为回调函数。
①、定义函数指针,用其定义指针数组:
typedef void (*irq_func)(int);
②、定义指针数组,存放产生中断对应的处理函数:
irq_func irq_array[num]; //num 为中断个数
③、定义注册函数,注册中断对应的处理函数:
void register_irq(int irq, irq_func function) { // irq为中断号
irq_array [ irq ] = function; // 在数组中,存放函数指针
INTMSK &= ~(1 << irq); // 清除掩码,使能中断
}
2、使用:
①、在设置中断源处,注册中断,为指针数组赋值:
register_irq(num, function); // num 为中断号,function为中断处理函数
②、在中断处理函数处,先分辨中断源,再把中断源做参数传入函数指针数组:
irq_array[bit1](bit2); // 调用数组中第[bit1]个函数,并传入参数(bit2)
网友评论