关于linux软件分成,c分层的做法,软件复用的笔记和记录

在写程序中,软件分层复用是非常必要的,学了那么久的linux驱动,深受启发,看了老大写的lktxxx的源码,也是用到了分层,
于是,决定总结一下,c语言普通程序或者驱动的分层如何做,简单记录一下,如何使用分层,如何软件分层:

1.  头文件中定义结构体, 结构体定义了各个函数的形式,里面全是函数指针,与底层的接口函数文件要对应上啊:

 

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;

 

2. 在上层文件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);

 

 

3. 写底层函数,在底层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, 注意引用方法,是指针,所以这里要加上一个&符号
}

posted on 2021-03-04 11:30  done_lin  阅读(176)  评论(0编辑  收藏  举报