一.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 obj
bool 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
}
}