- Tehtävän poistaminen FreeRTOS Arduinossa
- Mikä on jono FreeRTOSissa?
- Jonon luominen FreeRTOS: ssa
- Piirikaavio
- FreeRTOS-jonon käyttöönotto Arduino IDE: ssä
Edellisessä opetusohjelmassa esiteltiin FreeRTOS Arduino Unossa ja luotiin tehtävä vilkkuvalle LEDille. Nyt tässä opetusohjelmassa sukelamme enemmän RTOS-sovellusliittymien etukäteen käsitteisiin ja opimme eri tehtävien välisestä viestinnästä. Täällä opimme myös Queue-ohjelmasta siirtämään tietoja tehtävästä toiseen ja osoittamaan jono-sovellusliittymien toimintaa liittämällä 16x2 LCD: n ja LDR: n Arduino Unoon.
Ennen kuin keskustellaan jonoista, katsotaan vielä yksi FreeRTOS-sovellusliittymä, joka on hyödyllinen tehtävien poistamisessa, kun se on valmis määritettyyn työhön. Joskus tehtävä on poistettava varatun muistin vapauttamiseksi. Edellisen opetusohjelman jatkamiseksi käytämme vTaskDelete () API-toimintoa samassa koodissa yhden tehtävän poistamiseksi. Tehtävä voi poistaa vTaskDelete () -sovellusliittymäfunktion itsensä tai minkä tahansa muun tehtävän poistamiseksi.
Tämän API: n käyttämiseksi sinun on määritettävä FreeRTOSConfig.h- tiedosto. Tätä tiedostoa käytetään räätälöimään FreeRTOS sovelluksen mukaan. Sitä käytetään muuttamaan ajoitusalgoritmeja ja monia muita parametreja. Tiedosto löytyy Arduino-hakemistosta, joka on yleensä saatavana tietokoneen Asiakirjat-kansiossa. Minun tapauksessani se on saatavana \ Documents \ Arduino \ libraries \ FreeRTOS \ src : ssä alla esitetyllä tavalla.
Nyt avata tämän tiedoston millä tahansa tekstieditorilla ja etsi #define INCLUDE_vTaskDelete ja varmista sen arvo on '1' (1 tarkoittaa käyttöön ja 0 tarkoittaa ei käytössä). Se on oletusarvoisesti 1, mutta tarkistaa sen.
Käytämme tätä määritystiedostoa usein seuraavissa opetusohjelmissamme parametrien asettamiseksi.
Katsotaan nyt, kuinka tehtävä poistetaan.
Tehtävän poistaminen FreeRTOS Arduinossa
Tehtävän poistamiseksi meidän on käytettävä vTaskDelete () -sovellusliittymää. Se vie vain yhden argumentin.
vTaskDelete (TaskHandle_t pxTaskToDelete);
pxTaskToDelete: Se on tehtävän kahva, joka on poistettava. Se on sama kuin 6 : nnen argumentti xTaskCreate () API. Edellisessä opetusohjelmassa tämä argumentti on NULL, mutta voit välittää tehtävän sisällön osoitteen millä tahansa nimellä. Sanotaan, jos haluat asettaa tehtävän kahvan Task2: lle, joka on ilmoitettu nimellä
TaskHandle_t mikä tahansa_nimi; Esimerkki: TaskHandle_t xTask2Handle;
Nyt vTaskCreate () API asetettu 6 th väitteen
xTaskCreate (TaskBlink2, "task2", 128, NULL, 1, & xTask2Handle);
Tämän tehtävän sisältöä voi käyttää nyt antamallasi kahvalla.
Tehtävä voi myös poistaa itsensä kulkemalla NULL-arvon kelvollisen tehtäväkahvan sijaan.
Jos haluamme poistaa tehtävän 3 itse tehtävästä 3, sinun on kirjoitettava vTaskDelete (NULL); Task3-toiminnon sisällä, mutta jos haluat poistaa tehtävän 3 tehtävästä 2, kirjoita vTaskDelete (xTask3Handle); task2-toiminnon sisällä.
Jos haluat poistaa tehtävän 2 edellisestä opaskoodista itse tehtävästä2, lisää vain vTaskDelete (NULL); in mitätön TaskBlink2 (void * pvParameters) -toiminto. Sitten yllä oleva toiminto näyttää tältä
void TaskBlink2 (void * pvParameters) { Serial.println ("Tehtävä2 on käynnissä ja poistamassa"); vTaskDelete (NULL); pinMode (7, OUTPUT); kun taas (1) { digitalWrite (7, HIGH); vTaskDelay (300 / portTICK_PERIOD_MS); digitalWrite (7, LOW), vTaskDelay (300 / portTICK_PERIOD_MS); } }
Lataa nyt koodi ja tarkkaile LEDejä ja sarjamonitoria. Näet, että toinen merkkivalo ei vilku nyt ja tehtävä 2 poistetaan poistamisen sovellusliittymän kohdattua.
Joten tätä sovellusliittymää voidaan käyttää lopettamaan tietyn tehtävän suorittaminen.
Aloitetaan nyt jonosta.
Mikä on jono FreeRTOSissa?
Jono on tietorakenne, johon mahtuu rajallinen määrä kiinteäkokoisia elementtejä, ja sitä käytetään FIFO-järjestelmässä (First-in First-out). Jonot tarjoavat tehtävän ja tehtävän välisen, tehtävän keskeyttämisen ja keskeytyksen välisen viestinnän mekanismin.
Jonossa olevien elementtien enimmäismäärää kutsutaan sen "pituudeksi". Sekä kunkin elementin pituus että koko asetetaan jonoa luodessasi.
Esimerkki siitä, kuinka jonoa käytetään tiedonsiirtoon, on kuvattu hyvin FreeRTOS-dokumentaatiossa, joka löytyy täältä. Voit helposti ymmärtää annetun esimerkin.
AYmmärrettyämme jonot yritetään ymmärtää jonon luomisprosessi ja yritetään toteuttaa se FreeRTOS-koodissamme.
Jonon luominen FreeRTOS: ssa
Kuvaile ensin ongelma-ilmoitus, joka on tarkoitus toteuttaa FreeRTOS-jonon ja Arduino Unon avulla.
Haluamme tulostaa LDR-anturin arvon 16 * 2 nestekidenäytölle. Joten nyt on kaksi tehtävää
- Tehtävä1 saa LDR: n analogiarvot.
- Tehtävä 2 tulostaa analogisen arvon LCD-näytölle.
Joten tässä jonossa on roolinsa, koska lähettää tehtävän1 tuottamat tiedot tehtävään2. Tehtävä1: ssä lähetämme analogisen arvon jonoon ja tehtävässä 2 - sen saamme jonosta.
Jonojen kanssa on kolme toimintoa
- Jonon luominen
- Lähetetään tietoja jonoon
- Vastaanotetaan tietoja jonosta
Käytä jonon luomiseen käyttämällä xQueueCreate () -toiminnon sovellusliittymää. Se vaatii kaksi perustelua.
xQueueCreate (UBaseType_t uxQueueLength, UBaseType_t uxItemSize);
uxQueueLength: Luovutettavan jonon enimmäismäärä kerralla.
uxItemSize: Jokaisen jonoon tallennettavan tietoerän koko tavuina.
Jos tämä funktio palauttaa NULL-arvon, jonoa ei luoda riittämättömän muistin vuoksi, ja jos se palauttaa arvon non-NULL-arvon, jono luodaan onnistuneesti. Tallenna tämä palautusarvo muuttujaan, jotta voit käyttää sitä kädensijana jonoon pääsemiseksi alla esitetyllä tavalla.
QueueHandle_t jono1; jono1 = xQueueCreate (4, sizeof (int));
Tämä luo 4-elementtisen jonon int-kokoiseen kasan muistiin (2 tavua kutakin lohkoa) ja tallentaa paluuarvon jonon1 kahvan muuttujaan.
2. Tietojen lähettäminen jonoon FreeRTOS: ssa
Arvojen lähettämiseksi jonoon FreeRTOS: lla on tähän tarkoitukseen kaksi sovellusliittymän muunnosta.
- xQueueSendToBack (): Käytetään tietojen lähettämiseen jonon takaosaan.
- xQueueSendToFront (): Käytetään tietojen lähettämiseen jonon etuosaan (päähän).
Nyt , xQueueSend () vastaa, ja täsmälleen sama kuin, xQueueSendToBack ().
Kaikissa näissä sovellusliittymissä on 3 argumenttia.
xQueueSendToBack (QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait);
xQueue: Jonon kahva, jolle tietoja lähetetään (kirjoitetaan). Tämä muuttuja on sama kuin xQueueCreate-sovellusliittymän palautusarvon tallentamiseen.
pvItemToQueue: Osoitin jonoon kopioitaville tiedoille.
xTicksToWait: Tehtävän tulisi olla enimmillään Estetty-tilassa odottaakseen tilaa jonossa.
XTicksToWaitin asettaminen portMAX_DELAY : lle aiheuttaa tehtävän odottamisen loputtomiin (ilman aikakatkaisua), edellyttäen että INCLUDE_vTaskSuspend on asetettu arvoon 1 FreeRTOSConfig.h: ssä. Muuten voit käyttää makroa pdMS_TO_TICKS () muuntaa millisekunteina määritetyn ajan ruutuissa määritettyyn aikaan.
3. Tietojen vastaanottaminen jonosta FreeRTOS: ssa
Kohteen vastaanottamiseksi jonosta jonosta käytetään xQueueReceive () -ominaisuutta. Vastaanotettu kohde poistetaan jonosta.
Tässä sovellusliittymässä on myös kolme argumenttia.
xQueueReceive (QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait);
Ensimmäinen ja kolmas argumentti ovat samat kuin API: n lähettäminen. Vain toinen väite on erilainen.
const pvBuffer: Osoitin muistiin, johon vastaanotetut tiedot kopioidaan.
Toivottavasti ymmärrät kolme API: ta. Nyt toteutamme nämä sovellusliittymät Arduino IDE: ssä ja yritämme ratkaista yllä kuvatun ongelman.
Piirikaavio
Näin se näyttää leipälaudalla:
FreeRTOS-jonon käyttöönotto Arduino IDE: ssä
Aloitetaan koodin kirjoittaminen sovelluksellemme.
1. Avaa ensin Arduino IDE ja sisällytä Arduino_FreeRTOS.h- otsikkotiedosto. Jos nyt käytetään jotain ytimen objektia, kuten jonoa, sisällytä sen otsikkotiedosto. Koska käytämme 16 * 2 LCD-näyttöä, sisällytä siihen myös kirjasto.
# sisällyttää # sisällytä
2. Alusta jonon kahva jonon sisällön tallentamiseksi. Alusta myös LCD-nastanumerot.
QueueHandle_t queue_1; LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
3. Alusta tyhjässä asetuksessa () alustamalla LCD-näyttö ja sarjamittari 9600 baudinopeudella. Luo jono ja kaksi tehtävää vastaavien sovellusliittymien avulla. Tässä luodaan jono, jonka koko on 4 kokonaislukutyypillä. Luo tehtävä, jolla on samat prioriteetit ja yritä myöhemmin pelata tällä numerolla. Käynnistä lopuksi ajastin alla olevan kuvan mukaisesti.
void setup () { Sarja.alku (9600); lcd.begin (16, 2); jono_1 = xQueueCreate (4, sizeof (int)); if (jono_1 == NULL) { Serial.println ("Jonoa ei voida luoda"); } xTaskCreate (TaskDisplay, "Display_task", 128, NULL, 1, NULL); xTaskCreate (TaskLDR, "LDR_task", 128, NULL, 1, NULL); vTaskStartScheduler (); }
4. Tee nyt kaksi toimintoa TaskDisplay ja TaskLDR . In TaskLDR toiminto, lukea analoginen pin A0 muuttuja kuten olemme LDR kytketty A0 pin Arduino UNO. Lähetä nyt muuttujaan tallennettu arvo siirtämällä se xQueueSend- sovellusliittymään ja lähetä tehtävä estotilaan 1 sekunnin kuluttua käyttämällä vTaskDelay () -sovellusliittymää alla esitetyllä tavalla.
void TaskLDR (void * pvParameters) { int current_intensity; kun (1) { Serial.println ("Tehtävä1"); current_intensity = analogRead (A0); Serial.println (nykyinen_intensiteetti); xQueueSend (jono_1, & current_intensity, portMAX_DELAY); vTaskDelay (1000 / portTICK_PERIOD_MS); } }
5. Tee samalla tavalla TaskDisplay-funktio ja vastaanota arvot muuttujassa, joka välitetään xQueueReceive- funktiolle. Lisäksi xQueueReceive () palauttaa pdPASS, jos tiedot voidaan vastaanottaa onnistuneesti jonosta ja palauttaa errQUEUE_EMPTY, jos jono on tyhjä.
Näytä arvot nyt nestekidenäytölle käyttämällä lcd.print () -toimintoa.
void TaskDisplay (void * pvParameters) { int-intensiteetti = 0; kun (1) { Serial.println ("Tehtävä2"); if (xQueueReceive (jono_1, & intensiteetti, portMAX_DELAY) == pdPASS) { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Intensiteetti:"); lcd.setCursor (11, 0); lcd.print (intensiteetti); } } }
Se siitä. Olemme päättäneet jonon käyttöönoton koodausosan. Täydellinen koodi toimivalla videolla löytyy lopussa.
Liitä nyt LCD-näyttö ja LDR Arduino UNO -laitteeseen koodin latauspiirin mukaisesti. Avaa sarjamonitori ja tarkkaile tehtäviä. Näet tehtävien vaihtuvan ja LDR-arvot muuttuvat valon voimakkuuden mukaan.
HUOMAUTUS: FreeRTOS-ydin ei tue suurinta osaa eri antureille tehdyistä kirjastoista viivästystoiminnon toteuttamisen vuoksi kirjastoissa. Viive saa CPU: n pysähtymään kokonaan, joten myös FreeRTOS-ydin lakkaa toimimasta, eikä koodi enää toteudu ja se alkaa toimia väärin. Joten meidän on tehtävä kirjastoista viiveettömiä toimimaan FreeRTOS: n kanssa.