睡眠功能但不阻止其他功能和代码

时间:2018-05-03 14:53:40

标签: c++ arduino microcontroller esp8266 arduino-esp8266

我在esp8266模块/微控制器上。我从未用C ++写过。现在我试图在一个文件文件中插入我自己的小“非阻塞”功能。我的功能应该在背景上等待5秒,然后打印一些东西。但是我不想延迟meInit()的整个初始化5秒,应该说是并行“非阻塞”功能。请问这有什么可能吗?

void meInit()
{ 
  if (total > 20) total = 20;
  value = EEPROM.read(1);

  Serial.begin(115200);
  Serial.setTimeout(10);

  loadSettings(true);

  buildMe();

  initFirst();

  //here I need to call "non-blocking" function with no delay and process immediatelly further
  call5sFunct();  

  ...do other functions here immediatelly without 5s delay...
}

void call5sFunct()
{
  Sleep(5000);

  DEBUG_PRINTLN("I am back again");
}

P.S。短样本非常感谢:) thx

2 个答案:

答案 0 :(得分:1)

使用std::thread在其他帖子中启动call5sFunct();,如下所示:

//...
initFirst();

//here I need to call "non-blocking" function with no delay and process immediatelly further
std::thread t1(call5sFunct);
t1.detach();  
...do other functions here immediatelly without 5s delay...

//...

您需要加入#include <thread>

答案 1 :(得分:0)

你根本不能睡觉,而是在循环功能5秒后调用你的功能。像这样(未经测试):

unsigned long start_time = 0;
bool call5sFunct_executed = false;

void meInit()
{ 
  if (total > 20) total = 20;
  value = EEPROM.read(1);

  Serial.begin(115200);
  Serial.setTimeout(10);

  loadSettings(true);

  buildMe();

  initFirst();

  // You cannot call it here, but in loop()
  // call5sFunct();  

  // ...do other functions here immediatelly without 5s delay...
}

void call5sFunct()
{
  DEBUG_PRINTLN("I am back again");
}

void loop()
{
   unsigned long loop_time = millis();
   if (!call5sFunct_executed && (loop_time - start_time >= 5000))
   {
      call5sFunct();
      call5sFunct_executed = true;
   }
   // .... the rest of your loop function ...
}

但是,该模板必须广泛用于编程微控制器。编写像这样的生产代码真的很容易且很容易出错 - 但重要的是要明白这一点。

有许多库可以很容易地在arduino上实现异步操作,隐藏了这种机制。例如,看看TaskScheduler

谷歌的“arduino异步功能”,你会发现很多替代品。