Stránka 1 z 3
Restart programu
Napsal: 13 čer 2019, 18:07
od epes
AT Tiny 2313, program v Céčku. Potřeboval bych z rutiny přerušení restartovat program, nikoli čip. Příkaz GOTO nelze použít a žádný jiný příkaz mne nenapadá. Poradil by někdo zkušenější? Díky
Napsal: 13 čer 2019, 18:23
od forbidden
Atmely neznám, ale PICy mají na toto watchdog, když ho zapneš a včas neošetříš přetečení, tak generuje reset. Nic takovýho to nemá?
Napsal: 13 čer 2019, 18:34
od epes
Atmely mají tuto možnost také, ale v případě nepoužitelné. Díky
Napsal: 13 čer 2019, 18:46
od termit256
Co znamena "restartovat program, nikoli čip"?
Napsal: 14 čer 2019, 09:01
od fero_b
napis presnejsie co potrebujes v tom kode vyriesit..
a preco nemozes napisat "goto adr_000;" ?
ved watchdog urobi pri preteceni to iste..
Napsal: 14 čer 2019, 13:55
od divous
Kdysi dávno jsem o "restartu" programu uvažoval a dokonce se mi i částečně podařil.
V podstatě bylo nutno provést výmaz ramky a nastavit adresu haldy (a není to 0000h)
Bohužel jsem udělal někde chybu, protože program fungoval, ale blbě.
Daleko jednodužší je opravdu potřebná data uložit do eepromky a nechat provést reset.
Napsal: 14 čer 2019, 14:09
od fero_b
pod "haldou" myslis asi stack, pri atmel AVR je nastavenie stack pointra sucastou programu (ktory zvycajne startuje od startovacieho vektora, bezne 0000), ked to ma napisane v C, tak samozrejme to nepise, lebo linker mu tam nalinkuje inicializacnu cast (ktorej sucastou je aj inicializacia SP registra a ano SP neukacuje na adresu "0000" ale kdesi na horny koniec ramky a ulozenie hocicoho na stack znamena ze SP sa dekrementuje). A je pravda,ze 'goto adresa_000'; by asi neslo lebo adresa_000 by bolo navestie ktore by v zdrojaku zrejme dal hned za otvaraciu zatvorku, co je ale zle miesto, lebo to je uz zrejme "za inicializacnou castou, ktora je nalinkovna linkerom".
Ale mozno by slo napisat "goto #0000"; alebo "goto $0000;" To treba skusit, ci by to kompilator zozral, ale v pripade ze nie moze tam napisat jeden riadok asembleru:
ASM JMP #0000
tak by to skocilo na skutocny resetovaci vektor (v pripade 2313 po resete CPU startuje od nultej adresy) a teda by sa vykonala aj inicializacia ukazovatela stacku, proste uplne presne do iste ako ked by to resetol watch dog..
EDIT: a co urobi s datami pred tym ako urobi JMP #0, je uz na nom
Napsal: 14 čer 2019, 15:09
od ZdenekHQ
No, třeba v přerušení u 8051, kde program startuje od nuly, se to dá řešit i takto:
Napsal: 16 čer 2019, 12:07
od epes
Potřbuji vrutině přerušení provést dva příkazy nastavující výstupní port a předat řízení programu buď na samý začátek, nebo definované místo. Toť vše.
Bohužel , příkaz skoku nelze v rutině přerušení použít, ani navrhované příkazy překladač odmítá.( 'goto adresa_000'; ASM JMP #0000)
Napsal: 16 čer 2019, 13:52
od lesana87
Jestli používáš avr-gcc, tak skok na adresu 0000 z přerušení by se dal řešit asi takhle:
Kód: Vybrat vše
asm volatile("push __zero_reg__\n\t"
"push __zero_reg__\n\t"
"reti"
::);
Napsal: 16 čer 2019, 14:41
od termit256
Osobne bych to spis resil tak, ze bych v preruseni nastavil nejaky priznak na zaklade nehoz bych pak skakal v hlavni smycce kam bych chtel. Ale pokud to chces resit takhle, proste jen tesne pred vyskokem z obsluhy preruseni prepis navratovou adresu ulozenou ve stacku takovou, na kterou chces skocit a normalne vyskoc z preruseni.
Napsal: 16 čer 2019, 15:01
od masar
Ale to už psala lesana...
![Wink :wink:](./images/smilies/icon_wink.gif)
Napsal: 16 čer 2019, 22:06
od ZdenekHQ
Jedna instrukce mně i Lesaně vypadla. Je opravdu vhodný zakázat globální přerušení, než se všechno smaže a nastaví znovu. Proto tam mám RET a ne RETI, protože před tím mám (má být) CLR EA.
Napsal: 16 čer 2019, 22:42
od masar
Globální přerušení je v obsluze přerušení zakázáno implicitně. Proč ho tedy zakazovat ještě "ručně"?
![Wink :wink:](./images/smilies/icon_wink.gif)
Napsal: 16 čer 2019, 22:48
od termit256
To rozhodne neni, muzes prece vyvolat preruseni s vyssi prioritou.
Pokud jsem to pochopil on chce skakat i nekam jinam nez na zacatek. Pak si jeste bude muset pohlidat aby mu zustal konzistentni stack. Osobne mi to jako moc dobry napad neprijde.