一次运行两个功能

时间:2019-02-07 02:33:45

标签: arduino

此程序是一个简单的程序,旨在同时在串行监视器上绘制您的&Uc。 Arduino运行第一个for循环并绘制F1函数,然后对F2执行相同的操作。我的目标是同时绘制它们。

我的想法是实际上要花一小部分时间(比如说10毫秒)来绘制F1,接下来的10毫秒来绘制F2,但是我不知道该如何写下来。我认为millis函数是解决方案,但是我不太确定如何实现它。

=IFERROR(INDEX(L:L, AGGREGATE(15, 7, ROW($1:$99999)/ISNUMBER(SEARCH(A$1, H$1:H$99999)), ROW(1:1))), "")

3 个答案:

答案 0 :(得分:1)

最确定的处理方式是:

for (t = 0; t <= 20; t = t + TE) {
    float Ur = E*exp(-t/Tau);
    float Uc = E*(1-exp(-t/Tau));
    Serial.println (Ur);
    Serial.println (Uc);
}

通常,您可以实现原始资源调度程序:

while (true) {
    task_one();
    task_two();
}

答案 1 :(得分:0)

Thread可用于解决您的问题。它有大量的文档,它是Arduino( unofficial )广泛使用的库。 试试看。

如果您看到这些,对您来说将很容易:

  1. Example - 1(线程实例示例)
  2. Example - 2(回叫示例)
  3. Example - 3(它仍然是越野车,但我认为这会有所帮助)

如果要在没有库的情况下执行此操作,则需要创建两个没有这些循环的函数。像

void f1()
{
  float Ur = E*exp(-t/Tau);
  Serial.println (Ur);
}

void f2()
{
  float Uc = E*(1-exp(-t/Tau));
  Serial.println (Uc);
}

现在,在“ void loop()”内部,您可以实现线程化的基本逻辑,这将很粗糙,但可以满足您的要求。喜欢:

void loop() {
unsigned long now = millis();

static unsigned long last_finger_update;
if (now - last_finger_update >= FINGER_UPDATE_PERIOD) {
    last_finger_update = now;
    f1();
}


static unsigned long last_wrist_update;
if (now - last_wrist_update >= WRIST_UPDATE_PERIOD) {
    last_wrist_update = now;
    f2();
}
}

您必须声明两个变量

const unsigned long FINGER_UPDATE_PERIOD = 1000;
const unsigned long WRIST_UPDATE_PERIOD  = 1000;

所有时间单位均为毫秒。 This strategy是从互联网收集的。

答案 2 :(得分:0)

如果您在MCU中运行RTOS,就可以轻松做到这一点,因为您知道其他解决方案也将是顺序性的...

我一直在使用TridentTD_EasyFreeRTOS库,它具有轻松执行多个任务并在不同的草图文件中对其进行控制的简便方法。