Én a programot költeményhez szoktam hasonlítani. :-D
Az én szempontjaim szerint, az irq kiszolgáló kód legyen rövid.
Hát olajoshal. ;) Kiegészíteném a "rövid" meghatározást: időben rövid. De ez sem egyértelmű.
Ha van egy timer interrupt, akkor célszerű a kódnak lefutnia, mielőtt jön a következő. Ez világos.
DE!
MCU-ra nem mindig operációs rendszert írunk. ;) Ezért - ha van értelme - az interrupt alatt elvégezhető feldolgozásokat is elvégzem. Persze lehet bufferelni, buffer pointert kezelni, buffer fullt kezelni, és ugyanezt megcsinálja a main is, hogy szép és hosszú programot írhassunk. Az van ilyenkor, hogy akár több perifériával is dolgozhatsz, de ebből nem következik, hogy a másik nem várhat. Ilyen elvek mellett roppant egyszerű lesz a kód, hiszen az interrupt (esemény -> akció) egy olyan önálló program, amit általában nem kell mutexekkel körberakni, hiszen önálló program és automatikusan lockolja magát. A futásidő ellenőrzésére szoktam bevetni az analizátort. Bár tudom, hogy rövid gyors programot írok és a processzor is szinte túl gyors, de azért ellenőrzöm.
A C -nek ott lehet előnye, hogy nem kell megtanulni az mnemmonicot...
A kis PIC-nek 35, a nagyobbaknak 76 utasítása van. De hallottam már egy egyszerű feladat kapcsán 2500 java osztályról is. XD
Bizony kihívás!
A 8085-nek 76 utasítása van, az STM8 kb. ez a nagyságrend, csak kicsit ;) több fajta címzésmód és ugrás van. Ha érted a változók hosszát (ezt C-ben is meg kell adni, hogy a fordító ellenőrizhesse), és a memória szerkezetét - ezen is alapulnak a címzés- és adatmódok -, akkor némi gyakorlattal nem fog problémát jelenteni. Bár C program íráskor elveszik az a varázs, hogy akár hülye alultájékozott is lehetsz ;), mert tudod kb. mire fordul egy deklaráció vagy utasítás.
LATAbits.LATA3 ^= 1;
#define LED LATA, LATA3, a (vagy) LED LATA, 3, a
btg LED
A fenti kis példa a ledvillogtató szoftver lelke. ;) Az első sor C. A led a LATA (PORT A latch mód) bit 3-ra van kötve. Az alsó két sor asm. Új szerkezet tervezésekor lemásolom az adatlapot és a lábkiosztásnál jegyzeteket írok, hogy mi hova van kötve. Az adatlapban használt kifejezés a LATA, az asm headerben a bit definíció LATA3. Odakötök egy ledet, és a definiálom a címzésével (a) együtt. A LATAbits egy C definíció, nem találod meg az adatlapban. És ez csak egy egyszerű példa. (A btg utasítás = bit toggle)
Most azon tipródom hogy vissza kéne nyúlom az i2c -hez és megcsinálni az interrupt kezelést.
Most hallom először, hogy interrupt nélkül is lehet. :-D
Itt a koronavírus, ezért (is) nekiálltam ózongenerátort bütykölni. Kell hozzá táp, táp vezérlés és ellenőrzés, hűtőventillátor sebességszabályzással, hőmérő, időzítő, billentyűzet és kijelző. Az utóbbihoz van i2c-lcd1602 modulom, aztán elkezdtem vakargatni a fejemet. Előhúztam egy régebbi rajzot, mert csináltam már hasonlót.
A régi projekt (sajnos bedöglött) négy (autó) kerék helyére szerelt elektrodinamikus fék vezérő központja. Az egész egy hordozható, terepen is használható 1000LE teljesítményű fékpad lett volna.
A központ a négy féket vezérli, adatot gyűjt 4db 5m hosszú i2c interfészen (a fékek 200A 100kHz - szinte zavarmentes ;) meghajtással mennek). Az adatok i2c FRAM-ba kerülnek, illetve soros porton mennek a számítógépre, ahonnan jön vissza a vezérlés. Van ezen kívül néhány nyomógomb, lcd kijelző, a processzor vezérli a tápegységet is. Az utóbbi (és a soros port) kivételével minden i2c.
Ehhez elegendő egy 512 bájt rammal rendelkező processzor. Az i2c-hez rendeltem egy parancs buffert, ahova a parancs elhelyezi az adatokat is. Az i2c meg feldolgozza az interruptok alatt. Az egyes parancsokat token sorozatból állítottam össze. Eleinte nehézkes, de aztán mindent meg lehet vele csinálni- akár a nem std i2c műveleteket is. Egy-egy interrupt egy ugrótáblából és néhány sornyi kódból áll.
Pl. lehet frissíteni a 4 féken csücsülő processzorban a firmware-t i2c-n keresztül. A vezérlő kiadja a frissítés parancsot, a címet és a program blokkot. A kliens besüti a blokkot - és addig nem ad ACK-t - majd (N)ACK-val jelzi, hogy sikeres volt-e. Ez 1db i2c adatsor!
Nnnna, ilyet nem lehet a soros porttá hülyített i2c-vel megcsinálni. (hashtagek: Arduino, twi, rpi, serial_write, stb.)
Az stm8 i2c implemetációja talán az egyik legjobban kidolgozott, amit eddig láttam. (talán működik is) Viszont a megértéséhez természetesen egy PIC adatlapot javaslok. Abban szemléletes impulzusdiagrammokkal minden mozzanatot elmagyaráznak - oda van rajzolva a sok-sok interrupt is. ;)