1

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

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

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

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

2 回答 2

1

您应该删除函数中的while (!(wireless.isRxData()));循环。listen将其替换为:

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

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

于 2016-03-03T18:28:29.623 回答
0

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

于 2016-03-02T23:27:15.113 回答