Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevok: 1 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 17.02.14
Prihlásený: 31.03.24
Príspevky: 450
Témy: 198
Bydlisko: Poprad-okolie
Príspevok NapísalOffline : 06.08.2022 21:56

Framework Wiring (Arduino Core) je veľmi populárny pre rýchly vývoj aplikácii pod mikrokontrolérmi. Najčastejšie v spojitosti s rozhraním Arduino IDE a populárnymi vývojovými kitmi Arduino. Postupom času získali podporu Arduino Core aj iné mikrokontroléry, medzi nimi napríklad ESP32 od Espressif Systems. Arduino Core pre ESP32 funguje ako wrapper pre nízkoúrovňové funkcie C/C++ frameworku ESP-iDF (Espressif IoT Development Framework). To znamená, že sa aplikačnou funkciou zavolá iná nízkoúrovňová funkcia (alebo skupina funkcií), prípadne môže používateľ tvoriť program aj z nízkoúrovňových funkcií.

Ako bolo v niekoľkých predcházajúcich článkoch spomenuté, mikrokontróler ESP32 podporuje aj operačný systém reálneho času FreeRTOS. Operačný systém umožňuje spúšťať podprogramy ako úlohy (tasky), ktoré dokážu bežať nezávisle na sebe. Ide tak o plnohodnotný multitasking (nie pseudo-multitasking ako v prípade Arduino dosiek, ATmega čipov, ktoré nepodporujú FreeRTOS). Práve absencia FreeRTOS pri ATmega mikroprocesoroch mala za následok, že museli byť programy napísané efektívne, aby mikrokontróler dokázal obsluhovať viacero úloh naraz.
Ako spustiť neefektívny program efektívne? - FreeRTOS
Problémy začiatočníkov s návrhom programov
Najmä začiatočníci, ktorí nevedeli navrhnúť program dostatočne efektívne (s využitím knižnice Timer, alebo s časovaním cez millis() ) narážali na problém a potrebu multitaskingu v projektoch, kde sa vyžadovalo napríklad blikanie dvomi LED diódami zároveň, či blikanie LED diódou a obsluhou zberníc, či vykonávania inej úlohy. Ak používateľ blikal diódou a použil konštrukciu s funkciou delay(), bol beh programu zablokovaný po čas vykonávania delayu. Skúsenejší používateľ by delay() nahradil za podmienku s funkciou millis() a porovnaním či je rozdiel medzi starou millis() hodnotou a aktuálnou viac / rovné intervalu v akom mala LED dióda blikať. Obsah podmienky by už bola zmena stavu a znovuuloženie poslednej hodnoty millis().

FreeRTOS však dokáže aj program s blokovacou funkciou delay() spustiť bez toho, aby ovplyvnila dĺžku behu iného podprogramu, ktorý bude taktiež využívať funkciu delay(). Gro celého riešenia je v podpora wrappera, ktorý spustením funkcie delay() zavolá nízkoúrovňovú funkciu vTaskDelay, ktorá pozdrží vykonávanie konkrétneho tasku po určitú dobu a zároveň zavolá funkciu yield(), ktorá jadru procesora umožní pristúpiť k iným taskom, ktoré obsluhuje (dá im prioritu).

Každá úloha môže mať rôznu prioritu, čím sa úloha stáva dôležitejšia pre jadro procesora, ktorému je pridelená. ESP32 má dvojjadrový procesor Xtensa a tak je možné využívať aj oba jadrá procesora súčasne. Core 0 sa nazýva aj jadro protokolu a beží na ňom primárne Bluetooth a WiFi task, avšak jadro zvládne obsluhovať aj použivateľské programy. Core 1 je aplikačné jadro a beží na ňom funkcia loop() - funkcie taktiež ako úloha a toto jadro procesora môže byť využité aj pre ďalšie používateľské podprogramy.

Ukážka efektívneho behu neefektívneho programu vo FreeRTOS:
Čo môže byť lepšia ukážka nezávisleho behu programu pod FreeRTOS ako synchrónne blikanie viacerými LED diódami s funkciou delay()? Pripravil som jednoduchý program, ktorý bliká piatimi LED diódami. Celkovo som vytvoril 5 taskov, každá task bliká jednou LED diódou. Tasky sú vytvorené vo funkcii setup(). Aby LED diódy blikali nepretržite, využil som cyklus while(1) v ktorom bolo nastavenie stavu GPIO a pauza 500 ms cez delay().

Blikanie každej LED diódy je však možné nastaviť na akýkoľvek čas. Jedna dióda môže blikať frekvenciou 10 Hz, iná 1Hz a nebudú sa vzájomne ovlyvňovať aj keď je v jednotlivých úlohách použitá blokovacia funkcia delay(), nakoľko zastaví iba konkrétnu úlohu a nechá procesor obslúžiť ostatné tasky, ktoré bežia na rovnakom jadre. Programová implementácia je veľmi jednoduchá a myslím, že ju zvládnu aj používatelia, ktorí sa s mikrokontrolérmi zoznamujú.

