一.preface
近期学习QPC框架,其核心之一就是 actvie-object,活动对象的出现是为了解决并发(阻塞、数据竞争)问题。笔者这里做一篇笔记,方便日后回顾。
二.What is "active object"
-
活动对象的组成框架
-
代码如下
点击查看代码
typedef struct Active Active; typedef void (*DispatchHandler)(Active * const me, Event const * const e); //当前处理哪一个活动对象,当前的事件是什么/* Active Object base class */
struct Active {INT8U thread; /* private thread (the unique uC/OS-II task priority), 相当于线程句柄 */OS_EVENT *queue; /* private message queue */DispatchHandler dispatch; /* pointer to the dispatch() function *//* active object data added in subclasses of Active */
};
- 举例---LED活动对象
LED需要一个状态变量来记录LED的状态
点击查看代码
typedef struct Blinke{Active super; //active obj class objbool isLedOn;//private data;
}Blinky;//模块内部使用
static Blinky Blinky_instance;//模块外部使用
Active *const AO_Blinky = &Blinky_inst.super; //保证了私有数据的安全/*event base class*/
typedef struct{Signal sig; /*event signal*//*event parameters added in subclasses of Event*/
}Event;void Blinky_handler(Active *const me, Event *e){switch(e->sig){case TIMEOUT_SIG:if( ((Blinky *)me)->isLedOn == true ) //模块内部可以通过显示类型转换获得私有数据{BSP_ledOff();*((Blinky *)me)->isLedOn = false; }else{BSP_ledOn();*((Blinky *)me)->isLedOn = true; }break;default://error}
}
三. 事件处理函数的状态机实现
点击查看代码
void Blinky_handler(Active *const me, Event *e){static enum{INIT,ON,OFF,} state = INIT;switch(state){case ON:switch(e->sig){}break;case OFF:switch(e->sig){}break;default://error}
}