尝试将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));
}
答案 0 :(得分:1)
您应该删除while (!(wireless.isRxData()));
功能中的listen
循环。替换为:
if (wireless.isRxData()) {
len = wireless.getRxData(msg);
// Process data
}
然后,您可以在if语句中处理数据,或者可以在另一个将进行处理的函数上调用postCallback
。
答案 1 :(得分:0)
在数据可用之前,您需要轮询数据,而不是循环。如果RX数据不可用,请退出该功能并将定时器设置为在短暂间隔后关闭。当计时器熄灭时,再次检查数据。重复,直到数据可用。我不熟悉您的操作系统,因此我无法提供任何特定代码。这可能就像在while
循环中添加一个简短的“睡眠”调用一样简单,或者可能涉及从调度程序创建另一个回调。