Véges állapotú gépek, hogyan lehet programozni szűk keresztmetszetek nélkül

Hello mindenkinek, a nevem Vladimir Vasziljev vagyok, és itt készen állok egy új cikk megírására, amelyet siettem veled, kedves olvasók.

Véges állapotú gépek, hogyan lehet programozni szűk keresztmetszetek nélkül

Ma beszélünk automatikus eszközökről, de egyáltalán nem azokról, akik az orosz hadsereg katonái kezében vannak. Ez egy ilyen érdekes programozási mikrokontroller stílusról szól, mint az automatikus programozás. Pontosabban, ez nem egy programozási stílus, hanem egy egész koncepció, amelynek köszönhetően a mikrokontroller programozója nagyban megkönnyítheti életét. Ennek köszönhetően a programozó számára sok feladatot megoldani sokkal könnyebb és könnyebb, a programozó mentése a fejfájástól. Egyébként az automatikus programozást gyakran SWITCH-technológianak hívják.

Szeretném tudomásul venni, hogy az írást ezen a poszton írták Vladimir Tatarchevsky SWITCH technológiájának cikkei. A cikkek ciklusát "Az SWITCH-technológia alkalmazása a mikrokontrollerek alkalmazás szoftverének fejlesztésében" nevezik, ezért ebben a cikkben leginkább a munkakód és annak leírását fogom megmutatni.

By the way, már terveztek számos cikket szentelt programozás, melyben részletesen megvizsgálom az AVR mikrokontrollerek programozási technikáit, ne hagyd ki ... Hát menjünk!

Mielőtt foglalkoznánk az automatikus programozási stílussal, nézzük meg, hogyan működik a program.

A program egymás után végrehajtja a programozó által meghatározott parancsokat. Egy normál számítógépes program esetében tökéletesen normális, hogy a program működjön és leállítsa a végrehajtását, miközben a műveinek eredményeit a monitoron mutatta be.

A mikrokontroller programja nem csak befejezheti végrehajtását. Képzelje el, hogy bekapcsolta a lejátszót vagy a kazettát. Megnyomta a bekapcsológombot, kiválasztotta a kívánt zeneszámot, és élvezte a zenét. Azonban, amikor a zene megtorpant a fül dobhártyáján, a lejátszó lógott, és nem reagált a gombok megnyomásakor, nem beszélve a tambourine-ról.

És mi a baj ezzel? Minden normális - a vezérlő, aki a lejátszó belsejében van, most fejezi be a programot. Itt valami kényelmetlenséget tapasztal, ami kiderül.

Tehát itt azt a következtetést vonjuk le, hogy a mikrokontroller programnak nem kell megállnia. Lényegében végtelen huroknak kell lennie - csak ebben az esetben a mi játékosunk megfelelően működik. Ezután megmutatom Önnek, hogy mi a mikrokontrollerek szoftverkódja, még csak nem is design és néhány programozási stílus.

A stílusok programozása.

"Programozási stílusok" - hangzik valamilyen érthetetlen, de hát igen. Mit jelent ez? Képzeld el, hogy egy személy sohasem programozott, vagyis általában egy teljes vízforraló.

Ez az ember sok könyvet olvasott a programozásról, tanulmányozta a nyelv minden alapvető konstrukcióját. Az információkat kicsit kicsit összegyűjtötték, most már az információhoz való hozzáférés korlátlan. Mindez jó, de mi fog kinézni az első programjai? Úgy tűnik számomra, hogy nem fog filozofizálni, hanem követi az utat az egyszerűtől a komplexig.

Így ezek a stílusok az egyszerű szinttől a komplexabb, de ugyanakkor hatékonyabb lépésekig vezetnek.

Eleinte nem gondoltam a program bármely tervezési jellemzőjére. Csak alakítottam ki a program logikáját - rajzoltam egy folyamatábra és írtam a kódot. Ami folyamatosan átkerült egy rake-on. De ez volt az első alkalom, amikor nem fürödtem és a "egyszerű hurkolás" stílusát használták, majd megszakításokat kezdtem használni, akkor automaták voltak és elmentek ...

1. Egyszerű kerékpározás. A program ebben az esetben ciklikus bölcsesség nélkül, és ennek előnyei és hátrányai vannak. Ráadásul csak a megközelítés egyszerűségében nem kell találgatni a ravasz konstrukciókat, ahogy azt gondolod (fokozatosan ásni magadat sírnak).

