【问题标题】:Alternative to blocking code阻塞代码的替代方案
【发布时间】:2016-03-02 21:59:03
【问题描述】:

尝试将 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));
}

【问题讨论】:

  • 线程和回调?

标签: c blocking nonblocking mbed


【解决方案1】:

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

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

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

【讨论】:

  • 我目前正在使用它,不幸的是这意味着它不会接收每条消息
  • 在这种情况下,我会尝试使用while(wireless.isRxData()) 而不是if (wireless.isRxData())。此外,您可以在发布listen 回调时尝试减少您的周期和容忍度。
  • 谢谢,我现在正在使用这种方法,只需要对周期和容差进行一些试验,以使系统的响应能力正确。
【解决方案2】:

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

【讨论】:

  • 你的意思是用 if 语句而不是 while 循环来轮询它吗?因此,如果数据可用,则睡眠。那么还有回调吗?
  • @UniqueName- 保留 while 循环,只需在其中添加一些东西,在短时间内放弃对 CPU 的控制。在某些操作系统上,您可以使用 while (!isRxData()) { usleep(10); } 之类的东西来做到这一点。
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多