- Kuinka RTOS toimii?
- Usein käytetyt termit RTOS: ssa
- Arduino FreeRTOS -kirjaston asentaminen
- Piirikaavio
- Arduino FreeRTOS -esimerkki - FreeRTOS-tehtävien luominen Arduino IDE: ssä
- FreeRTOS-tehtävän toteutus Arduino IDE: ssä
Upotettujen laitteiden sisällä olevaa käyttöjärjestelmää kutsutaan RTOS: ksi (reaaliaikainen käyttöjärjestelmä). Upotetuissa laitteissa reaaliaikaiset tehtävät ovat kriittisiä, jos ajoituksella on erittäin tärkeä rooli. Reaaliaikaiset tehtävät ovat aikaa määritteleviä, mikä tarkoittaa, että vastausaika mihin tahansa tapahtumaan on aina vakio, jotta voidaan taata, että mikä tahansa tietty tapahtuma tapahtuu tiettynä ajankohtana. RTOS on suunniteltu ajamaan sovelluksia erittäin tarkalla ajoituksella ja korkealla luotettavuudella. RTOS auttaa myös moniajossa yhdellä ytimellä.
Olemme jo käsittäneet opetusohjelman RTOS: n käytöstä sulautetuissa järjestelmissä, joissa voit tietää enemmän RTOS: sta, yleiskäyttöisen käyttöjärjestelmän ja RTOS: n eroista, erityyppisistä RTOS: ista jne.
Tässä opetusohjelmassa aloitamme FreeRTOS: lla. FreeRTOS on sulautettujen laitteiden RTOS-luokka, joka on riittävän pieni käytettäväksi 8/16-bittisissä mikro-ohjaimissa, vaikka sen käyttö ei rajoitu näihin mikro-ohjaimiin. Se on täysin avoimen lähdekoodin ja sen koodi on saatavilla githubissa. Jos tunnemme joitain RTOS: n peruskäsitteitä, FreeRTOS: n käyttö on erittäin helppoa, koska sillä on hyvin dokumentoidut sovellusliittymät, joita voidaan käyttää suoraan koodissa tuntematta koodauksen taustaa. Täydellinen FreeRTOS-dokumentaatio löytyy täältä.
Koska FreeRTOS voi toimia 8-bittisellä MCU: lla, niin se voidaan käyttää myös Arduino Uno -levyllä. Meidän on vain ladattava FreeRTOS-kirjasto ja aloitettava koodin käyttöönotto API: n avulla. Tämä opetusohjelma on tarkoitettu täydelliselle aloittelijalle, alla on aiheita, joita käsittelemme tässä Arduino FreeRTOS -opetusohjelmassa:
- Kuinka RTOS toimii
- Jotkut usein käytetyt termit RTOS: ssa
- FreeRTOS: n asentaminen Arduino IDE: hen
- Kuinka luoda FreeRTOS-tehtävät esimerkiksi
Kuinka RTOS toimii?
Ennen kuin aloitat RTOS-työskentelyn, katsotaanpa mikä on tehtävä. Tehtävä on koodinpätkä, joka on ajoitettavissa suorittimelle suoritettavaksi. Joten, jos haluat suorittaa jonkin tehtävän, se tulisi ajoittaa ytimen viiveellä tai keskeytyksillä. Tämän työn suorittaa ytimessä oleva ajastin. Yhden ytimen prosessorissa ajoitin auttaa tehtäviä suorittamaan tietyllä aikavälillä, mutta näyttää siltä, että eri tehtävät suoritetaan samanaikaisesti. Jokainen tehtävä suoritetaan sille asetetun prioriteetin mukaan.
Katsotaan nyt, mitä tapahtuu RTOS-ytimessä, jos haluamme luoda tehtävän LED-merkkivalolle, joka vilkkuu yhden sekunnin välein, ja asettaa tämä tehtävä etusijalle.
LED-tehtävän lisäksi on vielä yksi tehtävä, jonka ydin on luonut, se tunnetaan tyhjäkäyntitehtävänä. Valmiustila luodaan, kun mitään tehtävää ei ole käytettävissä suoritettavaksi. Tämä tehtävä suoritetaan aina pienimmällä prioriteetilla eli 0 prioriteetilla. Jos analysoimme edellä esitettyä ajoituskaaviota, voidaan nähdä, että suoritus alkaa LED-tehtävällä ja se toimii tietyn ajan, sitten jäljellä olevan ajan, tyhjäkäynnin tehtävä jatkuu, kunnes rasti keskeytyy. Sitten ydin päättää suoritettavan tehtävän tehtävän prioriteetin ja LED-tehtävän kokonaiskulun ajan mukaan. Kun yksi sekunti on valmis, ydin valitsee johtavan tehtävän uudelleen suoritettavaksi, koska sillä on korkeampi prioriteetti kuin tyhjäkäynnillä, voimme myös sanoa, että LED-tehtävä estää tyhjäkäynnin. Jos tehtäviä on enemmän kuin kaksi, joilla on sama prioriteetti, ne suoritetaan pyöreällä tavalla tietyn ajan.
Tilakaavion alapuolella, koska se näyttää ei-käynnissä olevan tehtävän vaihtamisen käynnissä olevaan tilaan.
Jokainen äskettäin luotu tehtävä menee Valmiustilaan (osa ei käynnissä -tilaan). Jos luotu tehtävä (Task1) on tärkein prioriteetti kuin muut tehtävät, se siirtyy käynnissä olevaan tilaan. Jos tämä käynnissä oleva tehtävä estää toisen tehtävän, se palaa takaisin valmiustilaan. Muuten, jos tehtävä 1 on estetty esto-sovellusliittymän avulla, CPU ei ole yhteydessä tähän tehtävään ennen käyttäjän määrittelemää aikakatkaisua.
Jos Tehtävä1 on keskeytetty käynnissä olevassa tilassa Suspend-sovellusliittymien avulla, Tehtävä1 siirtyy Keskeytetty-tilaan, eikä se ole enää ajastimen käytettävissä. Jos jatkat tehtävää1 keskeytetyssä tilassa, se palaa takaisin valmiustilaan, kuten näet lohkokaaviosta.
Tämä on perusajatus siitä, kuinka Tasks suorittaa ja muuttaa tilojaan. Tässä opetusohjelmassa toteutamme kaksi tehtävää Arduino Unossa FreeRTOS-sovellusliittymän avulla.
Usein käytetyt termit RTOS: ssa
1. Tehtävä: Se on koodinpätkä, jonka suorittaminen on ajoitettavissa suorittimelle.
2. Aikataulu: Se vastaa tehtävän valitsemisesta valmiustilaluettelosta käynnissä olevaan tilaan. Aikataulut toteutetaan usein, joten ne pitävät kaikki tietokoneen resurssit varattuina (kuten kuormituksen tasapainottamisessa).
3. Ennakkoratkaisu : Se on jo suoritettavan tehtävän väliaikainen keskeyttäminen tarkoituksella poistaa se käynnissä olevasta tilasta ilman sen yhteistyötä.
4. Kontekstikytkentä: Prioriteettipohjaisessa ennakoinnissa ajoittaja vertaa käynnissä olevien tehtävien prioriteettia valmiiden tehtäväluettelojen prioriteetteihin jokaisessa systick- keskeytyksessä. Jos luettelossa on jokin tehtävä, jonka prioriteetti on korkeampi kuin käynnissä oleva tehtävä, tapahtuu tilannekytkentä. Pohjimmiltaan tässä prosessissa eri tehtävien sisältö tallennetaan niiden pino-muistiin.
5. Aikataulutyyppien tyypit:
- Ennakoiva aikataulutus: Tämän tyyppisessä ajoituksessa tehtävät suoritetaan samalla ajallisella viipaleella prioriteetteja huomioimatta.
- Prioriteettipohjainen ennakoiva: Ensisijainen tehtävä suoritetaan ensin.
- Osuuskunnan ajoitus: Kontekstivaihto tapahtuu vain käynnissä olevien tehtävien yhteistyön yhteydessä. Tehtävä suoritetaan jatkuvasti, kunnes tehtävän tuotto on kutsuttu.
6. Ytimen objektit: Synkronointiprosessia käytetään tehtävän signaloimiseksi jonkin työn suorittamiseksi. Tämän prosessin suorittamiseen käytetään ytimen objekteja. Jotkut ytimen objektit ovat tapahtumia, semaforeja, jonoja, Mutex, postilaatikot jne. Näemme, kuinka näitä objekteja käytetään tulevissa opetusohjelmissa.
Edellä olevasta keskustelusta olemme saaneet joitain perusideoita RTOS-konseptista ja nyt voimme toteuttaa FreeRTOS-projektin Arduinossa. Joten aloitetaan asentamalla FreeRTOS-kirjastot Arduino IDE: hen.
Arduino FreeRTOS -kirjaston asentaminen
1. Avaa Arduino IDE ja siirry kohtaan Luonnos -> Sisällytä kirjasto -> Hallinnoi kirjastoja . Etsi FreeRTOS ja asenna kirjasto alla olevan kuvan mukaisesti.
Voit ladata kirjaston githubista ja lisätä.zip-tiedoston kohdassa Luonnos-> Sisällytä kirjasto -> Lisää.zip- tiedosto.
Käynnistä Arduino IDE uudelleen. Tässä kirjastossa on esimerkkikoodi, joka löytyy myös kohdasta Tiedosto -> Esimerkit -> FreeRTOS, kuten alla on esitetty.
Täällä kirjoitamme koodin tyhjästä ymmärtääksesi toimivan, myöhemmin voit tarkistaa esimerkkikoodit ja käyttää niitä.
Piirikaavio
Alla on piirikaavio vilkkuvan LED-tehtävän luomisesta FreeRTOS: n avulla Arduinolla:
Arduino FreeRTOS -esimerkki - FreeRTOS-tehtävien luominen Arduino IDE: ssä
Katsotaanpa perusrakenne FreeRTOS-projektin kirjoittamiseksi.
1. Lisää ensin Arduino FreeRTOS -otsikkotiedosto nimellä
#sisältää
2. Anna kaikkien niiden toimintojen prototyyppi, jotka kirjoitat suoritettavaksi
void Task1 (void * pvParameters); void Task2 (void * pvParameters); .. ….
3. Luo nyt tehtävät void setup () -toiminnossa ja käynnistä tehtävien ajoitus.
Luomiseen tehtävä, xTaskCreate () API kutsutaan setup toiminto tiettyjen parametrien / argumentteja.
xTaskCreate (TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void * pvParameters, UBaseType_t uxPriority, TaskHandle_t * pxCreatedTask);
On 6 argumenttia, jotka tulisi välittää minkä tahansa tehtävän luomisen yhteydessä. Katsotaanpa, mitä nämä argumentit ovat
- pvTaskCode: Se on yksinkertaisesti osoitin toiminnolle, joka toteuttaa tehtävän (itse asiassa vain funktion nimi).
- pcName: Tehtävän kuvaava nimi. FreeRTOS ei käytä tätä. Se sisältyy puhtaasti virheenkorjausta varten.
- usStackDepth: Jokaisella tehtävällä on oma ainutlaatuinen pino, jonka ydin allokoi tehtävälle, kun tehtävä luodaan. Arvo määrittelee pinon pitämien sanojen lukumäärän, ei tavujen lukumäärän. Esimerkiksi, jos pino on 32 bittiä leveä ja usStackDepth välitetään 100: ksi, tällöin varataan 400 tavua pinotilaa (100 * 4 tavua) RAM-muistissa. Käytä tätä viisaasti, koska Arduino Unolla on vain 2 kt tavua RAM-muistia.
- pvParameters: Tehtävän syöttöparametri (voi olla NULL).
- uxPriority: Tehtävän prioriteetti (0 on alin prioriteetti).
- pxCreatedTask: Sitä voidaan käyttää luomaan tehtävään kahva. Tätä kahvaa voidaan käyttää viittaamaan tehtävään API-kutsuissa, jotka esimerkiksi muuttavat tehtävän prioriteettia tai poistavat tehtävän (voi olla NULL).
Esimerkki tehtävän luomisesta
xTaskCreate (tehtävä1, "tehtävä1", 128, NULL, 1, NULL); xTaskCreate (tehtävä2, "tehtävä2", 128, NULL, 2, NULL);
Task2: lla on korkeampi prioriteetti ja se suorittaa siten ensin.
4. Kun olet luonut tehtävän, käynnistä ajoitin tyhjässä asennuksessa vTaskStartScheduler () -ohjelmalla; API.
5. Void loop () -toiminto pysyy tyhjänä, koska emme halua suorittaa mitään tehtävää manuaalisesti ja loputtomasti. Koska tehtävän suorittamista hoitaa nyt Ajastin.
6. Nyt meidän on toteutettava tehtäväfunktioita ja kirjoitettava logiikka, jonka haluat suorittaa näiden toimintojen sisällä. Funktion nimen on oltava sama kuin xTaskCreate () -sovellusliittymän ensimmäinen argumentti.
void task1 (void * pvParameters) { while (1) { .. ..// logiikkasi } }
7. Suurin osa koodista tarvitsee viivästystoiminnon käynnissä olevan tehtävän pysäyttämiseksi, mutta RTOS: ssa ei suositella viiveen () käyttöä, koska se pysäyttää suorittimen ja siten myös RTOS lakkaa toimimasta. Joten FreeRTOS: lla on ytimen API, joka estää tehtävän tietyn ajan.
vTaskDelay (const TickType_t xTicksToDelay);
Tätä sovellusliittymää voidaan käyttää viivästystarkoituksiin. Tämä sovellusliittymä viivästyttää tehtävää tietylle määrälle punkkeja. Todellinen aika, jona tehtävä pysyy estettynä, riippuu rastiintumisnopeudesta. Vakio portTICK_PERIOD_MS voidaan laskea reaaliaikaisesti punkista korko.
Tämä tarkoittaa, että jos haluat 200 ms viiveen, kirjoita vain tämä rivi
vTaskDelay (200 / portTICK_PERIOD_MS);
Joten tässä opetusohjelmassa käytämme näitä FreeRTOS-sovellusliittymiä kolmen tehtävän toteuttamiseen.
Käytettävät sovellusliittymät:
- xTaskCreate ();
- vTaskStartScheduler ();
- vTaskDelay ();
Tätä opetusohjelmaa varten luotava tehtävä:
- LED vilkkuu digitaalisella nastalla 8 200 ms taajuudella
- LED vilkkuu digitaalisella nastalla 7 300 ms taajuudella
- Tulosta numerot sarjavalvonnassa 500 ms taajuudella.
FreeRTOS-tehtävän toteutus Arduino IDE: ssä
1. Liitä yllä olevaan perusrakenteen selitykseen Arduino FreeRTOS -otsikkotiedosto. Tee sitten toimintoprototyypit. Koska meillä on kolme tehtävää, niin tee kolme toimintoa ja sen prototyypit.
#include void TaskBlink1 (void * pvParameters); void TaskBlink2 (void * pvParameters); void Taskprint (void * pvParameters);
2. Käynnistä void setup () -toiminnossa sarjaliikenne 9600 bitillä sekunnissa ja luo kaikki kolme tehtävää xTaskCreate () -sovellusliittymän avulla. Määritä aluksi kaikkien tehtävien prioriteetit '1' ja käynnistä ajoitin.
void setup () { Sarja.alku (9600); xTaskCreate (TaskBlink1, "Task1", 128, NULL, 1, NULL); xTaskCreate (TaskBlink2, "Task2", 128, NULL, 1, NULL); xTaskCreate (Taskprint, "Tehtävä3", 128, NULL, 1, NULL); vTaskStartScheduler (); }
3. Ota nyt käyttöön kaikki kolme toimintoa alla olevan kuvan 1 mukaisesti tehtävän LED-merkkivalo vilkkuu.
void TaskBlink1 (void * pvParameters) { pinMode (8, OUTPUT); kun taas (1) { digitalWrite (8, HIGH); vTaskDelay (200 / portTICK_PERIOD_MS); digitalWrite (8, LOW); vTaskDelay (200 / portTICK_PERIOD_MS); } }
Vastaavasti toteutetaan TaskBlink2-toiminto. Tehtävä3-funktio kirjoitetaan muodossa
void Taskprint (void * pvParameters) { int laskuri = 0; kun taas (1) { laskuri ++; Serial.println (laskuri); vTaskDelay (500 / portTICK_PERIOD_MS); } }
Se siitä. Olemme onnistuneesti suorittaneet FreeRTOS Arduino -projektin Arduino Unolle. Löydät koko koodin ja videon tämän opetusohjelman lopussa.
Yhdistä lopuksi kaksi LEDiä digitaalisissa nastoissa 7 ja 8, lataa koodi Arduino-levyllesi ja avaa sarjanäyttö. Näet laskurin käynnissä kerran 500 ms: ssä tehtävän nimellä, kuten alla on esitetty.
Huomioi myös LEDit, ne vilkkuvat eri aikaväleillä. Yritä pelata prioriteetin argumentilla xTaskCreate- funktiossa. Muuta numero ja tarkkaile sarjavalvojan ja LEDien toimintaa.
Nyt voit ymmärtää kaksi ensimmäistä esimerkkikoodia, joihin analogiset luku- ja digitaaliset lukutehtävät luodaan. Tällä tavalla voit tehdä enemmän ennakkohankkeita vain Arduino Uno- ja FreeRTOS-sovellusliittymien avulla.