A program munkapontja rendben halad. Ebben az esetben minden műveletet, körülményt és ciklust egymás után hajtanak végre. A kód lassulni kezd, sok szükségtelen körülményt kell beillesztenie, ami komplikálja az észlelést.

Mindez nagyon összezavarja a programot, és a kódot a feltételek körülményei közé szorítja. Ennek eredményeképpen ez a kód nem kerül hozzáadásra, így egy monolitikus darab lesz. Természetesen, ha a kötet nem nagy, a kód módosítható, de annál nehezebb.

Ezzel a megközelítéssel több programot írtam, nem voltak nagyok és eléggé mûködõek, de az egyértelmûség sok kívánnivalót hagyott maga után. Új feltétel hozzáadása. Meg kellett lapolnom az összes kódot, mert minden kötve volt. Ez sok hibát és fejfájást okozott. A fordító a lehető legrövidebb ideig átkozódott, egy ilyen program hibakeresése pokolra változott.

Részben a végtelen fékezési ciklus megszakadhat megszakításokkal. A megszakítások segítenek kitörni az ördögi körtől, nem hagyhat ki egy fontos eseményt, további funkciókat (időzítők, külső megszakítások).

Tegyük fel, hogy lezárhatja a gombok feldolgozását, vagy nyomon követheti a fontos eseményt. Ennek eredményeként a program intuitívabbá válik, de ugyanolyan bonyolult.

Sajnos a megszakítás nem ment meg attól a rendetlenségtől, hogy a program bekapcsolódott. Nem lehet megosztani azt, ami egyetlen egész.

3. Automatikus programozás.

Így jutunk el a cikk fő témájához. A véges állapotú gépek programozása elkerüli a programot az első két példából eredő hátrányoktól. A program könnyebbé válik, könnyen módosítható.

Az automata stílusban írt program hasonló a kapcsolóhoz, amely a feltételektől függően egy vagy másik állapotra vált. Azok az államok száma, melyeket a programozó kezdetben tudja.

Véges állapotú gépek, hogyan lehet programozni szűk keresztmetszetek nélkül

Nyers nézetben ez olyan, mint egy fénykapcsoló. Két állapot van be és ki, és a két feltétel be- és kikapcsol. Nos, mindent rendben.

A multitasking megvalósítása a kapcsoló technológiában.

A mikrokontroller képes kezelni a terhelést, a villogó LED-eket, a nyomkövetési billentyűleütéseket és még sok más. De hogyan kell mindezt egyszerre csinálni. A probléma megoldásához számos megoldás létezik. Ezek közül a legegyszerűbb a megszakítások használata.

A program folyamán, amikor megszakítás történik, a vezérlő figyelmen kívül hagyja a programkód végrehajtását, és röviden végrehajt egy másik programrészt, amelyre a megszakítás reagál. A megszakítás működni fog, akkor a program működési pontja folytatódik az adott helyről. ahonnan a vezérlőt félbeszakította (maga a szó jelzi, hogy a vezérlő megszakad).

A multitasking megvalósításának másik módja az operációs rendszerek használata. Igen, valójában már elkezdtek megjelenni a kis méretű AO-k, amelyeket kis teljesítményű vezérlőn lehet használni. De gyakran ez a módszer kissé felesleges. Végül is, miért költenek a szabályozói erőforrások felesleges munkáját, ha kis vért kaphatnak.

A kapcsolási technológiában írt programokban a multitasking ilyen "illúzióját" egy üzenetküldő rendszeren keresztül lehet elérni. Írtam egy "illúziót", mert tényleg van, mert a program nem tudja fizikailag végrehajtani a kód különböző részeit egyidejűleg. Beszélek többet az üzenetkezelő rendszerről.

Üzenetváltási rendszer.

Az üzenetküldő rendszerrel számos folyamatot elpusztíthat és a multitasking illúzióját hozhatja létre.

Tegyük fel, hogy szükségünk van egy olyan programra, amelyen a LED be van kapcsolva. Itt van két automata, nevezzük őket LEDON - automatikusan felelős a LED és az automaton LEDOFF - a LED-ek kikapcsolásáért felelős automatánál.

Mindegyik gépnek két állapota van, azaz a gép lehet aktív állapotban és inaktív állapotban, mivel a kapcsoló be vagy ki van kapcsolva.

