美文网首页RTOS和GUI_基于英飞凌tc2x及stm32开发板
换一种CDD驱动框架--Apple的学习笔记

换一种CDD驱动框架--Apple的学习笔记

作者: applecai | 来源:发表于2023-07-02 22:00 被阅读0次

    一,前言

    相同的事情,重复用相同的方法来做,就没什么意思了,需要找更加优化的方法来做,最近我在思考我做的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");
    
    image.png
    image.png

    四,小结

    这样看起来更符合高内聚,低耦合的思路,将来就这么用。谁让我那么喜欢折腾,相同的事尽量不用相同的方法去做,要么通过做工具自动生成代码来提高效率,要么继续优化框架,让其可移植性更加好,更适合多人的大型项目开发模式。我就是我,不一样的烟火~

    相关文章

      网友评论

        本文标题:换一种CDD驱动框架--Apple的学习笔记

        本文链接:https://www.haomeiwen.com/subject/cxzfudtx.html