stack u PIC 18Fxxx
Jan Waclawek
wek@evona.sk
Středa Leden 5 10:37:17 CET 2005
> Cim by se dal timto udelat bordel? Jestlize z obsluhy preruseni odejdu pres RET, tak je to uplne stejne jako kdyz navratovou adresu ze zasobniku vyhodim a jdu presne kam potrebuji JMPem. Podivejte se nekdy jak se predavaji parametry treba v C podprogramum a jak vraceji vysledky. To je teprve libusta a zadny bordel v tom neni.
Tak priklad:
hlavny_cyklus:
robim_nieco
push register
robim_nieco_ine ;*1
pop register
call podprogram
skoc_na hlavny_cyklus
dodatocne_spracovanie:
robim_spracovanie_po_preruseni
ak nesplnena_podmienka tak skoc_na hlavny_cyklus
podprogram:
robim_nieco_v_podprograme ;*2
ret
prerusenie:
pop navratova_aderesa
povol_dalsie_prerusenia ;*3
jmp dodatocne_spracovanie
Ak nastane prerusenie v bode *1, v stacku mate register, ktory tam
zostane uz navzdy. Podobne v bode *2, vtedy tam zostane navratova adresa
odkial bol podprogram volany.
Pochopitelne sa da urobit aj "upratovanie", t.j. prestavit stack pointer
v bode *3 na dohodnutu hodnotu; ale to moze a nemusi vadit. Toto je
presne pristup, ktorym sa vytvori mozno funkcny, ale neudrziavatelny kod
(ak ho po roku upravite, uz sa nebudete pamatat na tu fintu a uprava ju
pokazi). A to je presne aj pricina, preco Wirth zavrhuje - inak ak sa
pouzije uvazene, velmi uzitocny - prikaz goto.
Koser je tu slucku ukoncit; a kedze v nej je tak ci tak test (na
ukoncenie vzorkovania po naplneni buffra) staci podmienku v preruseni
"sfalsovat".
wek
Další informace o konferenci Hw-list