Amikor egy gép be van kapcsolva, a LED világít, ha aktiválta a másik LED kialszik. Vegyünk egy kis példát:

A 3-7. Sorokban különböző inicializációk vannak, ezért most nem különösebben érdekli. De a következő történik: mielőtt futtatná a fő hurkot (míg (1)), üzenetet küldünk az automata számára

felelős a LED világításáért. E kis lépés nélkül a szervünk nem fog működni. Ezután a fő végtelen hurok, miközben a fő feladat.

Az üzenetnek három állapota van. Az üzenet állapota tehát lehet inaktív, beállítva, de inaktív és aktív állapotban van.

Kiderül, hogy az üzenet kezdetben inaktív volt, amikor elküldtük az üzenetet, megkapta a "be van állítva, de inaktív" állapotot. És ez adja a következőket. A program szekvenálása során a LEDON készülék nem kap üzenetet. A LEDON üres iterációja van, amikor az üzenet egyszerűen nem érhető el. Mivel az üzenet "telepített, de inaktív" állapotú, a program folytatja a végrehajtását.

Miután minden gép üresjáratban van, a sor eléri a ProcessMessages () függvényt. Ez a funkció mindig a hurok végére kerül, miután az automaták összes iterációja végrehajtásra került. A ProcessMessages () függvény egyszerűen lefordítja az üzenetet a "telepített, de inaktív" állapotról az "aktív" állapotra.

A helyes üzenetek segítségével szabályozhatjuk a véges állapotú gépek munkamódját, de csak olyan üzeneteket tudunk megtenni.

Talán észrevetted, hogy a program előző példánya példaként idézve nem fog megfelelően működni. A gépek üzeneteket cserélnek, a LED-ek átváltanak, de nem fogjuk látni. Csak egy halványan megvilágított LED fog megjelenni.

Minden, mert nem gondolkodtunk a késedelem megfelelő edzésén. Végül is, nincs elég alternatív on-off LED, a LED-et minden állapotban késleltetni kell, mondjuk egy pillanatra.

Kattintson a nagyításhoz

Elfelejtettem adni ezt a folyamatábra, amikor az időzítő dotikal bizonnyal végre a cselekvés - a világítás a LED vagy semlegesítésére.

1. Írja be az állapotot az üzenet elfogadásával.

2. Ellenõrizzük az idõzítõ / számláló leolvasását, ha finom, akkor végrehajtjuk a keresetet, különben egyszerűen üzenetet küldünk magunknak.

3. Küldje el az üzenetet a következő készülékre.

A következő bejáratnál minden megismétlődik.

SWITCH-technológia programja. Három lépés.

És írjunk egy programot a véges állapotú gépekben, és ehhez csak három egyszerű lépést kell tennünk. A program egyszerű lesz, de egyszerű dolgokkal érdemes elkezdeni. Egy programot használunk kapcsoló LED-del. Ez egy nagyon jó példa, ezért nem találunk semmi újat.

Program leszek a C nyelvet, de ez nem jelenti azt, hogy az állami gép kell csak írj a C, lehetőség van bármilyen más programozási nyelv.

A program moduláris lesz számunkra, ezért több fájlra oszlik. A modulok a következők lesznek:

  • A fő programciklus modulja tartalmazza a leds_blink.c, HAL.c, HAL.h fájlokat
  • Az időzítő modul a timers.c, timers.h fájlokat tartalmazza
  • Az üzenetfeldolgozó modul tartalmazza a messages.c, messages.h
  • Az 1 automata modul tartalmazza a ledon.c, ledon.h fájlokat
  • A 2 automata modul a ledoff.c fájlokat tartalmazza. ledoff .h

Projekt létrehozása és azonnal csatlakozni hozzá a statikus fájlokat a mi modulok: timers.c, timers.h, messages.c, messages.h.

Ezután írjuk a fő programciklus modulját.

A fő programciklus moduljának leds_blink.c fájljája.

Az első sorokban a többi modul kapcsolódik a főprogramhoz. Itt látjuk, hogy az időzítő modul és az üzenetfeldolgozó modul csatlakozik. Továbbá a program szövegére a túlcsordulás megszakadási vektora van.

