wirebed 任务就是一个有限状态机(FSM),状态之间转换需要事件触发。
wirebed 任务事件特性
- 事件是任务内部可见,其他任务之间或者BSP不能触发事件
- 1个任务最多32个事件
- 事件编号小具有更高优先级别
wirebed任务事件定义
在wirebed code view视图中,直接定义事件。事件本质上是定义一个以evt命名的函数,比如
void evtTimeout()
{
}
void evtTaskPoll()
{
}
说明1:事件定义函数没有返回值,而且函数体为空。wirebed软件会自动生成事件定义代码。
说明2:先定义的事件,有更高优先级。evtTimeout 比 evtTaskPoll 有更高优先级。
wirebed任务事件触发
wirebed事件是任务内部可见,所以只能在任务内部调用。事件触发就是一个普通函数的调用。
说明:任务内定义全局函数或者槽函数调用事件触发,实现任务间接调用。
比如任务内部定时器超时,触发evtTimeout事件。
/**********************************************************************
** task timer service (auto generate)**
**********************************************************************/
static void __wb_timer_service(void)
{
evtTimeout();
//restart timer or not
}
wirebed任务事件转换
在 transition view 视图,任务根据事件进行状态转移。
事件转换生成C代码为
/**********************************************************************
** state <state0> event <evtTimeout> handler **
**********************************************************************/
static void __wb_event_state0_evtTimeout(void)
{
//add your code here
}
一个完整的事件处理还应包括 离开状态的exit action 和 进入状态的 exit action。