1. aprila, 2019

Obvladovanje kompleksnosti ugnezdenih sistemov

microchip 300x74 - Obvladovanje kompleksnosti ugnezdenih sistemovMicrochip Technology Inc
Avtor: Lucio Di Jasi
2019_273_41

Nabor različnih modelov Raspberry Pi je bil v februarju 2017 razširjen z Raspberry Pi ZeroW, ki je pravi mali osebni računalnik z brezžično povezljivostjo za samo 10$. V kako čudoviti dobi živimo, občutek imam, da smo sredi raja za ljubiteljske elektronike, za tiste, ki neprestano nekaj ustvarjajo in načrtujejo, za hekerje in seveda tudi za tiste med nami, ki jim je načrtovanje pravih elektronskih izdelkov vsakodnevno opravilo!

Ko sem pred kratkim gledal video predstavitev Ebena Uptona, pa se nisem mogel izogniti spominom na svoja mlada leta. Takrat, to je bilo sredi 80-ih let prejšnjega stoletja, si seveda nisem mogel privoščiti BBC-jevega računalnika, slavne Amige, sem pa, priznam, ves svoj denar porabil za nakup Sinclairjevega ZX Spectruma. Zdaj boste najbrž razumeli, da sem bil popolnoma uglašen z Ebenovimi prizadevanji, da bi bilo računalništvo res “dostopno za vse”.

273 41 01 300x152 - Obvladovanje kompleksnosti ugnezdenih sistemov

Slika 1: Programski sklad ugnezdene aplikacije

Navdušen sem tudi nad novim rekordom, ki ga je dosegel ta zmogljiv osebni računalnik, stisnjen na majhno tiskano vezje velikosti 6×3 cm. Ob tem sem razmišljal tudi o tem, da sem se pogosto spraševal, če me ni ravno skromnost Spectrum-a skupaj z njegovimi številnimi omejitvami naučila, da kopljem globoko v osrčje delovanja naprav in da sem se zaljubil v ta nenavadni svet, ki se nahaja na meji med programsko in strojno opremo in ki ga danes imenujemo ugnezdeni sistemi.

Mali sistemi na čipu
Konstrukcija Raspberry Pi Zero temelji na sistemu na čipu (SoC, System on Chip) BCM2835, v katerem je 1GHz ARM® procesno jedro, grafična procesna enota (GPU), video vmesnik, več serijskih vmesnikov (USB, UART, SPI, I2C) in zunanji pomnilniški vmesnik za upravljanje potrebnega delovnega pomnilnika RAM (512 MB DDR2) in pomnilnika za trajno shranjevanje (SD kartica) in nalaganje operacijskega sistema Linux® (OS) in podatkov. To so impresivne zmožnosti za napravo z enim samim čipom, še posebej v primerjavi s prejšnjimi generacijami osebnih računalnikov, ki so bili del moje mladosti. Mirno lahko tudi rečemo, da so njihove končne zmogljivosti nesorazmerno skromne celo v primerjavi z množico najnovejših majhnih mikrokontrolerjev, ki se danes običajno uporabljajo v vseh vrstah ugnezdenih krmilnih aplikacij. Res je sicer, da sta hitrost njihovega delovnega takta in s tem procesorska moč precej nižji (nekje med 10 in 100 MHz), so pa vsi ti mali mikrokontrolerji že sami po sebi pravi mali čudežni sistemi na čipu.

Kot bi pričakovali za mikrokontroler, sta ves RAM in Flash pomnilnik že prisotna na čipu. Na voljo je več oblik vmesnikov za serijsko komunikacijo (USB, UART, SPI in I2C), vgrajena pa so tudi vsa vezja za regulacijo napajanja in celoten nadzor napetosti. Običajno je tudi to, da na čipu najdemo tudi pet ali še več različnih (natančnih) oscilatorjev, ki omogočajo še večjo fleksibilnost in upravljanje s porabo energije. Obstaja tudi veliko analognih perifernih naprav (ADC, DAC, operacijski ojačevalniki, analogni primerjalniki…) z vhodno-izhodnimi multiplekserji v podporo modernim video zmogljivostim Raspberry Pi, kar odraža očitne spremembe v oblikovalskih odločitvah, ki so vse bolj naklonjene ugnezdenim kot popolnoma računalniškim rešitvam.

Najbrž ni presenetljivo, da v primerih, ko uporabniki Raspberry Pi potrebujejo nek vmesnik za povezavo z resničnim svetom, ki presega zmožnosti enostavnih V/I aplikacij (na primer utripanje LED), manjši mikrokontrolerji (najpogosteje 8-bitni) dejansko pomenijo podporo v obliki »klobukov«, malih hčerinskih ploščic, ki zagotavljajo potrebne V/I vmesnike in potrebne prilagoditve napetostnih nivojev med njimi.

