Запустить две функции одновременно - PullRequest
0 голосов
/ 07 февраля 2019

Эта программа представляет собой простую программу, предназначенную для одновременного отображения вашего & Uc на последовательном мониторе.Arduino проходит первый цикл for и строит график функции F1, а затем делает то же самое с F2.Моя цель состоит в том, чтобы построить их оба одновременно.

Моя идея состоит в том, чтобы на самом деле потребовалась небольшая доля времени, скажем, 10 мс, чтобы построить F1, а следующие 10 мс, чтобы построить F2, но я нене знаю, как записать это.Я думаю, что функция миллис является решением, но я не совсем уверен, как ее реализовать.

const short int R = 5000;
const float C = 0.0005;
const float TE = 0.1;
const float Tau = R*C;
const short int E = 5;
float t, Tinit,Tfin;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

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

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

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Наиболее детерминированный способ обработки это просто:

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();
}
0 голосов
/ 07 февраля 2019

Вы можете сделать это легко, если вы запустите RTOS в MCU, поскольку вы знаете, что другие решения также будут последовательными ...

Я использовал библиотеку TridentTD_EasyFreeRTOS, в которой есть простой способ иметь несколько задач и управлять имив разных файлах эскиза ..

0 голосов
/ 07 февраля 2019

Тема может быть использована для решения вашей проблемы.Имеет огромную документацию, широко используется библиотека для Arduino (, неофициальная ).Попробуйте.

Вам будет легко, если вы увидите следующее:

  1. Пример - 1 (пример экземпляра потока)
  2. Пример - 2 (пример обратного вызова)
  3. Пример - 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;

Все единицы времени указаны в миллисекундах. Эта стратегия взята из интернета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...