zl程序教程

您现在的位置是:首页 >  后端

当前栏目

随想录(中间件接口的定义方法)

中间件接口 随想录
2023-09-27 14:27:11 时间

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

 

    很多时候,我们把ucgui、lwip、uip、sqlite、lua这些第三方软件称之为中间件,虽然他们实际使用上并不困难。和普通的libjpeg、libpng不同,这些中间件因为涉及到状态机切换、流程阻塞,所以在设计上要稍微注意一下。对于我个人而言,对于中间件的接口我是这么设计的,

 

1、中间件可以是单独的一个thread,比如说可以这么做

middle_ware_init()
middle_ware_run()

2、中间件最好是一个事件驱动型的框架,这项写起来比较方便和简洁,比如像这样

static void get_event() {

}

static void process_event() {

}

void middle_ware_run() {

    while(1) {

        get_event();
        process_event();
    }
}

3、middle ware提供给外部的接口,最好是基于event的阻塞接口,比如这样

void middle_ware_api() {

    struct event e;
    struct semaphore s;
    int type;
    int data;

    e.type = type;
    e.data = data;
    e.s = s;

    send_event(&e);
    wait_for_semaphore(e.s);
}

 

4、如果middle ware提供的数据可以当场获取,那么也可以直接访问,但是注意mutex保护,

void middle_ware_get() {

    mutex_get();

    /*  add your own code here */

    mutex_release();
}

 

5、因为middle ware也需要调用lowlevel的接口,如果是非阻塞接口,那么直接调用。如果是阻塞接口,最好另启线程,

void middle_ware_lowlevel(){

    while(1) {

        get_lowlevel_data();
        set_data_to_main_thread();
    }
}

6、中间件多采用状态机处理,方便简单

void process_event() {

    switch(state) {

        case state1:
            // add your code
            break;

        case state2:
            // add your code
            break;

        case state3:
            // add your code
            break;

        default:
            break;
    }
}

7、如果需要定时器,直接使用os提供的接口即可,比如

void timer_callback() {

    get_register_data();
    send_data_to_main_thread();
}

    当然编写中间件的方法多种多样,大家可以根据实际场景灵活应用。关键是要做好对外的接口输出、对外的接口输入以及中间件本身的状态切换,相信做好这几点代码质量差不到哪去。