Osobně mne přijde, že Arduino IDE je největší brzdou možností Arduina. Přesněji řečenou, tou brzdou je návrh knihoven a způsobu programování.
Arduino IDE přímo učí programátory špatným návykům. Nutí je, aby vše programovaly sekvenčně v nekonečných smyčkách. To nejlepší, co nabízí, jsou dotazy na to, zda nějaký modul (např. sériový port) má k dispozici data.
Se základními knihovnami nelze programovat paralelně. A pokud se o to pokusíme, a chceme použít jen vybraná volání, knihovny nám aktivně házejí klacky pod nohy. Například nikde není zdokumentováno, že některé funkce nám přeprogramují časovače. O čekání na změnu stavu pinu v úsporném režimu si můžeme nechat jen zdát.
Takže představa, že třeba pomocí Arduino IDE naprogramujeme program, který čte z teploměru a paralelně posílá předchozí data na displej, je lichá. Když čte teplotu, nemůže obsluhovat displej, a naopak.
Stejně tak třeba nemůžeme řídit krokové motory a přitom posílat data po sériovém portu. Musíme krokové motory nejdřív zastavit, a až pak teprve komunikovat.
A přitom ATMega jsou procesory, které mají časovače, přerušení, úsporné režimy, watchdog…
U nejstarších verzí šel dokonce předpoklad programování v nekonečných smyčkách až do návrhu hardwaru. Byl použit stabilizátor, který měl vysoký minimální proud, a pokud šel procesor do úsporného režimu, stabilizátor nedokázal správně fungovat, a mohlo dojít až ke zničení procesoru.
A to ani nemluvím o pomalosti a velikosti výsledného kódu. Třeba zmíněný přenositelný digitalWrite() je 28× pomalejší, než by mohl být, kdyby byl napsaný s ohledem na rychlost.
To není vysokoúrovňové programování. To je naopak ta nejnižší úroveň, sahající až na hardware.
A má smysl se o to pokoušet:
- Když místo digiralRead() ve smyčce použijeme přerušení, lze snížit příkon čipu tisícinásobně.
- I jednoduché programy fungují s paralelizací lépe. Lze například točit s krokovými motory a přitom číst data z portů, lze posílat data na displej a přitom nepřijít o události na GPIO.
- Když místo počítání ve smyčce použijeme časovač, opět lze snížit příkon čipu tisícinásobně. (Pravda, některé funkce na čekání v Arduino IDE časovač používají. Ovšem vzhledem k tomu, jak špatně je to zdokumentované, a jak široce se tyto funkce používají v jiných knihovnách, tak je to spíš na škodu, protože nikdy nevíte, kdy vám nějaká funkce časovač zresetuje.)
- Možnosti přesně časovat kritické události, bez ohledu na to, v jaké části nekonečné smyčky se udály. Krokové motory budou mít plynulý chod, generátory budou generovat čisté signály, digitální signály budou mít přesné časování atd.
Ono je to kupodivu velice jednoduchý. Jediný problém je, že se začátečník naučí syntaxi C, nekonečnou smyčku v main(), potom nastavovat a číst bity v registrech a nikde nenajde, co hodit mezi to... Přitom tohle zrovna patří k základům, který by měl umět každý jednočipář.
Paralelně běší skoro všechno. I blbej tachometr v autě - hýbe ručičkou při tom počítá kilometry, zobazuje je a světe, div se, komunikuje u toho po CANu... A to vše současně. Dálkový ovládání k telce zvládne blikal LEDkou během čtení klávesnice,... Kde je jednočip, tam je paralelní úloha.