wirebed 任务之信号/槽

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层之间还是传统的回调函数技术。

猜你喜欢

转载自blog.csdn.net/qq20975717/article/details/81110690