Arduino

HeliOS voor Arduino

HeliOS voor Arduino
De microcontrollers van een Arduino gebruiken één enkel programma om alle schakelaars, LED's en andere delen van het systeem te besturen. Het eerste programma dat een Arduino-gebruiker leert, is meestal het 'Blink'-programma, dat de vertragingsfunctie gebruikt om een ​​LED in een gelijkmatig patroon aan en uit te zetten. Dit eenvoudige programma kan worden uitgebreid om veel dingen te doen, maar het kan geen multitasking bevatten.

Voor meer geavanceerde projecten moet u waarden wijzigen en gegevens in realtime lezen, wat niet mogelijk is met de standaard vertragingsfunctie in Arduino. Daarom is een andere oplossing nodig. Gelukkig kan HeliOS helpen.

De beperkingen van Arduino

Zoals vermeld in de inleiding kan de standaardtaal van een Arduino op vele manieren worden toegepast. Er is echter een probleem: de Arduino kan niet multitasken. U kunt bijvoorbeeld niet drie verschillende LED's instellen om met onafhankelijke intervallen te knipperen. Deze taak kan niet worden uitgevoerd omdat, als u vertraging gebruikt, de LED met de langste vertraging het knipperen van de andere LED's blokkeert tijdens het wachten om van status te wisselen.

Standaard polling is ook lastig, omdat het controleren van de status van een knop vereist dat er een actie wordt ondernomen. In een standaard Arduino moet je een functie instellen om de status van een schakelaar of een andere status te pollen.

Hoewel er oplossingen zijn om deze problemen aan te pakken (bijv.g., hardware-interrupts, de millis-functie, de FreeRTOS-implementatie), maar deze oplossingen hebben ook beperkingen. Om de problemen van deze oplossingen te overwinnen, heeft Mannie Peterson HeliOS uitgevonden. HeliOS is klein en efficiënt, en het kan zelfs op 8-bits controllers draaien.

Overweeg de onderstaande code, die op zijn best onbetrouwbaar is omdat de vertragingsverklaring zal voorkomen dat de knop wordt aangevinkt.

int-knopPin = 2; // het nummer van de drukknoppin
int ledPin = 4; // het nummer van de LED-pin
// variabelen zullen veranderen:
int knopState = 0; // variabele voor het lezen van de drukknopstatus
ongeldige setup()
// initialiseer de LED-pin als output:
pinMode (ledPin, UITGANG);
pinMode (LED_BUILTIN, UITGANG);
// initialiseer de drukknoppin als invoer:
pinMode (knopPin, INPUT);

lege lus()
// lees de status van de drukknopwaarde:
buttonState = digitalRead (buttonPin);
// controleer of de drukknop is ingedrukt. Als dit het geval is, is de buttonState HOOG:
if (buttonState == HOOG)
digitalWrite (ledPin, HOOG); // zet LED aan
anders
digitalWrite (ledPin, LAAG); // zet LED uit

digitalWrite (LED_BUILTIN, HOOG); // zet de LED aan (HOOG is het spanningsniveau)
vertraging (1000); // wacht even
digitalWrite (LED_BUILTIN, LAAG); // schakel de LED uit door de spanning LAAG te maken
vertraging (1000); // wacht even

Wanneer u deze code uitvoert, ziet u dat de 'ledPin' normaal knippert. Als u echter op de knop drukt, gaat deze niet branden, of als dat wel het geval is, wordt de knippervolgorde vertraagd. Om dit programma te laten werken, kunt u overschakelen naar andere vertragingsmethoden; HeliOS biedt echter een alternatief.

Linux ingebed op Arduino (HeliOS)

Ondanks het "OS" in zijn naam, is HeliOS geen besturingssysteem: het is een bibliotheek met multitasking-functies. Het implementeert echter wel 21 functieaanroepen die complexe besturingstaken kunnen vereenvoudigen simplify. Voor realtime taken moet het systeem externe informatie verwerken zodra deze wordt ontvangen. Om dit te doen, moet het systeem kunnen multitasken.

Er kunnen verschillende strategieën worden gebruikt om realtime taken uit te voeren: gebeurtenisgestuurde strategieën, runtime gebalanceerde strategieën en strategieën voor taakmeldingen. Met HeliOS kunt u elk van deze strategieën gebruiken met functieaanroepen.

