Végrehajtása egy véges állapotú gép (állami gép)
Ebben a cikkben a „véges állapotú gép” egy olyan algoritmus, amely lehet egy kis államok száma. „Állam” - egyfajta állapot amely előre meghatározott összefüggés a bemeneti és kimeneti jeleket, és a bemeneti jelek és az azt követő állapotok. Intelligens olvasó figyelmét, hogy az állam gép a cikkben leírt, akkor Lisztes. Lisztes gép - egy véges állapotú gép, ahol a kimenetek funkciói a jelenlegi állapot és a bemeneti, szemben a Moore gép, amelyben kimenetek - a funkció csak állapot. Mindkét esetben a következő állapot - függvénye az aktuális állapot és a bemeneti jel.
Vegyünk egy egyszerű példát egy véges állapotú gép. Képzeld el, hogy fel kell ismerniük a sorozat „//” karaktereket egy szövegből. Az 1. ábra azt mutatja, hogy ez hogyan végezzük egy véges automatát. Első megjelenés perjel nem ad, hanem arra a tényre, hogy a gép átmenetet a második állam. Ha a második állam gép nem egy perjel, akkor visszakerül az első, ahogy kell, 2 egymást követő törtvonal. Ha a második perjel talált, a készülék jelet ad ki „kész”.
Azt javasoljuk, hogy használja a következő megközelítés a fejlődés véges automaták:
- Tudja meg, mi az ügyfél igényeinek.
- Készítsen egy táblázatot az állami átmenet
- Kódolás a „csontváz” egy állapotgép nélkül az áttérés műveleteket.
- Győződjön meg arról, hogy az átmenetek megfelelően működik.
- Keskeny átjárók részleteket.
Vegyünk egy érdekes példa a véges állapotú gép - egy program, amely ellenőrzi a visszahúzás és kiterjesztését futómű. Bár a legtöbb repülőgép ezt az eljárást végzik az elektro-hidraulikus mechanizmus (egyszerűen azért, mert nincs fedélzeti számítógép), egyes esetekben, mint például a pilóta nélküli légi járművek, szükséges kezelhető szoftver ellenőrzés.
Kezdésként nézzük foglalkozik a berendezés. Repülőgép futómű áll egy elülső láb, bal főfutó és a jobb főfutó. Ezek által vezérelt hidraulikus mechanizmussal. Egy hidraulikus motoros szivattyú nyomást fejt ki a hálózati működtető. a szivattyú be- és kikapcsolható szoftveren keresztül. A számítógép helyzetét állítja be a szelep irányába - „lefelé” vagy „fel”, hogy a nyomás növelheti vagy csökkentheti az alváz. Mindegyik futómű van egy végálláskapcsoló: egyikük zárva van, ha a futómű fel van emelve, a másik - ha meg van a „lent” helyzetben. Annak eldöntésére, hogy a repülőgép a földön, a végálláskapcsoló az állvány elülső láb zárt, ha a repülőgép súlya az első gyalog. A kísérleti vezérlő eszköz áll a felső / alsó karon, és az alváz három izzók (mindegyik láb), amely ki van kapcsolva, a zöld fény (pozíció „lefelé”) vagy a piros lámpát ( „átmeneti” helyzet).
És most a fejlődés egy véges állapotú gép. Az első és legnehezebb lépés -, hogy megértsék a valódi ügyfelek elvárásainak. Az egyik előnye a véges állapotú gép, hogy arra kényszeríti a programozó, hogy gondolja át a lehetséges eseteket, és ennek következtében, hogy megkapja az ügyfél az összes szükséges információt. Miért gondolom ez a legnehezebb szakasza? És hányszor adsz egy leírást a probléma, mint ez: Ne nyomja meg a futómű, ha a repülőgép a földön.
Természetesen ez is fontos, de az ügyfél úgy véli, hogy ez az egész véget ér. De mi a helyzet más esetekben? Vajon elég lőni az alváz, amikor a repülőgép elhagyja a földet? Mi van, ha a gépet akkor ugrik a halom a kifutón? Mi van, ha a pilóta a sebességváltót a „fel” idején parkoló, és ennek következtében kezd felszállni? Akár ebben az esetben a felszerelés fel?
Az egyik előnye a gondolkodás szempontjából véges állapotú gép, hogy gyorsan dolgozzon egy állam átmeneti diagram a vetítési ellátás, közvetlenül előtte a vevő, és a folyamat vele. Elfogadott állapot átmenet egy kijelölése „esemény, ami miatt az átmenet” / „kimenő jel eredményeként az átmenet”. Ha fejleszteni csak az, amit az ügyfél az eredetileg kért ( „Ne nyomja meg a futómű, ha a repülőgép a földön”), akkor azt, hogy a gép a 2. ábrán látható.
Kidolgozásakor az állam átmeneti diagram (vagy bármilyen más algoritmus), ne feledje a következőket:
- A számítógépek nagyon gyors képest gépi berendezés
- Gépészmérnök, aki elmagyarázza, hogy mit kell tenni, talán nem tudja, hogy a számítógépek és az algoritmusok is, hogy tudod. És ez is egy pozitív dolog, különben nem lenne szükség!
- Hogyan lesz a programban, ha szünetet a mechanikai vagy elektromos alkatrész?
Állami gép, annak alapján, amit valóban úgy, hogy az ügyfél, a 3. ábrán látható Itt akarjuk kerülni a futómű visszahúzás, amíg ez biztosan nem lesz a levegőben. Erre a célra megnyitása után touchdown váltóhajtómű néhány másodpercig még függőben van. Azt is szeretnénk, hogy válaszoljon a felfutó él a pilóta karját, és nem arra a szintre, ami a problémák elkerülése érdekében, ha valaki hajt a kart, míg a repülőgép a parkolóban. Visszahúzás vagy bővítése az alváz néhány másodpercet vesz igénybe, és fel kell készülnünk a helyzet, hogy a pilóta során ez a művelet meggondolja magát, és mozgassa a kart az ellenkező irányba. Szintén fontos megjegyezni, hogy ha a repülőgép fog leszállni, amíg képesek vagyunk «Várakozás felszállás», az időzítő újraindul, és megfeszíti az alváz csak akkor fordul elő, ha a légi jármű lesz a levegőben 2 másodpercig.
A végrehajtás egy véges állapotú gép
1. listán - ez az én megvalósítása véges állapotú gép a 3. ábrán látható Beszéljük egyes részleteket a kódot.
Először is, azt tapasztalhatja, hogy a funkcionalitás az egyes államok végrehajtják külön C függvény. Persze, akkor végre egy gép segítségével a switch egy külön eset `th minden állam, de ez oda vezethet, hogy nagyon hosszú funkciók (10-20 sornyi kódot a 1 állam minden egyes 20-30 államok). Azt is vezethet, hogy a hibákat, ha módosítja a kódot a végső szakaszában a tesztelés. Talán még soha nem felejtette el a break végén case`a, de nekem nem volt ilyen esetekben. státusz kódot soha nem esik egy másik kódot, ha minden állam lesz egy külön funkció.
Annak elkerülése érdekében, a használata a switch utasítás, azt használja egy sor mutató funkcióit az államok, és a használt változó indexként kijelentem enum típus.
Egy másik nyilvánvaló dolog - ezen a ponton, a kód nem különleges szerepet játszanak. Csak mozog az egyik állapotból a másikba. Ez egy fontos közbenső szakaszában, és nem szabad figyelmen kívül hagyni. By the way, jó lenne hozzá egy print utasítást írt alá a feltételes fordítási direktívák (#ifdef DEBUG. #endif), ami az aktuális állapot és értékeit a bemenő jeleket.
A siker kulcsa abban rejlik, hogy a kód okozza az átmeneti állapotok, azaz Ez határozza meg, hogy nem volt adatbevitel.
Ha a kód helyes áthaladt az állam, a következő lépés lesz írás „töltelék” a kódot, hogy pontosan mi teszi a kimeneti jel. Ne feledje, hogy minden járat egy bemeneti jelet (egy esemény, ami miatt), és a kimeneti (IO hardvereszköz, mint a mi példánkban). Gyakran célszerű rögzíteni állapot átmenet táblázat.
A állapotváltozás! Táblázat, egy-egy sorban egy állapot átmenet.
Amikor a kódolást egy olyan gép megpróbálja megmenteni az erejét - a jelölt közötti összefüggést a vásárlók igényeinek és a kódot. Lehet, hogy elrejtse részleteket a berendezés egy másik szinten funkciók, például, hogy egy olyan gép kódját, amennyire csak lehet, mint egy asztal és állapot átmeneti diagram az állam átmenet. Ilyen szimmetria segít megelőzni a hibákat, és megmagyarázza, hogy miért az állam gép olyan fontos része a arzenáljának beágyazott rendszerek programozó. Persze, akkor is ugyanezt a hatást érjük beállításával a zászlókat, és végtelen sok beágyazott ha, de ez nagyon nehéz lesz nyomon követni a kódot, és hasonlítsa össze az ügyfél kívánságait.
Fragmens kódot 2. lista kiterjeszti RaisingGear () függvény. Megjegyezzük, hogy a kódot RaisingGear function () hajlamos tükörkép 2 sor az átmeneti állapot asztal emelése Gear.
void RaisingGear (void)
/ * Miután az összes kapcsoló emelt, menjen az állam „emelte az alváz * /
if ((nosegear_is_up == MADE) (Leftgear_is_up == MADE) (Rtgear_is_up == MADE))
Ne feledje, hogy elkerülje a rejtett állapotok. Lappangási akkor jelentkezik, amikor miatt lustaság, akkor próbálja meg felvenni a feltételes alállapotba ahelyett, hogy az adott állapot. Például, ha a kódot feldolgozza ugyanazt a bemeneti jelet különböző módokon (pl kezdeményezi a különböző állami átmenetek), attól függően, hogy a mód, ez egy rejtett állapotban. Ebben az esetben, azt gondolta volna, nem azzal, hogy megtörni ezt az állapotot két? Használata rejtett állapotok érvényteleníti az előnye, hogy segítségével egy olyan gép.
Mint egy gyakorlatot, akkor meghosszabbítja az állam gép, amit most venni, hozzátéve, hogy az időtúllépés ciklus visszahúzás vagy meghosszabbítja a futómű, mert gépészmérnök nem akar hidraulikus szivattyú dolgozott több mint 60 másodperc. Ha a ciklus befejeződik, a pilóta figyelmeztetni kell a váltás a zöld és a vörös fény, és képesnek kell lennie arra, hogy ismét a kart, próbálja meg újra. Azt is kérheti a feltételezett gépészmérnök, mivel a hatás a szivattyú fordított irányban működés közben, mert előfordul, a 2-es, amikor a pilóta meggondolja magát. Természetesen a szerelő fogja mondani, hogy negatív. Akkor hogyan módosítaná az állam gép leállítja a szivattyút esetén gyorsan változó irányú?
A szépség a kódolás formájában véges automaták algoritmusok, hogy a vizsgálati terv szinte automatikusan írt magának. Mindössze annyit kell tennie -, hogy menjen át minden állam átmenet. Én általában nem ez a marker a kezében, feltűnő a nyíl az állam átmeneti diagram, mert sikeresen át a tesztet. Ez egy jó módja annak, hogy elkerüljék a „rejtett állapotok” - a vizsgálatok kimaradt gyakrabban, mint a konkrét állapot.
Ez megköveteli türelemre és rengeteg kávé, mint akár egy közepes méretű állami gép lehet akár 100 különböző átmeneteket. Mellesleg, a kattintások száma - ez egy nagyszerű módja annak, hogy az intézkedés a rendszer összetettségét. Az utóbbi határozza meg a megrendelő igénye, és az állam gép teszi a látszólagos térfogata tesztelés. A kevésbé szervezett megközelítést, az összeg a szükséges vizsgálati lehet ugyanolyan hatásos, de te csak nem fog tanulni.
Nagyon kényelmes a használata a kódban print utasítás, hogy a kibocsátás a jelenlegi állapot, amelynek értékeit a bemeneti és kimeneti jelek. Ez lehetővé teszi, hogy könnyen megfigyelhetjük valamit, ami kifejezi az „Aranyszabály vizsgálati program”: ellenőrizze, hogy a program végrehajtja a tervét, valamint, hogy mit nem csinál semmit extra. Más szavakkal, ha kap csak a kimeneteket vársz, és mi történik még ezen kívül? Hogy van-e a „kínos” állapot átmeneti, azaz kimondja, hogy esélye menni, csak egy ismétlődő ciklusban? Változás, hogy a kimenő jel, ha nem számítunk? Ideális esetben a kimeneti jeleket a printf sok emlékeztetni az állam átmeneti asztalra.
Végül - és ez vonatkozik minden olyan firmware-t, és nem csak a szoftver alapú véges automaták - Legyen nagyon óvatos, amikor először kezdi el a szoftver valódi hardveren. Nagyon könnyű hibázni a jel polaritását - „Ó, azt hittem, hogy az” 1 „azt jelenti, hogy emelje fel a futómű, és a” 0 „-, hogy csökkentse azt.” Sok esetben az asszisztensem berendezés használata átmeneti „csirke kapcsoló” védelmére értékes komponenseket, míg nem volt biztos benne, hogy a szoftvert mozgatja a tárgyakat a helyes irányba.
Amikor az összes vevő igényei készülnek, tudok futni egy olyan gép e komplexitás egy pár napig. Szinte mindig a gép, amit akarok. A legnehezebb dolog - van, persze, hogy pontosan megértsük, mi az ügyfél akar, és ellenőrizze, hogy a vásárló tudja magát, mit akar. Az utóbbi sokkal tovább tart!
Martin Gomez "Beágyazott State Machine végrehajtása". Szabad fordítás - ChipEnable.Ru
Nos nem olyan buta például, de legalább dvuhzadachnuyu PB rendszer (mérése a csatlakoztatott-ek) használatával megszakítások. És mégis, és hogyan kell csinálni, hogy távolítsa el az emberi tényező, amikor tagjait felsoroló typedef és funkciók neve a tömb mutató, mert szigorúan szinkronban, és ha ők 100 darab, és különböző időpontokban adjuk, akkor véletlenszerűen nechayno megzavarják a rendet. Minden egyes alkalommal, hogy ellenőrizze, mi?
Ahogy a közmondás mondja: „Te megpróbálom mindenkinek örömet, akkor nem mindenkinek tetszik”
Ahogy a közmondás mondja: „Te megpróbálom mindenkinek örömet, akkor nem mindenkinek tetszik”
Pash, minden rendben van, akkor jobb, ha van egy szál a fórum, és van egy példa egyszerűbb / bonyolultabb, ha szükséges
Köszönöm a cikket
Nos nem olyan buta például, de legalább dvuhzadachnuyu PB rendszer (mérési kapcsolat) megszakításokat használtak. És mégis, és hogyan kell csinálni, hogy távolítsa el az emberi tényező, amikor tagjait felsoroló typedef és funkciók neve a tömb mutató, mert szigorúan kell szinkronizálni, és ha ők 100 darab, és különböző időpontokban adjuk, akkor véletlenszerűen nechayno megzavarják a rendet. Minden egyes alkalommal, hogy ellenőrizze, mi?
Köszönöm szépen a cikket!
By the way, hogy megfeleljen a enum konstans a tömb függvénymutatók, véleményem szerint ez kényelmes a használata egy előfeldolgozó, például:
kód:
#define FunctionItem (id, szórakozás) id
typedef enum #include "fi.h"
> State_Type;
#undef FunctionItem
#define FunctionItem (id, szórakozás) fun
void (* state_table []) () = #include "fi.h"
>;
Amennyiben fi.h ezt a fájlt:
kód:
FunctionItem (GEAR_DOWN = 0, GearDown),
FunctionItem (WTG_FOR_TKOFF, WtgForTakeoff),
FunctionItem (RAISING_GEAR, RaisingGear),
FunctionItem (GEAR_UP, GearUp),
FunctionItem (LOWERING_GEAR, LoweringGear)
Megjegyzés hiányában a vessző az utolsó sorban