0
点赞
收藏
分享

微信扫一扫

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


【 声明:版权所有,欢迎转载,请勿用于商业用途。 

    很多时候,我们把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();
}

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

 

举报

相关推荐

0 条评论