C je prevajalnik, rabimo še kartični računalnik (vir:10), z modulom s štirimi kapacitivnimi tipkami (vir:11). Učilo imenujemo minimalna postavitev delovnega mesta za specializirane učilnice nove mehatronike.
Zanimajo nas osnovni podatki, kot so največja frekvenca klicanja programskih prekinitev in stresanje metod. Slovenska izdaja poda nekaj odgovorov na vprašanja z vajami pod C->GPIO. Poglejmo si nekatere.
C/C++
C (Vir:1) jezik je bil razvit z namenom napisati UNIX. Današnjo obliko je dobil že davnega 1978 in je za SQL drugi naj daljše obdobje veljaven standard. Linus Torvalds (Vir:2) je kot programer v UNIXU v C-ju napisal jedro za Linux in ga odpre za javnost leta 1996. V letih do 2000 so se začeli vsi pomembni projekti, ki danes predstavljajo hrbtenico digitalne revolucije, naj naštejem samo Kodi, Samba, Apache, HostApd, MarijaDB. Na linux jedro moramo pripeti GUI (Graphical user Interface). Izdaje linuxa poznamo ravno po GUI, naj naštejem samo nekatere, Android, Raspbery Pi, Debian, Chromium (pod Windowsi poznan kot Chrome). C program je pozneje dobil manjše dodatke v C++, ki se danes prevaja z istim programom. Prevajalnik je del operacijskega sistema. Glavna prednost C-ja je ogromno odprte kode, ki je brezplačna in na razpolago programerjem za razvoj. Slovenska izdaja (Vir:4) , kot zbirka tehnologij in delujočih vaj, ima od začetka C razdelan do nivoja višjih šol. Tu si bomo pogledali rezultat dela na C-ju med novoletnimi prazniki v luči korona krize. Zanimajo nas naravne omejitve več opravilnega operacijskega sistema in tresenje (jitter) opravil na katerega lahko računamo brez posega(vdora) v sam sistem. Kakor pri Pythonu tudi pri C-ju nastaja knjižnica. Na predstavljenih vajah se že uporablja in se vključi pri prevajanju. Tu bodo zapisane metode bodočega krmilnega jedra, hitrih UDP komunikacij podobno kakor pri Pythonu.
Ta vsebina je samo za naročnike
Raspberry
Male matične plošče (tudi kartični računalniki), in SoC tehnologija predstavljajo samo jedro tehnološke revolucije. Najbolj uporabljana (in prodajana) je matična plošča Raspberry Pi. Takemu uspehu pritiče samostojna izdaja Raspberry Pi OS (Vir:5). Tehnično gledano smo v en čip uspeli združit procesor in grafično kartico. Veliko bolj pomembna tehnološka podrobnost je uporaba CMOS tehnologije. Mejne hitrosti jeder v CMOS tehnologiji so malenkost manjše kakor v starih tehnologijah, zato je pa poraba tudi do 20x manjša. Pri odprti kodi je odprto tudi strojno jedro Cortex-A72 (Vir:6). Značilna je notranja struktura z dvema nivojema delavnega spomina. L1 spomin se skupaj z jedrom vrti na najavljenih hitrostih. Notranja podatkovna povezava je 128/256 bitna (Vir:7). Nisem uspel dobiti zanesljivih podatkov, vendar se omenja L1 64kByte. L2 spomin ima 64 bitno podatkovno vodilo in premore 1Mbyte (Vir:8). V prihodnosti nas čaka še integracija spomina L3 (LPDDR4) v SoC čipe. V zadnji strojni izvedbi jedro utripa že z osupljivimi 1,8GHz (Vir:9) in ima 4Gbyte delavnega pomnilnika. Gre za izpolnjevanje želja po računalniku pod 100€. Tu smo . Tehnologija je zrela ne samo za opremljanje delavnih mest v specializiranih učilnicah nove mehatronike, ampak tudi za zamenjavo starega Windows profesorjevega računalnika.
minimalno.c
Za celoten opis uporabljamo minimalno konfiguracijo učila. Priključimo modul (Vir:9) s štirimi kapacitivnimi tipkami. Program nastavi vse štiri tipke na izhod in izvaja efekt leteče lučke. Efekt se izvaja 50 krat v zanki.
Telo zanke nastavlja vrednosti izhodov t1, t2, t3 in t4. Vgrajene LEDice kažejo stanje na vhodih/izhodih modula. Prižgemo t4 (in ugasnemo t3) in počakamo 50.000µs (50ms). Nato prižgemo t1 (in ugasnemo t4) in počakamo 50.000µs (50ms). Ponovimo isto še za t2 in t3. V telesu zanke čakamo štiri krat po 50ms. Skupaj približno 200ms. Zanko izvajamo 50 krat. Program se izvaja približno 10s. Take so vstopne vaje v svet krmiljenja. So odlične za preverjanje pravilnosti ožičenja.
tike.c
To je še vedno vaja za ogrevanje. Namen je prikaz, kako uporabimo tipko, in kako lahko s pomočjo tipke predčasno zapustimo zanko. Vaja je tudi demonstracija uporabljanega modula in način kako lahko uporabimo poljubno število led ali tipk, če le skupno število ne preseže štiri.
V telo zanke smo dodali del kode, ki v primeru pritiska na tipko t4 izpiše »Konec zaradi t4!!!!« in predčasno konča program. Tu se pojavlja izziv za tiste najboljše raziskovalce. Kako bi lahko neodvisno uporabil štiri LEDice in štiri tipke naenkrat, torej bi bili možni projekti, kjer bi rabili štiri tipke IN štiri LEDice sočasno? Potrudite se z odgovorom na to vprašanje. Ko boste imeli doma (ali v šoli) učilo z minimalno postavitvijo, je to klasična vaja (naloga) . Namig (LEDice signalizirajo stanje 99,9% časa, preostalih 0,1% časa beremo stanje tipk).
PWM.c
Pulzno širinska modulacija (PWM) je dodana vsem pinom. Raspberry ima štiri polne porte po 8 bitov. Skupaj imamo poleg napajanja (GND, 3,3V in 5V) na 40 pinskem GPIO konektorju 32 pinov, s katerimi krmilimo naprave. Na IDE za C/C++ sem dodal gumb Gpio s katerim lahko pogledate nastavitev in trenutno stanje vseh pinov. Od teh 32 pinov (vsi imajo PWM strojno podporo) operacijski sistem Raspberry Pi dovoljuje nastavljanje samo pina 12. Vsi ostali pini imajo PWM izveden programsko. Zato si moramo nastavljanje tega edinega pravega PWM izhoda še posebej skrbno pogledati.
Sistem števcev in delilnikov je pri RPi3 priklopljen na 19,2MHz pri RPi4 pa na 54MHz. Zato bodo projekti pisani za RPi3 in uporabljajo pin12 npr. za uro napravi treba prilagoditi, če uporabite RPI4 ☹.
Označitev pinov je v C/C++ razširjena z imenom PWM. Frekvenca pina 12 je
RPi3 f=19.2MHz/pwmSetClock (2-4095)/pwmSetRange(2-4096)
RPI4 f=54.0MHz/pwmSetClock (2-4095)/pwmSetRange(2-4096)
V bistvu imamo oscilator, katerega frekvenco delimo z dvema delilnikoma. Prvi pwmSetClock je navaden delilnik brez dodatnih funkcij. Drugi pwmSetRange ima dodatno nalogo določati dolžino periode PWM pulza. S pomočjo dodatnega ukaza pwmWrite nastavimo dolžino pulza pina 12. To je prva resnejša omejitev operacijskega sistema, ker ostalih pinov nikakor ne moremo nastaviti na strojno PWM. V praksi to ni velika omejitev, ker PWM izhode rabimo za krmiljenje analognih servo motorjev in kot generator spremenljive enosmerne napetosti. Vse to lahko počnemo programsko v območju do nekako 5kHz z uporabo programskih PWM izhodov. Za vajo lahko pobrskate po spletu in napišete program, ki bo nastavil na PWM ostale pine.
prekinitev.c
Vsi pini imajo možnost proženja strojne prekinitve ob spremembi stanja. Brez nadzora operacijskega sistema so to najhitrejši možni odzivi SoC sistema. Merijo se v ns in stresanjem okoli ns. Vendar če smo v več opravilnem operacijskem sistem, strojna prekinitev sproži program, ki program uvrsti v čakalno vrsto za dodeljevalnik opravil v samem jedru operacijskega sistema. Z nastavljanjem prioritete se , da te čas do neke mere izboljšati, vendar se odzivi merijo v nekaj 100µs ☹, kar je 100.000 počasneje. Dobra novica je, da tudi s takim odzivom pokrijemo veliko tehnoloških zahtev projektov, vseh pa zagotovo ne. V takem primeru pomaga razbitje zaščite in poseg v sam operacijski sistem. S tem se tukaj trenutno ne bomo ukvarjali. Ideja je, da glavni program s krmilnim jedrom poženemo v posebej zanj rezerviranem jedru in, da se prekinitveni programi izvajajo v drugem jedru zopet direktno kot strojni program, brez izgube časa s čakalnimi vrstami. Vse to že obstaja in zahteva poseg v samo jedro operacijskega sistema.
Predstavljeni program utripa t1 (20s). Če pritisnemo t4 se program predčasno zaustavi. Dodatek je nastavitev t3, ki proži prekinitveni program tipka3. Prekinitveni program tipka12 10s utripa t3. Program tudi šteje prekinitve in jih na koncu izpiše. To utripanje je neodvisno in se izvaja v ločenem programi, ki se izvaja brez nadzora glavnega programa. Od tu do niti je samo še korak. Za vajo si poglejte, kako se prožijo niti. Nit je samo malo bolj nadziran program s strani glavnega programa. Nam se že mudi k zadnjemu programu, ki združi PWM in prekinitve.
pwmprekinitev.c
V vaji merimo čas izvajanja programa in nastavimo frekvenco pina 12. Na pin12 nastavimo prekinitve in jih štejemo. Ker imamo izmerjen čas in preštete spremembe stanja pina iz 0 v 1 lahko izračunamo frekvenco pina 12. Ker se nastavljena in izmerjena frekvenca ujemata, je vse v redu. In kaj je tu še zanimivo je največja frekvenca, ki jo sistem še prenese. Vse počnemo samo zaradi tega. Pa si poglejmo. Merimo na RPI4 na 1,5GHz. Tudi ne bom preveč pretiraval, ker v nasprotnem se sistem enostavno sesuje in ga je potrebno ponovno zagnati.
33,33kHz ni slab rezultat. Imamo možnost postaviti krmilno jedro v prekinitveni program na recimo 50µs. Pomagali smo si s prioriteto, ki prekinitveni program postavi v najvišjo 99 prioriteto. Prihodnjič si moramo pogledati še odziv in stresanje v krmilnem jedru. Gre za poseben programski pristop z nadziranim vračanjem nadzora upravljalniku opravil in absolutnim proženjem opravil v krmilnem jedru.
Naslednjič
Razvoj vaj je izredno hiter. Pogledali si bomo meritve hitrosti urejevalnih algoritmov v odvisnosti od dolžine neurejene tabele, pogledali si bomo metode določanja absolutno natančnih izvajanj v krmilnem jedru z malim stresanjem, sledile bodo vaje hitrih UDP komunikacij, nekako v tem vrstnem redu. Ni nujno , da bo vse gotovo do naslednje številke, vsekakor spremljajte na viru 4 in ne pozabite vaje nadgraditi. Za produkcijo pa že delujoče in v pedagoškem procesu preizkušen Python vaje. Python je že leto prvi po izboru uporabnikov. Z enim očesom spremljamo novo tehnologijo docker, ki nadomešča javo. Pač vse v stilu zamiranja tehnologij, ki so plačljive in v lasti multinacionalk. In mi smo tu, da hitro vidimo trende, napišemo vaje in jih ponudimo v šolski sistem .
Viri
- https://www.w3schools.in/c-tutorial/
- https://en.wikipedia.org/wiki/Linus_Torvalds
- https://en.wikipedia.org/wiki/System_on_a_chip
- http://si.raspberryip.com/
- https://www.raspberrypi.org/software/operating-systems/
- https://en.wikipedia.org/wiki/ARM_Cortex-A72
- https://developer.arm.com/documentation/ddi0500/d/level-1-memory-system/about-the-l1-memory-system
- https://developer.arm.com/documentation/ddi0500/d/level-2-memory-system/about-the-l2-memory-system
- https://www.banggood.com/CJMCU-0401-4-bit-Button-Capacitive-Touch-Proximity-Sensor-Module-With-Self-locking-Function-p-1118016.html
- https://www.galagomarket.com/item/display/1862/5377_raspberry-pi_raspberry-pi_raspberry-pi-4-model-b,-2gb
- https://www.banggood.com/CJMCU-0401-4-bit-Button-Capacitive-Touch-Proximity-Sensor-Module-With-Self-locking-Function-p-1118016.html
Avtor:Mag. Boštjan Šuhel
Email:bostjan.suhel@gmail.com
2021/293