Restart programu
Moderátor: Moderátoři
Restart programu
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
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.
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.
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
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
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
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[?]
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"
::);
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.
- ZdenekHQ
- Administrátor
- Příspěvky: 25593
- Registrován: 21 črc 2006, 02:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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[?]
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[?]