Täpsemate projektide jaoks peate muutma väärtusi ja lugema andmeid reaalajas, mis pole Arduino standardse viivituse funktsiooniga võimalik. Seetõttu on vaja teistsugust lahendust. Õnneks saab HeliOS aidata.
Arduino piirangud
Nagu sissejuhatuses mainitud, saab Arduino tavakeelt rakendada mitmel viisil. Siiski on probleem: Arduino ei saa mitut ülesannet täita. Näiteks ei saa te seada kolme erinevat LED-i iseseisva intervalliga vilkuma. Seda ülesannet ei saa täita, sest kui kasutate viivitust, blokeerib pikima viivitusega LED teiste olekute vilkumise, oodates oleku vahetamist.
Ka tavaline küsitlus on tülikas, kuna nupu oleku kontrollimiseks on vaja toimingut teha. Tavalises Arduinos peate seadistama funktsiooni, et küsida lüliti olekut või muud olekut.
Kuigi nende probleemide lahendamiseks on lahendusi (nt.g., riistvara katkestab, millisfunktsioon, FreeRTOS-i juurutamine), kuid nendel lahendustel on ka piirangud. Nende lahenduste probleemidest ülesaamiseks mõtles Mannie Peterson välja HeliOS-i. HeliOS on väike ja tõhus ning see võib töötada isegi 8-bitiste kontrolleritega.
Mõelge allolevale koodile, mis on parimal juhul ebausaldusväärne, kuna viivituse lause takistab nupu kontrollimist.
int nuppPin = 2; // nupu tihvti numberint ledPin = 4; // LED-tihvti number
// muutujad muutuvad:
int buttonState = 0; // muutuja nupu oleku lugemiseks
void setup ()
// lähtestage LED-tihvt väljundina:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// lähtestage sisestusklahvi tihvt:
pinMode (nuppPin, INPUT);
void loop ()
// loe nupu väärtuse olek:
buttonState = digitalRead (buttonPin);
// kontrollige, kas vajutatakse nuppu. Kui see on nii, on buttonState HIGH:
kui (buttonState == KÕRGE)
digitalWrite (ledPin, HIGH); // lülitage LED sisse
muu
digitalWrite (ledPin, LOW); // lülitage LED välja
digitalWrite (LED_BUILTIN, HIGH); // lülitage LED sisse (HIGH on pinge tase)
viivitus (1000); // oota sekund
digitalWrite (LED_BUILTIN, LOW); // lülitage LED välja, muutes pinge LOW
viivitus (1000); // oota sekund
Selle koodi käivitamisel näete, et 'ledPin' vilgub normaalselt. Kui aga nuppu vajutate, ei sütti see või kui see süttib, lükkab see vilkumise järjestuse edasi. Selle programmi toimimiseks võite lülituda teistele viivitusmeetoditele; HeliOS pakub siiski alternatiivi.
Arduinosse (HeliOS) manustatud Linux
Hoolimata oma nime OS-ist, pole HeliOS operatsioonisüsteem: see on mitme ülesande funktsioonide kogu. Kuid see rakendab 21 funktsioonikõnet, mis lihtsustavad keerukaid juhtimisülesandeid. Reaalajas ülesannete täitmiseks peab süsteem välist teavet käsitsema selle vastuvõtmisel. Selleks peab süsteem olema võimeline tegema mitut ülesannet.
Reaalajas toimuvate ülesannete käsitlemiseks saab kasutada mitut strateegiat: sündmustepõhised strateegiad, jooksuaegselt tasakaalustatud strateegiad ja ülesannete teatamise strateegiad. HeliOS-i abil saate funktsiooni väljakutsetega kasutada mõnda neist strateegiatest.
Nagu FreeRTOS, suurendab ka HeliOS kontrollerite multitegumtöötlusvõimalusi. Arendajad, kes kavandavad kriitilise tähtsusega keerukat projekti, peavad kasutama FreeRTOS-i või muud sarnast, sest HeliOS on mõeldud entusiastidele ja harrastajatele, kes soovivad uurida multitegumtöötluse jõudu.
HeliOS-i installimine
Arduino teekide kasutamisel saab IDE-ga installida uusi teeke. Versioonide 1 jaoks.3.5 ja uuemad valite kasutage teegi haldurit.
Teise võimalusena võite veebilehelt alla laadida ZIP-faili ja kasutada seda faili HeliOS-i installimiseks.
Pange tähele, et enne selle kasutamist saate oma koodi lisada HeliOS-i.
Näide
Allolevat koodi saab kasutada LED-i vilkumiseks üks kord sekundis. Kuigi oleme lisanud HeliOS-koodi, on lõpptulemus sama, mis sissejuhatava õpetuse omal.
Peamine erinevus on selles, et peate looma ülesande. See ülesanne viiakse ooteseisundisse ja taimer on määratud ülesandele ütlema, millal käivitada. Lisaks sisaldab tsükkel ainult ühte lauset: xHeliOSLoop (). See silmus käivitab kogu koodi, mis on määratud koodi seadistuses (). Koodi planeerimisel peate ülemisse seadistama kõik tihvtid, konstandid ja funktsioonid.
# kaasata// Kasutatakse LED-i oleku salvestamiseks
lenduv int ledState = 0;
lenduv int nuppState = 0;
const int nuppPin = 2;
const int ledPin = 4;
// Määratlege vilkuv ülesanne
void taskBlink (xTaskId id_)
kui (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
muu
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Määrake nupu lugemise ülesanne
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// kontrollige, kas vajutatakse nuppu. Kui see on nii, on buttonState HIGH:
kui (buttonState == KÕRGE)
// lülitage LED sisse:
digitalWrite (ledPin, HIGH);
muu
// lülitage LED välja:
digitalWrite (ledPin, LOW);
void setup ()
// id jälgib ülesandeid
xTaskId id = 0;
// See lähtestab Heliose andmestruktuure
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// lähtestage sisestusklahvi tihvt:
pinMode (nuppPin, INPUT);
// Lisage ja seejärel oodake taskBlink
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Taimeri intervall ID-le
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("BUTTON", & buttonRead);
xTaskStart (id);
void loop ()
// See ja ainult see on Heliose kasutamisel alati lingis
xHeliosLoop ();
Selle koodi abil saate programmeerida LED-i vilkuma igal ajal, ilma et peaksite muretsema Arduino viivitamise pärast.
Järeldus
See projekt on suurepärane inimestele, kes on Arduino jaoks uued, kuna see võimaldab teil reaalajas toimuvate ülesannete haldamiseks kasutada tavalist Arduino koodi. Kuid käesolevas artiklis kirjeldatud meetod on mõeldud ainult harrastajatele ja teadlastele. Tõsisemate projektide jaoks on vajalikud muud meetodid.