Hogyan kerüljük el a gyakori hibákat firmware


Megértése hardver és szoftver hibák a példáját más beágyazott rendszerek segítségével azonosítani, diagnosztizálni és kijavítani a hibákat a saját rendszerét.

Annak ellenére, hogy ezek egyike sem a hibák nem okoznak komoly károkat, melyek bemutatják érdekes funkciókat. Ennek során az elbeszélés, nézzük néhány jellemzője a C előfeldolgozó és adok némi kapcsolatos figyelmeztetéseket a használatát időzítő.

Az első csoport a hibákat okoz változást, amely semmilyen módon nem befolyásolja a rendszer, de megmagyarázhatatlan módon történik. Különböző lehetőségek optimalizálás nem befolyásolja a rendszer viselkedését a teljesítmény, csak befolyásolja a sebességet a kódot, és a mérete. Természetesen, ha a rendszer működik, valós időben, gyorsan kezd végezni bizonyos mennyiségű kódot jelezhet versenyhelyzet, de vannak más finom hatásait optimalizálása miatt, amit meg lehet fogni.

Az egyik esetben, kollégáim és én találtam egy hibát a kódot, ami nem volt az előző változat. Megvizsgáltuk a történelem, a változások az előző verzióhoz képest, hogy a jelenlegi és szűkült a keresés ezen fordítási beállításokat. Részletesebb kódot, a tanulmány megállapította, hogy mivel a hanyag elvégzett munka lettünk téve a hatása optimalizálás. Listing 1. ábrán egy egyszerűsített változata, amit csinálunk.

X = "hello"; // hello1

Most kapcsolja be optimalizálása, és a viselkedés változás. Mivel a karakterláncot hello1 és hello2 azonos, a fordító tartja egy példányát „hello”, és ezért hello1 és hello2 be ezt a pozíciót. Ebben az esetben, a kivitelezés sor x = „hello”, és y = „hello” vezet az a tény, hogy az összehasonlítás eredménye az x és y értéke TRUE.

A lényeg az, hogy ha a (x == y) volt, nem a megfelelő típusú összehasonlítás. Úgy kell mindig használni strcmp () függvény vagy azzal egyenértékű.

A film „Jurassic Park”, van egy jelenet, amelyben a hős Jeff Goldblum felfedezi, hogy az eljárás ellenőrzése, hogy az összes dinoszaurusz is jelen vannak, számolja az összes állatok, és ha elér egy bizonyos pontot, a fiókot. Az a tény, hogy a szám a dinoszauruszok nőtt, nem vették észre, mert a karakter a filmben, elérve a várható száma dinoszauruszok soha nem tartotta pontszámot. Intelligens állatok rájöttek, hogyan lehet reprodukálni, annak ellenére, hogy állítólag minden klónozott dinoszauruszok nő volt.

Goldblum hős azt sugallja, hogy a számítógép keresett nagyobb számú dinoszauruszok, és a szám talált állatok nagyobb, mint az eredeti összeg, a csoport rájön, hogy van egy sokkal nagyobb őskori állatok a vártnál. Hívom ezt a hibát „hibaüzenet Jurassic Park”. Ez egy tévedés beállítást a felső határ érték, hamis abban, hogy több nem felel meg, vagy nem számít az eseményen. Ez egy ésszerű módszer, amely gyakran egyszerűbbé programozás, hanem azért, mert nem várt állapot, láthatatlan a rendszer.

Lehet, hogy ez egy hiba a szoftver? Ha tárolni egy számot a 8-bites változó, akkor abba kell hagynia rovására 255 Ez az érték tekinthető valamilyen hibát jelez, vagy egy közelítése a lehető legnagyobb érték a változó a rendszerben. Melyik ezeket a lehetőségeket a legjobban attól függ, hogy a számláló 255 elér egy hibás állapotban vagy normális állapot.

Amikor használja a számtani partíció szám az egész és tört részei, hasznos lehet korlátozni az értéke ezeknek a részeket, hogy számításokat igen nagyszámú nem eredményezik a túlfolyó változók.

Illusztrációként a „hibák Jurassic Park” fog adni egy példát a praxisomban. Volt egy rendszer, amely méri a gáz áramlását. Jellemzően, a rendszer, hogy ellenőrizzék a mennyiséget 15 l / min. A felső határ a mért áramlási, hoztunk létre egy 25 l / min. Azt hitték, hogy még ha a gázáram meghaladja a 25 liter / perc, lehet tekinteni, hogy az megegyezik ezzel az értékkel.

