Restart programu

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
epes
Příspěvky: 111
Registrován: 05 srp 2008, 02:00
Bydliště: Praha 5

Restart programu

#1 Příspěvek 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

Uživatelský avatar
forbidden
Příspěvky: 8808
Registrován: 14 úno 2005, 01:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#2 Příspěvek 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á?

Uživatelský avatar
epes
Příspěvky: 111
Registrován: 05 srp 2008, 02:00
Bydliště: Praha 5

#3 Příspěvek od epes »

Atmely mají tuto možnost také, ale v případě nepoužitelné. Díky

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#4 Příspěvek od termit256 »

Co znamena "restartovat program, nikoli čip"?

Uživatelský avatar
fero_b
Příspěvky: 582
Registrován: 17 kvě 2004, 02:00
Bydliště: Kosice

#5 Příspěvek 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..

Uživatelský avatar
divous
Příspěvky: 161
Registrován: 08 říj 2010, 02:00
Bydliště: ValMez

#6 Příspěvek 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.

Uživatelský avatar
fero_b
Příspěvky: 582
Registrován: 17 kvě 2004, 02:00
Bydliště: Kosice

#7 Příspěvek 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

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#8 Příspěvek 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
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
epes
Příspěvky: 111
Registrován: 05 srp 2008, 02:00
Bydliště: Praha 5

#9 Příspěvek 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)

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#10 Příspěvek 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"
             ::);

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#11 Příspěvek 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.

masar
Příspěvky: 12295
Registrován: 03 pro 2005, 01:00

#12 Příspěvek od masar »

Ale to už psala lesana...
:wink:

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#13 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

masar
Příspěvky: 12295
Registrován: 03 pro 2005, 01:00

#14 Příspěvek 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:

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#15 Příspěvek 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.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“