Kviz - podivna chovani programu pro 8bitove uP
Jan Kral
kral@fortech.cz
Pondělí Leden 8 13:17:25 CET 2007
Velmi dobre, je fakt, ze ten posledni test na -400 mel byt spis nekde kolem -200. Tento test je z duvodu ke ktere casti promenne se prekladac rozhodne driv pro jeji natazeni z pameti. Takze uplne spravna odpoved pri testu na -400 by mela byt ze to zalezi na tom jak to prekladac prelozi. S nekterym prekladacem 100, s jinym 10 :-)). Ale jinak naprosto presne.
Zajimalo by, kolik programatoru v Ccku a pod s temito variantami pocita a jak se to ma spravne resit. Ja co programuji v asm si pred nactenim hodnot z RAM zakazu preruseni a po jej opet povolim. Tohle jsem resil v jiz hotovem programu a cteni hodnoty jsem obalil nastavenim a snulovanim promenne, kterou testuji pred updatem counteru v preruseni a v tom problemovem pripade jsem aktualizaci neprovedl.
Jinak muzu rict, ze takovato chyba se v hotovem programu hleda dost blbe, zvlast kdyz update hodnoty "counter" probiha na zaklade nejakych vnejsich podminek.
JK
>
> Ahaho, problem "atomicity", v kombinacii s pouzitim
> nevhodneho datoveho
> typu v - s prepacenim - vyssom jazyku. Toto by sa malo
> rozdavat vsetkym
> adeptom programovania ako psia znamka na krk.
>
> Toto je klasicky ucebnicovy priklad premennej (counter), ktora je v
> maine pouzita (tu: testovana, pouzita v odcitani) prerusitelnou
> sekvenciou instrukcii - a pouziva sa (tu: meni) aj v preruseni. Este
> dobre, ze s premenna counter sa v main-e nemeni, to by mohlo byt este
> zaujimavejsie :-) Ale existuju aj zakernejsie verzie, napr. ak su dve
> premenne sice pouzivane "atomicky" ale musia zachovat nejaky vzajomny
> vztah - klasicky priklad je obsah buffra a pointer nan...
>
> Analyza:
> counter na zaciatku zmeni stav postupne z -22 na -40, pricom
> sa v maine
> (pri counter=-30) nastavi result na 10 - to je napokon
> zamyslana funkcia
> (dostatocne rychle vykonavanie cyklu zaruci, ze sa to aspon raz
> stane). potom counter nadobuda uz iba hodnoty 0 (= 0x0000), -1 (=
> 0xFFFF), -2, -3, -4, -15, -16, -17, -18, -19 (= 0xFFED) a
> znova 0 atd.
> Ak nastane prerusenie "uprostred" pouzitia counter-a, main "vidi" bud
> predchadzajuce LSB a nasledujuce MSB alebo naopak v zavislosti od
> poradia pouzitia (pri kontrole zhody s konstantou to moze byt
> akokolvek,
> pri odcitani to bude zrejme LSB first aj ked to tiez nie je na 100%,
> prekladac si moze napr. odkopirovat hodnotu pre odcitanie aj
> v opacnom
> poradi). V prvom pripade moze teda main "vidiet" okrem uz uvedenych
> hodnot countera aj 0x00ED = 237 (pri prechode z -19 na 0) a 0xFF00 =
> -256 (pri prechode z 0 na -1); v druhom pripade sa moze vyskytnut
> "naviac" 0xFF00 = -256 a 0x00FF = 255.
>
> Takze pripad A a B uz nenastane, prvy pripad C raz
> pravdepodobne nastane
> (zavisi to este od potencialneho synchronizmu prerusenia voci
> "main"-u)
> a druhy pripad C by tiez nemal nastat ("najzapornejsi" vysledok bude
> -256-100 = -356. -10 ani -30 sa uz nevyskytne.
>
> Takze "konecny" vysledok je 100.
>
> Mno samozrejme sa mozem mylit ako obvykle...
>
> wek
Další informace o konferenci Hw-list