Az egyik loop()-ban mondjuk delay-jel vársz, vagy web szervert vezérelsz, a másik loop meg közben csinál amit szeretne.
Nem interruptról van szó. A rendszer úgy van kitalálva, hogy amikor nincs adat, vagy delay-en vár, átadja az ESP a vezérlést egy másik feladatnak WiFi-t, vagy mást kezelni. Minket persze semmi sem akadályoz abban, hogy saját feladatot indítsunk, saját loop()-pal. Onnan látni, hogy nem interrupt-os, hogy bárhol végtelen ciklust csinálsz, a másik feladat is megál. Ez háttér feladat inkább, ami akkor hívódik meg, ha a loop() kilép, vagy a rendszer várakozik.
Két loop() esetén azért nem olyan egyszerű az élet, az Arduino nem erre van kitalálva, a delay a loop2()-ben nálam azonnal fagyott.
Igazából miközben web-et szolgálok ki, aközben kellene SPI-vel adatokat fogadnom, erre kellett a cucc. A gond, hogy a web-szerver várt az adatra, eközben az SPI is állt. Dual core-nál (ESP32) egyszerűbb a buli, viszont az ESP8266 is képes limitált párhuzamosságra.
A példaprogramban a loop() a delay-en vár, miközben a loop2() azért írogat ezt azt a képernyőre. Komolyan ne vegyétek a kódot, inkább vicces.
Kód: Egész kijelölése
extern "C" {
#include "user_interface.h"
}
// változók
int loop1Szamlalo = 0;
int loop2Szamlalo = 0;
uint32_t loop2Millis;
// loop2 varázslás
#define LOOP2_PRIORITAS 2
#define LOOP2_ESEMENYSOR_MERET 1
os_timer_t loop2Timer;
os_event_t loop2Esemenysor[LOOP2_ESEMENYSOR_MERET];
void loop2TimerHivas(void *pArg) { // periodikus timer hívás, ami a loop2 feladatot indítgatja
system_os_post(LOOP2_PRIORITAS, 0, 0); // loop2 feladat indítása
}
void loop2Csomagolo(os_event_t *events) {
loop2();
}
// indulás és a 2 párhuzamosan futó loop
void setup() {
Serial.begin(115200);
system_os_task(loop2Csomagolo, LOOP2_PRIORITAS, loop2Esemenysor, LOOP2_ESEMENYSOR_MERET);
os_timer_setfn(&loop2Timer, loop2TimerHivas, NULL);
os_timer_arm(&loop2Timer, 10, true); // minden 10ms után loop2 feladat indul
}
void loop() {
Serial.print("Loop1:");
Serial.println(loop1Szamlalo++);
delay(1000);
}
void loop2() {
if(( millis() - loop2Millis) > 1000 ) {
Serial.print("Loop2:");
Serial.println(loop2Szamlalo++);
loop2Millis = millis();
}
}