Net als FreeRTOS verbetert HeliOS de multitasking-mogelijkheden van controllers. Ontwikkelaars die een complex project van cruciaal belang plannen, moeten echter FreeRTOS of iets dergelijks gebruiken, omdat HeliOS bedoeld is voor gebruik door enthousiastelingen en hobbyisten die de kracht van multitasking willen ontdekken.

HeliOS installeren

Bij gebruik van de Arduino-bibliotheken kunnen nieuwe bibliotheken worden geïnstalleerd met de IDE. Voor versies 1.3.5 en hoger, kies je voor het gebruik van de bibliotheekmanager.


U kunt ook een zipbestand van de webpagina downloaden en dat bestand gebruiken om HeliOS te installeren.


Houd er rekening mee dat u HeliOS in uw code moet opnemen voordat u het kunt gebruiken.

Voorbeeld

De onderstaande code kan worden gebruikt om een ​​LED één keer per seconde te laten knipperen. Hoewel we HeliOS-code hebben toegevoegd, is het uiteindelijke effect hetzelfde als dat van de inleidende tutorial.

Het belangrijkste verschil hier is dat je een taak moet maken. Deze taak wordt in een wachtstand geplaatst en er wordt een timer ingesteld om de taak te vertellen wanneer deze moet worden uitgevoerd. Bovendien bevat de lus slechts één instructie: xHeliOSLoop(). Deze lus voert alle code uit die is gedefinieerd in de setup() van de code. Wanneer u uw code plant, moet u alle pinnen, constanten en functies in de bovenste instelling instellen.

#include
// Gebruikt om de status van de LED op te slaan
vluchtige int ledStat = 0;
vluchtige int buttonState = 0;
const int knopPin = 2;
const int ledPin = 4;
// Definieer een knippertaak
void taakBlink(xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LAAG);
ledStatus = 0;
anders
digitalWrite (LED_BUILTIN, HOOG);
ledStatus = 1;



// Definieer een knop leestaak
void buttonRead(xTaskId id_)
buttonState = digitalRead (buttonPin);
// controleer of de drukknop is ingedrukt. Als dit het geval is, is de buttonState HOOG:
if (buttonState == HOOG)
// zet LED aan:
digitalWrite (ledPin, HOOG);
anders
// schakel LED uit:
digitalWrite (ledPin, LAAG);


ongeldige setup()
// id houdt taken bij
xTaskId-id = 0;
// Dit initialiseert de Helios-gegevensstructuren
xHeliOSSetup();
pinMode (LED_BUILTIN, UITGANG);
pinMode (ledPin, UITGANG);
// initialiseer de drukknoppin als invoer:
pinMode (knopPin, INPUT);
// Voeg toe en laat taak Blink wachten
id = xTaskAdd("TASKBLINK", &taskBlink);
xTaskWait(id);
// Timer-interval voor 'id'
xTaskSetTimer(id, 1000000);
id = xTaskAdd("BUTTON", &buttonRead);
xTaskStart(id);

lege lus()
//Dit, en alleen dit, is altijd in de lus bij het gebruik van Helios
xHeliosLoop();

Met deze code kun je de LED programmeren om op elk moment te knipperen zonder dat je je zorgen hoeft te maken dat de Arduino wordt vertraagd.

Conclusie

Dit project is geweldig voor mensen die nog niet bekend zijn met Arduino, omdat je de reguliere Arduino-code kunt gebruiken om realtime taken uit te voeren. De methode die in dit artikel wordt beschreven, is echter alleen voor hobbyisten en onderzoekers. Voor serieuzere projecten zijn andere methoden nodig.

Linkermuisknop werkt niet op Windows 10
Als u een speciale muis gebruikt met uw laptop of desktopcomputer, maar de linkermuisknop werkt niet not op Windows 10/8/7 om wat voor reden dan ook, ...
Cursor springt of beweegt willekeurig tijdens het typen in Windows 10
Als u merkt dat uw muiscursor vanzelf springt of beweegt, automatisch, willekeurig tijdens het typen op een Windows-laptop of -computer, dan kunnen en...
De scrollrichting van de muis en touchpads omkeren in Windows 10
Muis en Touchpads maken computergebruik niet alleen eenvoudig, maar ook efficiënter en minder tijdrovend. We kunnen ons een leven zonder deze apparate...