Výhodou je aj to, že program je možné škálovať a rozšíriť o väčší počet LED diód, alebo pridať aj iné funkcionality, napríklad Bluetooth, WiFi komunikáciu v režime klienta / webservera a podobne...
Ako spustiť neefektívny program efektívne? - FreeRTOS
Ako je na obrázku vidieť, všetky tasky súvisiace s blikaním LED diód boli vytvorené na Core 0 a funkcia loop() beží na Core 1, kde je štandardne spustená. Cieľové jadro je možné nastaviť pri vytváraní tasku parametrom 0 / 1, alebo je možné parameter nastaviť na NULL a ESP32 si konkrétne jadro vyberie. V prípade novších ESP32 dosiek iba s jedným jadrom, ktoré je jadrom aplikačným a protokolu zároveň nie je možné nastavovať špecifické jadro.
Ako spustiť neefektívny program efektívne? - FreeRTOS
Program som otestoval v simulátore Wokwi, ktorý plne podporuje najnovšie Arduino Core pre ESP32 - 2.0.3 a je pravidelne aktualizovaný. Treba však podotknúť, že FreeRTOS program je o niečo pomalší ako štandardný program. Aktuálny program sa vykonáva rýchlosťou 24 až 38% reálneho času, nejde tak o real-time simuláciu. Vyskúšajte program s LED diódami a synchrónnym blikaním v simulátore Wokwi (nevyžaduje sa registrácia):
https://wokwi.com/projects/334933481929835090

FreeRTOS má mnoho vychytávok, s ktorými prichádzajú do kontaktu najmä skúsenejší používatelia. Ide najmä o podmienené spúšťanie a vykonávanie taskov cez FIFO buffer Queue. V jednom z prechádzajúcich článkov som implementoval Queue pre inter-task komunikáciu a podmienené vykonávanie tasku pre prenos údajov na vzdialené webové rozhranie po odmeraní dát senzorom HC-SR04 / JSN-SR04T. Pre zdieľaný prístup taskov ku globálnej premennej sa využíva Semafór (Mutex), o tejto metóde možno nabudúce v rozšírenom článku.

Ukážka Queue v Arduino Core pre ESP32 v projekte Hladinomer pre HTTP komunikáciu:
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/HTTP/RTOS_ESP32_Arduino/RTOS_ESP32_Arduino.ino

Ukážka Queue v Arduino Core pre ESP32 v projekte Hladinomer pre HTTPS komunikáciu (využíva Root CA certifikát pre SSL spojenie s webserverom):
https://github.com/martinius96/hladinomer-studna-scripty/blob/master/examples/Hladinomer/HTTPS/RTOS_ESP32_Arduino/RTOS_ESP32_Arduino.ino


Odpovedať na tému [ Príspevok: 1 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Ako spustiť daný program?

v Počítačové hry

15

565

23.10.2015 13:43

brmbo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako spustit dosovsky program pod XP?

v Operačné systémy Microsoft

1

499

10.11.2008 7:32

Jaro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Spustit program ako admin cez cmd

v Operačné systémy Microsoft

1

599

14.10.2014 15:52

majky358 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako spustit program z Visual Basicu na inom pocitaci?

v Delphi, Visual Basic

4

991

28.02.2010 4:39

SVD Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako efektívne využiť 24GB SSD v notebooku?

v SSD disky

4

520

05.10.2015 8:48

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Program nejde spustiť

v Assembler, C, C++, Pascal, Java

12

714

13.05.2015 14:37

Misosvk Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. nejde spustit program

v Assembler, C, C++, Pascal, Java

2

711

12.02.2012 9:44

majky358 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Nejde spustit žiadny program

v Sieťové a internetové programy

4

1047

25.09.2010 9:56

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jak spustit jeden program vícekrát?

v Operačné systémy Microsoft

4

615

17.02.2007 0:07

Intelman Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako spustit xmp

v Pamäte

20

1045

01.01.2022 11:53

peter9929 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako spustit recovery?

v Operačné systémy Microsoft

8

4858

10.03.2009 20:33

Matko24 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako spustit Pascal

v Assembler, C, C++, Pascal, Java

3

708

12.02.2012 19:26

F3RY Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. neviete ako spustit?

v Počítačové hry

4

543

06.07.2010 11:06

Semp Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako spustit system

v Operačné systémy Microsoft

13

781

13.08.2011 11:03

skopko33 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako spustiť Ubuntu

v Operačné systémy Unix a Linux

0

492

28.05.2011 0:21

blazej44800 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. FreeBSD - Ako spustiť xserver?

v Operačné systémy Unix a Linux

4

661

25.02.2012 23:12

nBXXL Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra