C 阻塞代码的替代方案
正在尝试对一个小项目使用mbed OS调度程序 由于mbed操作系统是异步的,我需要避免阻塞代码 但是,我的无线接收器库使用了以下阻塞线: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.
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
回调时,您可以尝试减少周期和容差。谢谢,我现在正在使用这种方法,只需要对周期和容差进行一些实验,以获得正确的系统响应。