Bizonyos esetekben, az áramlás nem haladhatja meg a 25 l / min, de úgy gondoljuk, hogy ezek az esetek figyelmen kívül lehet hagyni, mert a rendszer nem volt az állam ellenőrzése. Az egyik ilyen eset volt a teszt, amely összehasonlítottuk fluxusok detektáltuk két azonos érzékelők. Feltéve, hogy az érzékelők megfelelően működnek, és hagyjuk a pontos mérés folyik az egyes érzékelő volt, hogy tűréssel egymást. Amikor a külső nyomás a gázellátó rendszer nagyon magas volt, a vizsgálat is történhet az feleslegben szíj 25 l / min. Feltételezve, hogy a kalibrációs az érzékelő átkerült, az áramlási sebesség által mért két érzékelő egyenlő, például 26 l / min és 29 l / perc. Mindkét értékeket ezt követően kerekítve 25 l / perc a fent leírt okok miatt. Amikor itt az ideje, hogy összehasonlítani a két mérés, voltak egyenlő 25 l / perc, illetve, és egyenlő egymással. Megtalálása ilyen helyzet, már betiltották a használatát összehasonlító próba áramlás 25 l / min.

Még ha nem tesz egy határt a kiolvasás szoftver, korlátozások a projekt szabhat hardver. Például az érzékelő kimeneti feszültség van egy felső határa korlátozza áramlását jelzi. Azt javasoljuk, hogy mindig egy érzékelőt egy szélesebb körű, mint a várt a rendszer. Ugyanakkor szem előtt tartani, akkor meg kell cserélni a széles körű az érzékelő felbontása a műszer. A szenzor egy kisebb tartományt és nagyobb felbontású pontosabb lehet, de akkor találja magát egy holtpont, amikor senki sem látja, hogy mi történik.

Néha megjelenik a „hiba Jurassic Park” az eseménynaplókban. Tekintsünk egy eszköz, amely rögzíti rendkívüli esemény a naplóban. Kevés a hely a tárolására események, például jön létre 30 naplóbejegyzéseket. Minden felvétel - olyan szerkezetek, amelyek részleteit az esemény típusa, idő, és talán az aktuális beállításokat a készülék. A napló tartalmazza a teljes, 30 eseményeket. Azonban, ha van 50 esemény, a magazin az továbbra is 30, úgy, hogy a valódi események száma rejtettek. Ebben az esetben a probléma enyhíthető használatával végleges tartalmazó karakterlánc száma rögzítetlen eseményeket. Bár ez a módszer nem segít, ha ismerjük a részleteket az eseményeket, legalább tudni fogja, hogy valami hiányzik. A használat során a számláló pont akkor kell valamit, hogy az érték be van ágyazva egy nagyobb mennyiségű napló adatok tárhelyet.

Sok más típusú „hibák Jurassic Park”. Miután többször is szenvedett e hiba miatt, én kevésbé hajlandóak tenni az értéke egy bizonyos felső határt. Inkább beállíthat egy felső korlátot, ahol tudok mondani, hogy a rendszer nem fog működni, ha a határérték túllépése.

Az egyik kollégám dolgozott egy ellenőrző, amely annak ellenőrzésére szolgál, hogy a frissített példányt a telepített program károsodás nélkül. Mint az egyik szakaszában tesztelés, aki megjegyezte, az ellenőrző érték minden egyes végrehajtható program. Egy nap odajött hozzám, és azt mondta, hogy ő megértette -, hogy amiről azt hitte, valószínűleg tévedés fordító. Mivel a fordító volt egy csomó hibát, nem vagyunk nagyon meglepett.

Megtartottuk a kódot verziószámot. Néhány projektünk, ez a szám automatikusan frissül minden szerelvény, ezért két összeállítások nem lenne azonos. Ebben a projektben, a szám megváltozott, ha a programozó, hogy kézzel szerkeszteni a fájlt. Ebben az esetben ez nem változott és nem is lehetett az oka a változások a checksum.

Már használható az assert () makró. Ez a makró a beépített fordító makro __ __ LINE, ami megegyezik a jelenlegi vonal a lefordított fájlt. Ha megváltoztatta a sorszámok, az érték __ __ LINE. által használt érvényesíteni (), az más lenne, és ezeket az értékeket tárolják az eredeti programban.

Niall Murphy "Hogyan kerülhető Common Firmware Bugs"

egyes ciklusok alatt megépítésük oly módon, hogy nem tenné lehetővé a kimeneti változó a lehetséges tartományon.
azaz Egy ilyen ciklus, amelyben a változó A változik 0-10, és összehasonlítjuk a feltétele A = 10. ha hirtelen, bármilyen okból, a változó értéke túlmutat a 10, hogy végezze el ezt a műveletet, míg az érthetetlen hányszor változó túlcsordul és a gróf újra indul a nulláról. Ha megnéztük a feltétellel A => 10? ha ez meghiúsul ciklus rövidebb lenne, és nem kritikus hiba, de megint attól függ, hogy az adott körülmények között.

Az utóbbi helyzet - nagyon érdekes és tanulságos eset. Minden más - triviális és ismert, még iskolás.