关于linux软件分成,c分层的做法,软件复用的笔记和记录
在写程序中,软件分层复用是非常必要的,学了那么久的linux驱动,深受启发,看了老大写的lktxxx的源码,也是用到了分层,
于是,决定总结一下,c语言普通程序或者驱动的分层如何做,简单记录一下,如何使用分层,如何软件分层:
- 头文件中定义结构体, 结构体定义了各个函数的形式,里面全是函数指针,与底层的接口函数文件要对应上啊:
typedef struct
{
void (*reset)(void);//记住,里面是各个函数指针,对应底层文件的函数形式。
void (*delay)(unsigned int us);
int (*gettick)(void);
int (*read)(unsigned char *pdata, unsigned int len);
int (*write)(unsigned char *pdata, unsigned int len);
}LKTAdapter;
- 在上层文件A中,去实现接口,供底层绑定:
static LKTAdapter g_lkt_adapter; //声明一个结构体,
//接口,提供给底层的去绑定API的或者绑定函数的,用于给底层绑定,上层可以调用。
void cm_SetLKTAdapter(LKTAdapter *pada)
{
g_lkt_adapter.reset = pada->reset;
g_lkt_adapter.delay = pada->delay;
g_lkt_adapter.gettick = pada->gettick;
g_lkt_adapter.read = pada->read;
g_lkt_adapter.write = pada->write;
}
那么,在上层中,就可以调用函数了,例如:g_lkt_adapter.read(buffRx, outlen);
- 写底层函数,在底层c文件B中,实现各个成员函数,然后顺便在底层调用cm_SetLKTAdapter绑定接口。
下面的函数其实来自上层调用,并非底层原有。
int init_lktxxx_adapter(void)
{
LKTAdapter lkt_adapter;
lkt_adapter.reset = lktxxx_reset;
lkt_adapter.delay = udelay;
lkt_adapter.read = lktxxx_i2c_read;
lkt_adapter.write = lktxxx_i2c_write;
cm_SetLKTAdapter(&lkt_adapter);//分层,调用另一层的函数,绑定这里面的结构体和API, 注意引用方法,是指针,所以这里要加上一个&符号
}
本文介绍了Linux驱动程序中采用C语言分层设计的方法,以提高软件复用性。通过定义包含函数指针的结构体在头文件中,上层模块可以调用底层接口。在上层文件中实现接口并提供给底层绑定,而在底层文件中实现具体函数。通过`cm_SetLKTAdapter`函数进行接口绑定,使得上层能够调用底层实现的功能,如`g_lkt_adapter.read(buffRx, outlen)`。这种设计模式在驱动开发中常见,有助于代码组织和维护。
1644

被折叠的 条评论
为什么被折叠?