Az int main (void) sorból lehet mondani, hogy a főprogram megkezdődik. És kezd mindenben és mindenben. Itt inicializáljuk a perifériákat, vagyis beállítjuk a kezdeti értékeket a komparátor bemeneti portjaihoz és a vezérlő összes többi tartalmához. Mindezt az INIT_PEREF függvény végzi el, itt futtatjuk, bár a fő szerv a hal.c. fájlban van.

Ezután látjuk az időzítők inicializálását. üzenetfeldolgozó modul, automata inicializálása. Itt ezek a funkciók egyszerűen elindulnak, bár a funkciók maguk íródnak a moduljaikban. Látod, milyen kényelmes. A program fő szövege könnyen olvasható, és nem zsúfolt a felesleges kóddal, amelyből az ördög lábát megtörik.

Az alap-inicializálásnak vége van, meg kell kezdeni a fő hurokot. Ehhez küldjön egy indító üzenetet, és indítsa el az órát is - elindítjuk az időzítőt.

És a fő ciklus, ahogy már mondtam, nagyon egyszerűnek tűnik. Minden automata funkcióját lejegyezzük, csak írjuk le egy oszlopba, anélkül, hogy betartanánk a rendelést. Ezek a funkciók automaták kezelői és automata moduljai. Az üzenetfeldolgozó modul lezárja ezt az automa piramist. Ezt természetesen már korábban mondtam, amikor megértettem az üzenetküldés rendszereit. Most már láthatja, hogy a fő programciklus moduljának két fájlja hogyan néz ki

A Hal.h a fő programhurok moduljának fejlécfájlja.

Amint azt észrevetted, ez a fájl alapvetően nem tartalmaz egyetlen végrehajtható kódsorozatot sem - ez mindegyik makro-helyettesítő és csatlakozó könyvtár. A fájl jelenléte egyszerűen egyszerűvé teszi az életet, javítja a láthatóságot.

De a Hal.c fájl már végrehajtható fájl, és amint említettem, a periféria különböző inicializációit tartalmazza.

Nos, a fő programciklus modulja, most megmutattam, hogy meg kell tennünk az utolsó lépést, magunknak is meg kell adnunk a gépek moduljait.

Még mindig nekünk kell írni a véges automaták moduljait, esetünkben a LEDON automatont és a LEDOFF-ot. Először a ledon.c jelzőfényű lámpatest automata programjának szövegét adom meg.

Itt az első sorokban a könyvtárak mindig kapcsolódnak, és változókat deklarálnak. Továbbá olyan funkciókat már elmentünk, amelyekkel már találkoztunk. Ez az InitLEDON gép inicializáló funkciója és maga a ProcessLEDON gépkezelő funkciója.

A kezelő testében az időzítő modul és az üzenetmodul funkciói már feldolgozottak. És a gép logikája a kapcsolószekrény kialakításán alapul. És itt észrevehetjük, hogy a gépkezelő bonyolult is lehet néhány esetkapcsoló hozzáadásával.

A gép fejlécfájlja még könnyebb lesz:

Itt csatlakoztatjuk a hal.h csatoló fájlt, és meghatározzuk a függvény prototípusát is.

A fájl felelős kikapcsolása LED nagyjából ugyanúgy néznek ki, csak egy tükörkép, úgyhogy az, ahol nem jelennek meg - vonakodás

Itt csak három lépés és programunk készen van, és ez azt jelenti, hogy küldetésem véget ér a mai napig, és itt az ideje megállni. Számomra úgy tűnik, hogy az ebben a cikkben megadott információk nagyon hasznosak lesznek az Ön számára. De az igazi előny csak akkor hoz majd, amikor ezt a tudást a gyakorlatban alkalmazza.

Helló Itt vagyok egy teljes vízforraló. Miután többször elolvasta cikkét, belevágva csak a jelentést értette, de hogyan alkalmazza a gyakorlatban, nem értettem. Úgy tűnik, hogy igen, könnyebb írni és világosabban, de a szokásosnál még bonyolultabbnak tűnik. Hol és miért kapcsolódnak a könyvtárak? Mi a különbség a hal.h és a hal.c között, és miért van ilyen nevük?
Ezen a ponton, azt sokkal könnyebben érthető valaki másnak „osztatlan” darab kódot, és tegye meg a szükséges kiigazításokat rám, mint írni egy programot a semmiből. Bár úgy érzem, hogy a tanácsot könnyebb, mint megérteni ... Mi hiányzik nekem megvalósítani az egyszerűség. Valószínűleg az agy. De még mindig köszönöm a munkáját