C 阻塞代码的替代方案

C 阻塞代码的替代方案,c,blocking,nonblocking,mbed,C,Blocking,Nonblocking,Mbed,正在尝试对一个小项目使用mbed OS调度程序 由于mbed操作系统是异步的,我需要避免阻塞代码 但是,我的无线接收器库使用了以下阻塞线: while (!(wireless.isRxData())); 有没有一种替代方法,在收到消息之前不会阻止所有代码 static void listen(void) { wireless.quickRxSetup(channel, addr1); sprintf(ackData,"Ack data \r\n"); wireless.

正在尝试对一个小项目使用mbed OS调度程序

由于mbed操作系统是异步的,我需要避免阻塞代码

但是,我的无线接收器库使用了以下阻塞线:

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));
}

您需要轮询数据,而不是在数据可用之前循环。如果RX数据不可用,退出该功能,并在短时间间隔后将计时器设置为关闭。当计时器熄灭时,再次检查数据。重复此操作,直到数据可用。我不熟悉你的操作系统,所以我不能提供任何具体的代码。这可能很简单,只需在
while
循环中添加一个简短的“sleep”调用,也可能涉及从调度程序创建另一个回调。

您应该删除
while(!(wireless.isRxData())listen
函数中进行code>循环。替换为:

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

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

线程化和回调?您是说用if语句而不是while循环来轮询它吗?因此,如果数据可用,其他人就可以睡觉。然后有另一个回调?@UniqueName-保持while循环,只需在其中添加一些东西,在短时间内放弃对CPU的控制。在某些操作系统上,您可以使用
while(!isRxData()){usleep(10);}
之类的方法来实现这一点。我目前正在使用它,不幸的是,这意味着它不能接收到所有消息。在这种情况下,我会尝试执行
while(wireless.isRxData())
而不是
if(wireless.isRxData())
。另外,在发布
listen
回调时,您可以尝试减少周期和容差。谢谢,我现在正在使用这种方法,只需要对周期和容差进行一些实验,以获得正确的系统响应。