Ne bom nadaljeval te nepoštene primerjave med dvema svetovoma, ki sta si tako zelo različna, vendar moram poudariti, da obstajata dva skupna cilja, ko gre za podporo razvijalcem: kompleksnost obdržati v razumnih okvirih, a po možnosti kljub temu pritegniti nove uporabnike. Ni treba posebej poudarjati, da so njihove rešitve podobne, vendar na koncu vseeno različne.

Obe platformi imata bogato ponudbo brezplačnih programskih orodij, vključno z integriranimi razvojnimi okolji (IDE), prevajalniki, povezovalci, simulatorji, razhroščevalniki (po želji na voljo v profesionalnih izdajah za minimalno ceno), bolj ali manj odprt operacijski sistem (RT-) OS in vsaj osnovno možnost izbire opcij glede strojne opreme na plošči.

Razlike med tema dvema stranema, ugnezdenimi sistemi in običajnimi računalniki pa so manjše, kot si morda mislite. Oboji se opirajo na podobne, če ne kar identične verige orodij, ki so večinoma zasnovane na GNU. Na ravni vmesne programske opreme (OS) so možnosti odprte kode spet zelo podobne, ko vam uspe opraviti s spodnjo plastjo gonilnika. Na ravni operacijskega sistema je razlika največja, saj bodo številni mikrokontrolerji z veseljem izvajali RTOS, vendar ne bodo mogli nositi celotne teže OS Linux. Izvajanje v realnem času pa je sicer ena izmed običajnih nalog OS.

Naraščanje kompleksnosti
Ko pogledamo dokumentacijo, je visoka stopnja kompleksnosti očitna na obeh straneh. Eden od mojih najljubših primerov je primer majhnega in skromnega mikrokrmilnika, ki temelji na priljubljeni 8-bitni arhitekturi PIC®. PIC16F1619 se pogosto uporablja za krmiljenje majhnih naprav in v ta namen ima vgrajen relativno skromen Flash programski pomnilnik (16KB), nahaja pa se v majhnem ohišju z dvajsetimi priključki skupaj s še ducat digitalnih perifernih vmesnikov in skoraj enakim številom analognih podpornih modulov. Dokumentacija obsega 650 strani, če zraven ne štejemo grafov, tabel in podatkov z zvezi s karakteristikami.

273 41 02 300x201 - Obvladovanje kompleksnosti ugnezdenih sistemov

Slika 2: Primer konfiguratorja kode v MPLAB-u: možnosti nastavitev za merilnik signala

Za nekatere periferne naprave, ki so nam na voljo na tem majhnem SoC-u (kot je na primer merilnik za merjenje signalov), je potrebnih tudi do 50 strani, da so ustrezno dokumentirane. To je skoraj dvakrat več strani, kot jih je potrebnih za opis vgrajenega procesnega jedra PIC in celotnega nabora programskih inštrukcij.

Na strani RaspberryPi je situacija podobna, vendar s to razliko, da je zajetnost dokumentacije sorazmerno povečana (10x!), saj je treba upoštevati vso tehnično dokumentacijo, ki pojasnjuje vsak posamezni del vgrajene strojne opreme, komponente sistemov na čipu (SoC periferija, GPU, jedro), pri čemer samo dokumentacija za procesno jedro obsega več kot 750 strani.

Arhitektura ugnezdene programske opreme
Kot je najbrž že očitno, ne moremo od nikogar pričakovati, da bi prebral in ob tem tudi dojel delovanje česarkoli ob tako velikih količinah informacij. Razvijalci ugnezdenih aplikacij se vedno znajdejo pod neprestanim pritiskom, da zagotovijo delujoče aplikacije v vedno krajših časovnih okvirih v večnem skrajševanju časa do njihovega trženja. Njihova najpogostejša rešitev je razdelitev aplikacije v večplastno arhitekturo in uporaba standardiziranih perifernih knjižnic za obvladovanje podrobnosti strojne opreme. Plasti so lahko predstavljene kot sklad, kjer se “aplikacija” (HAL) nahaja čisto na vrhu. Pravzaprav je mogoče to sliko še dodatno izpopolniti tako, da identificiramo pravi HAL in nad njo sloj z vmesno programsko opremo, ki poskrbi za izvajanje skupnih storitev, funkcij, kot so delovanje v omrežju, delo z datotečnim sistemom in grafičnim uporabniškim vmesnikom, če so v aplikaciji prisotne oziroma zahtevane.

