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:

Kód: Vybrat vše

CLR A
PUSH ACC
PUSH ACC
RET

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:

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:

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.