【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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();
}
当然编写中间件的方法多种多样,大家可以根据实际场景灵活应用。关键是要做好对外的接口输出、对外的接口输入以及中间件本身的状态切换,相信做好这几点代码质量差不到哪去。