Opomba: Sklad ima velikokrat še več plasti, ki nastanejo ob ločevanju plasti gonilnika in plasti za podporo ploščici iz HAL-a, vendar podrobnosti te plasti za nadaljevanje našega razmišljanja v tem članku niso pomembne.

Opisana arhitektura programske opreme je izpeljana neposredno iz »računalniškega« sveta in čisto dobro deluje za modeliranje bolj splošnih primerov, žal pa ima pri načrtovanju ugnezdenih aplikacij dve zelo pomembni pomanjkljivosti:

  • Večplastna arhitektura poenostavlja problem s preobsežno dokumentacijo, vendar le na splošno, dokler je poudarek res le na standardnih funkcijah, ki jih nudi zgornja middleware plast. Za spodnji del spektra aplikacije, kjer je sloj vmesne programske opreme zelo tanek (če sploh obstaja), je v večini primerov značilna neke vrste zamegljenost. Razvijalec se mora zanašati na dokumentacijo HAL v obliki velikega uporabniškega programskega vmesnika (API), prav tako podprtega z ogromno dokumentacije, ki lahko v nekaterih primerih obsega tudi po več tisoč strani, kljub temu pa pravzaprav nikoli ne spozna nobenih posebnih lastnosti vgrajene naprave. Znajde se v hudih škripcih, ko pri delu z njimi naleti na težave, zato se je prisiljen potopiti globoko v neznane vode zajetnega kupa programske kode.
  • HAL plast sicer nudi izjemno pomoč pri podpori standardnih storitev vmesne programske opreme, vendar zaradi svoje robustne narave ne omogoča izkoriščanje edinstvenih značilnosti določene naprave, ki bi sicer lahko zagotavljale tehnično prednost določeni aplikaciji in bi morda lahko bile razlog za izbiro točno določenega modela naprave.
  • Na zgornji strani spektra aplikacij, kjer je sloj vmesne programske opreme zelo debel, kot je na primer RaspberryPi, samo operacijski sistem Linux doda na milijone vrstic programske kode. Čeprav lahko brez dvoma trdimo, da je to odprta izvorna koda, v njem za povprečnega razvijalca ni nekega udobja in vsakdo upa, da mu “tam spodaj” vendarle nikoli ne bo treba razkopavati.

Naj stroj dela tisto, kar mu najbolj uspeva!
Sčasoma bodo razvijalci Raspberry Pi lahko računali na velike dobičke, ki jih prinaša njegova »računalniška« zmogljivost in bogati viri, ki jih ponujajo te plošče, priročnost standardnega operacijskega sistema Linux pa bo več kot nadomestila zapletenost in razsipnost API-ja.
Resnično pa me skrbi za nove majhne SoC razvijalce, sodobne uporabnike mikrokontrolerjev. Zanje je delo s standardiziranim HAL-om veliko manj primerno, saj pri tem nastanejo omejitve pri uporabi posameznih naprav, ker so vse njihove edinstvene značilnosti s plastno arhitekturo programske opreme nedostopne.
Pameten izhod iz te zagate predstavlja nova generacija programskih orodij za hiter razvoj. To je nov razred generatorjev programske kode ali konfiguratorjev, ki so se nedavno pojavili na trgu ugnezdenega krmiljenja. Kljub precejšni (upravičeni) začetni skeptičnosti, so se ta orodja odlično izkazala, ne le kot učinkovita, temveč tudi kot nujno potrebna za vsakega resnega razvijalca ugnezdenih aplikacij.

Med njihovimi glavnimi značilnostmi lahko najdemo:

  • Popolna integracija v priljubljene IDE-je, zaradi česar so del konteksta projekta: izbira modela (njegova številka) in ustreznih knjižnic za vmesno programsko opremo.
  • Podpora za edinstvene in kompleksne periferne enote. Če vzamemo na primer merilnik časa (SMT), ki je omenjen v prejšnjem primeru, je lahko uporabniku vizualno predstavljen na eni sami strani oziroma pogovornem oknu, ki vsebuje le nekaj seznamov, potrditvenih polj in nekaj intuitivnih opcij. Na sliki 2 lahko vidimo posnetek zaslona konfiguratorja MPLAB®Code (MCC) 4, vodilno orodje za hiter razvoj s PIC mikrokontrolerji podjetja Microchip Technology, Inc.
  • Uporaba generatorja predlog, ki skrbi za prevajanje konfiguracijskega izbora v manjše število popolnoma prilagojenih funkcij. To pomeni, da je ustvarjen zgolj minimalno zasnovan API z le nekaj funkcijami, ki jih je treba do potankosti spoznati in z doslednimi in intuitivnimi konvencijami poimenovanja. Funkcija prilagajanja uporabniku zagotavlja, da se večina strojne abstrakcije izvede statično med (dejansko pa pred) prevajanjem kode. S tem se zmanjša seznam zahtevanih oziroma posredovanih parametrov za vsako posamezno funkcij, hkrati pa se poveča učinkovitost in zgoščenost programske kode. Kot primer tipične varčnosti konfiguratorja kode MPLAB si lahko ogledate njegov izpis (Izpis 1).
  • Izhod iz prevajalnika je programska koda, sestavljena iz množice kratkih izvornih datotek v programskem jeziku C, ki jih lahko uporabnik pregleda v celoti, s čimer se mu ponuja možnost učenja, hkrati pa jih lahko strokovnjaki tudi dodatno optimizirajo. Sodobni generatorji programske kode so sposobni združevati svojo in uporabniško programsko kodo s takšno prilagodljivostjo, ki ohranja integriteto in omogoča popolno izkoriščanje dragocenih naprednih strojnih funkcij naprav.

