阻止代码的替代方案

时间:2016-03-02 21:59:04

标签: c blocking nonblocking mbed

尝试将mbed OS调度程序用于小型项目。

由于mbed os是Asynchronous,我需要避免阻塞代码。

然而,我的无线接收器的库使用阻塞线:

while (!(wireless.isRxData()));

是否有另一种方法可以在收到消息之前阻止所有代码?

static void listen(void) {
    wireless.quickRxSetup(channel, addr1);
    sprintf(ackData,"Ack data \r\n");
    wireless.acknowledgeData(ackData, strlen(ackData), 1);
    while (!(wireless.isRxData()));
    len = wireless.getRxData(msg);  
}

static void motor(void) {
    pc.printf("Motor\n");
    m.speed(1);
    n.speed(1);
    led1 = 1;
    wait(0.5);
    m.speed(0);
    n.speed(0);
}

static void sendData() {
    wireless.quickTxSetup(channel, addr1);
    strcpy(accelData, "Robot");
    wireless.transmitData(accelData ,strlen(accelData));
}

void app_start(int, char**) { 
    minar::Scheduler::postCallback(listen).period(minar::milliseconds(500)).tolerance(minar::milliseconds(1000));   
    minar::Scheduler::postCallback(motor).period(minar::milliseconds(500));
    minar::Scheduler::postCallback(sendData).period(minar::milliseconds(500)).delay(minar::milliseconds(3000));
}

2 个答案:

答案 0 :(得分:1)

您应该删除while (!(wireless.isRxData()));功能中的listen循环。替换为:

if (wireless.isRxData()) {
    len = wireless.getRxData(msg);
    // Process data
}

然后,您可以在if语句中处理数据,或者可以在另一个将进行处理的函数上调用postCallback

答案 1 :(得分:0)

在数据可用之前,您需要轮询数据,而不是循环。如果RX数据不可用,请退出该功能并将定时器设置为在短暂间隔后关闭。当计时器熄灭时,再次检查数据。重复,直到数据可用。我不熟悉您的操作系统,因此我无法提供任何特定代码。这可能就像在while循环中添加一个简短的“睡眠”调用一样简单,或者可能涉及从调度程序创建另一个回调。