wirebed是基于任务的组件框架。任务之间是依靠信号(signal)和槽(slot)连接。信号/槽用于代替回调函数。
信号(signal)和槽(slot)相对任务来讲,都是普通的static函数,信号与槽在任务内部可以当做普通的函数使用。
命名回调函数
有明确的回调函数名称,使用全局函数,在编译时确定调用关系。
extern void doSomethingCallback();
void doRun()
{
//....
doSometingCallback();
//...
}
注册回调函数
提供一个注册接口,可以在运行时绑定回调函数。
typedef void (*callback_t)();
callback_t callback = 0;
void registerCallback(callback_t proc)
{
callback = proc;
}
void doRun()
{
//....
if(callback)
{
callback();
}
//...
}
信号/槽 函数
任务A中定义信号
/**********************************************************************
** task signal define **
**********************************************************************/
void sigLedOn()
{
//Task A default signal
}
任务B中定义槽
/**********************************************************************
** task slot define **
**********************************************************************/
void sloLedOn()
{
//task B slot
}
任务C中定义槽
/**********************************************************************
** task slot define **
**********************************************************************/
void sloLedOn()
{
//task C slot
}
任务A中调用信号时sigLedOn,有三种情况出现
1. 没有连接,sigLedOn的代码为
static void sigLedOn(void)
{
//Task A default signal
}
2. A与B连接时,sigLedOn的代码为
static void sigLedOn(void)
{
__wb_m1_sloLedOn(); // TASK B的槽
}
3.A与B,C都连接时候,sigLedOn的代码为
static void sigLedOn(void)
{
__wb_m1_sloLedOn(); //task B slot
__wb_m2_sloLedOn(); //task C slot
}
说明:wirebed 任务之间是依靠信号/槽连接。但是任务和BSP层之间还是传统的回调函数技术。