模块自动初始化机制

模块自动初始化

  • 在底层驱动和模块开发中,为了将业务和驱动分开,通常会设计一层接口
  • 应用层通过接口访问底层硬件,而不需要关心底层如何实现,底层硬件发生变化时只需要适配接口而不必更改业务逻辑。
  • 为了将底层驱动注册到接口中进行实例化,驱动层必须提供一个函数用于获取驱动,以便完成接口的初始化。
  • 但是这样存在明显的缺点,底层通过函数传递信息时会将应用层和底层耦合在一起,降低了程序灵活性。

无自动初始化机制时的驱动

  • 独立看门狗的接口
#pragma once
typedef void iwdg_inface_t;

typedef struct iwdg_drv
{
    void (*init)(iwdg_inface_t *obj);
    void (*reload)(iwdg_inface_t *obj);
    void *user_data;
} iwdg_drv_t;

void iwdg_init(iwdg_inface_t* obj);
void iwdg_reload(iwdg_inface_t* obj);
#include "iwdg_inface.h"

void iwdg_init(iwdg_inface_t *p)
{
    ((iwdg_drv_t *)p)->init(p);
}

void iwdg_reload(iwdg_inface_t *p)
{
    ((iwdg_drv_t *)p)->reload(p);
}
  • 独立看门狗的驱动
#pragma once

#include "iwdg_inface.h"

iwdg_inface_t *bsp_iwdg_inface_get(void);
#include "iwdg_drv.h"

static void prv_iwdg_init(iwdg_inface_t *obj)
{
    printf("iwdg init\r\n");
}

static void prv_iwdg_reload(iwdg_inface_t *obj)
{
    printf("iwdg reload\r\n");
}

iwdg_inface_t *prv_iwdg_inface_get(void)
{
    static iwdg_drv_t iwdg_drv = {
        .init = prv_iwdg_init,
        .reload = prv_iwdg_reload};
    return &iwdg_drv;
}
  • 业务层获取驱动实例
#include "iwdg_drv.h"

static iwdg_inface_t *prv_handle = {0};

int main(void)
{
    prv_handle = bsp_iwdg_inface_get();
    iwdg_init(prv_handle);

    for(;;)
    {
        iwdg_reload(prv_handle);
        sleep(1);
    }
}

  • 从上面的例子中可以看出,应用层为了获取驱动必须包含底层驱动的头文件,或者将bsp_iwdg_inface_get在应用层进行声明,否则无法获取到该实例。

添加自动初始化机制的驱动

  • 为了能够让业务层直接获取到实例,可将需要自动注册的函数指针放入一个专用的段中,在段前后放置两个变量,系统初始化时将两个变量中间的函数读出并进行调用,被调用函数中包含了设备注册功能,从而自动将设备注册到设备管理器中,应用层通过设备管理器查找对应的设备并返回实例地址,通过该实例可对硬件进行访问。

  • 此时独立看门狗的接口不变

  • 独立看门狗的驱动利用自动初始化机制将实例注册到设备管理器中

#include <stdio.h>
#include "iwdg_inface.h"
#include "mod_init.h"

#define DEV_NAME "dev1"

static void prv_iwdg_init(iwdg_inface_t *obj)
{
    printf("iwdg init\r\n");
}

static void prv_iwdg_reload(iwdg_inface_t *obj)
{
    printf("iwdg reload\r\n");
}

static iwdg_drv_t prv_iwdg = {
        .init = prv_iwdg_init,
        .reload = prv_iwdg_reload};

static int prv_iwdg_register()
{
    dev_register(DEV_NAME, &prv_iwdg);
    return 0;
}

INIT_MOD_LEVEL1(prv_iwdg_register);
  • 业务层通过设备管理器获取驱动实例
#include <unistd.h>
#include <stdlib.h>
#include <stddef.h>
#include "mod_init.h"
#include "iwdg_inface.h"

static iwdg_inface_t *prv_handle = NULL;

void main()
{
    mod_init();
    prv_handle = dev_find("dev1");

    if (NULL == prv_handle)
    {
        exit(1);
    }
    
    iwdg_init(prv_handle);

    while(1)
    {
        iwdg_reload(prv_handle);
        sleep(1);
    }
}

源码仓库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!
探索全栈前端技术的魅力:HTML+CSS+JS+JQ+Bootstrap网站源码深度解析 在这个数字化时代,构建一个既美观又功能强大的网站成为了许多开发者和企业追逐的目标。本份资源精心汇集了一套完整网站源码,融合了HTML的骨架搭建、CSS的视觉美化、JavaScript的交互逻辑、jQuery的高效操作以及Bootstrap的响应式设计,全方位揭秘了现代网页开发的精髓。 HTML,作为网页的基础,它构建了信息的框架;CSS则赋予网页生动的外观,让设计创意跃然屏上;JavaScript的加入,使网站拥有了灵动的交互体验;jQuery,作为JavaScript的强力辅助,简化了DOM操作与事件处理,让编码更为高效;而Bootstrap的融入,则确保了网站在不同设备上的完美呈现,响应式设计让访问无界限。 通过这份源码,你将: 学习如何高效组织HTML结构,提升页面加载速度与SEO友好度; 掌握CSS高级技巧,如Flexbox与Grid布局,打造适应各种屏幕的视觉盛宴; 理解JavaScript核心概念,动手实现动画、表单验证等动态效果; 利用jQuery插件快速增强用户体验,实现滑动效果、Ajax请求等; 深入Bootstrap框架,掌握移动优先的开发策略,响应式设计信手拈来。 无论是前端开发新手渴望系统学习,还是资深开发者寻求灵感与实用技巧,这份资源都是不可多得的宝藏。立即深入了解,开启你的全栈前端探索之旅,让每一个网页都成为技术与艺术的完美融合!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕咚.萌西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值