V bistvu konfiguratorji oziroma generatorji programske kode poskrbijo, da od naprav dobimo tisto, kar njihovi tvorci ponujajo kot prednost, najboljše v kategoriji podobnih izdelkov. Ponavljajoče se napake in napačen postopek konfiguracije strojne opreme periferne naprave, gradnja HAL-a, ki pogosto zahteva ogromno ur brskanja po obsežni dokumentaciji s podatki, praktično izginejo ali pa postanejo znatno krajši in v resnici postanejo prijetne in intelektualno spodbudne minute odkrivanja in ustvarjanja.

Pravzaprav lahko iz istega uporabniškega vmesnika uporabniki spoznajo posebne periferne zmogljivosti strojne opreme, kar v bistvu odpravi (ali vsaj močno zmanjša) potrebo po iskanju teh informacij v tehnični dokumentaciji.

Stopnja abstrakcije strojne opreme je prilagodljiv del projekta in se v praksi lahko pogosto in hitro na novo ustvari, s čimer se optimizira zmogljivost aplikacije.

V desetih vrsticah (binarne) kode
Ko je za konfiguracijo perifernih naprav poskrbljeno, so naše misli osvobojene in se lahko takoj osredotočijo na aplikacijo, inteligentnejši del celotne zasnove na aplikacijski plasti, kar pa je tista pomembna podrobnost, ki se nahaja v “glavni zanki”, v nasprotju s tem, kar se nahaja pred njo.

Zahvaljujoč generatorjem programske kode, celo tu, v svetu ugnezdenih stvari, obstaja klasični primer »Hello World«, ki je za uporabo v digitalnem svetu “preveden” v utripajočo LED, postane prijetna osvežitev z dvema vrsticama programske kode!

LED_Toggle();
__delay_ms(500);

Izpis 2: Le dve vrstici kode moramo napisati za svoj prvi ugnezdeni »Hello World«

V moji nedavno objavljeni knjigi »V 10 vrsticah kode« lahko najdete dvajset praktičnih primerov uporabe hitrih razvojnih orodij, v katerih lahko dosežemo podobno učinkovitost.

Zmanjšanje kompleksnosti
Medtem, ko majhni mikrokontrolerji preraščajo v majhne SoC-e in se osebni računalniki čudežno stisnejo na velikost Raspberry Pi, ne gre le za izgubljeni čas ali obremenitev ob raziskovanju in spoznavanju posameznih podrobnosti, ampak tudi za ranljivost, ki je neizbežna, kadar delamo na sistemih, ki jih ne razumemo popolnoma.

Vendar pa na srečo kompleksnost ni neizogibna posledica tehnološkega napredka. Sodobni konfiguratorji oziroma generatorji programske kode nam lahko pomagajo pri procesu razvoja programske opreme, avtomatizirajo naše ukaze in omogočajo njihovo obnovitev v hitro rastočem številu razpoložljivih možnosti in funkcij.

Povezave

O avtorju
Lucio Di Jasio je vodja poslovnega razvoja pri podjetju Microchip Technology Inc. Zadnjih 18 let pokriva različna tehnična in marketinška področja znotraj 8, 16 in 32-bitnih produktnih linijah podjetja. Lucio je objavil številne članke in knjige o programiranju za ugnezdene krmilne aplikacije. Ima veliko strast do letenja in pridobljeni licenci zasebnega pilota FAA in EASA. Več o Luciovih najnovejših knjigah in projektih lahko preberete na njegovem blogu na spletnem naslovu: http://blog.flyingpic24.com

Opomba: Ime in logotip Microchip sta registrirani blagovni znamki podjetja Microchip Technology Incorporated v ZDA in drugih državah. Vse druge blagovne znamke, ki so morda tu omenjene, so last njihovih podjetij.

www.microchip.com
Tags: