换一种CDD驱动框架--Apple的学习笔记
2023-07-02 本文已影响0人
applecai
一,前言
相同的事情,重复用相同的方法来做,就没什么意思了,需要找更加优化的方法来做,最近我在思考我做的cdd手写代码库,有专门一个c文件把每个小模块进行初始化及周期任务的调用,若将来忙不过来,有些小模块我要委派出去给其它人做,那么就面临一个问题,就是我们会要修改同一个c文件。所以一般大型项目,比如linux都是用每个模块进行注册,初始化就可以调用了。rt-thread等的driver初始化也是类似设计的。
二,自动注册模块的优缺点
我之前就玩过,而且还在没有link文件的windows上练习过类似框架。C工程自动注册子模块_框架重构--Apple的学习笔记当时仿真通过后,我没有使用到嵌入式单片机开发的原因是我认为需要修改link文件来添加段名,才能编译通过,感觉影响面大,会导致所有地址重排,结果我今天才发现原来不在link文件中添加段名都是可以的,只是它不放在你预期的地址范围内,但是它依然是按字符顺序连续排列的,那么就用吧!
至于他的缺点就是时序排列要通过全工程搜索关键字,容易出错。但是若作为正向开发,架构师就定好了初始化1,2,3的顺序,在代码中直接设计为宏定义,对应模块初始化的时候用这个宏定义作为fn的顺序即可。
三,实战演练
init和周期runnable的实现方法雷同。我展示下初始化部分
driver.h文件的主要内容
typedef struct {
void (*init)(void); /**< init function for the driver */
}st_apDriverInit_Type;
#define DRV_REGIST(func,level) \
USED const st_apDriverInit_Type init_tbl_##func\
SECTION("apple.InitList."level) = {func}
driver.c的主要内容
/******************************************************************************/
/*! \brief init driver start fun without functions
* \return void
******************************************************************************/
static void apdriver_init_start(void)
{
}
DRV_REGIST(apdriver_init_start,"0");
/******************************************************************************/
/*! \brief init driver end fun without functions
* \return void
******************************************************************************/
static void apdriver_init_end(void)
{
}
DRV_REGIST(apdriver_init_end,"5");
/******************************************************************************/
/*! \brief init drivers
* \return void
******************************************************************************/
void apdrivers_init(void)
{
const st_apDriverInit_Type *it = &init_tbl_apdriver_init_start;
while (it < &init_tbl_apdriver_init_end) {
it++->init();
}
}
我先加了2个初始化函数作为测试,编译后的map文件符合预期。
static void apGPIO_init(void)
{
}
DRV_REGIST(apGPIO_init,"1");
static void apSPI_init(void)
{
}
DRV_REGIST(apSPI_init,"2");
![](https://img.haomeiwen.com/i12010880/0b2df0f66a3a73dc.png)
![](https://img.haomeiwen.com/i12010880/846589906eb1f274.png)
四,小结
这样看起来更符合高内聚,低耦合的思路,将来就这么用。谁让我那么喜欢折腾,相同的事尽量不用相同的方法去做,要么通过做工具自动生成代码来提高效率,要么继续优化框架,让其可移植性更加好,更适合多人的大型项目开发模式。我就是我,不一样的烟火~