Interrupt AVR

Jan Waclawek konfera na efton.sk
Pátek Duben 11 13:15:33 CEST 2014


V ARM-CortexM (co je to co popisujete), jadro (hardware) pri volani
prerusania ulozi R0-R3, R12, LR, navratovu adresu (t.j. PC) a stavove
slovo, a v jednom bite LR si zapamata, ze je v preruseni, takze pri
vykonani BX LR (co je ekvivalent obycajneho RET) toto vsetko zase hardware
zo zasobnika povybera. ABI predpisuje prekladacu, ze kazda (aj obycajna)
funkcia musi zachovat (resp. vratit spat) R3-R11, takze pre prerusenie
staci pouzit "obycajnu" funkciu, t.j. staci to, co urobi hardware plus
tato poziadavka. (Ci tato "vyhoda" stoji za tu pomerne vysoku latenciu
preruseni a potencialne o malo vyssiu spotrebu RAM, plus ze nakolko
situaciu zachranuje propagovany "tail-chaining", je na dlhsiu diskusiu).

U AVR je to inak. Hardware ulozi navratovu adresu a nastavi flag v
specialnych registroch, ze sme v preruseni, a to je vsetko. Poziadavka na
software prerusovacej rutiny je, ze je treba rucne odlozit a pri navrate
obnovit vsetky registre, ktore sa pouziju, plus stavovy register, plus sa
musi z prerusenia odchadzat specialnou instrukciou RETI. Toto by bolo
nerozumne pozadovat na "normalnych" funkciach. ABI nie je sice vyrobcom
predpisany ale asi vacsina prekladacov pouziva podobne ako gcc, t.j. ze
cast registrov su caller-save a cast callee-save. Strategia "vsetky
registre callee-save" (co by bolo najblizsie tomu "vsetky funkcie
rovnake", ak by sa odhliadlo od RETI) je neefektivna pre relativne male
programy s velkym poctom "leaf functions" (t.j. takych, ktore uz nevolaju
nic ine).

wek


----- Original Message ---------------

Subject: Re: Interrupt AVR
   From: Miroslav Mraz <mraz at seznam.cz>
   Date: Fri, 11 Apr 2014 12:32:40 +0200
     To: HW-news <hw-list at list.hw.cz>

>Kdy¾ u¾ jsme u toho, proè on to ten pøekladaè vlastnì dìlá ? Jak jsem 
>zbì¾nì koukal do toho, co gcc vyplodí za asm (pro ARM, ale pro AVR to 
>asi bude podobné), tak na zaèátku funkce ulo¾í na zásobník jen ty 
>registry, které se v prùbìhu funkce mìní a na konci je opìt obnoví, co¾ 
>je konzistentní i pøi vnoøeném volání. Tedy pokud je ABI nepou¾ívá k 
>pøedání parametrù funkce nebo návratové hodnoty. Tak¾e po volání void 
>funkce (void) jsou registry ve stavu jako pøed ním. A z tohoto hlediska 
>je pøeru¹ení void funkce (void) stejná jako jakákoli jiná, jen nevíme 
>odkud je volána. Ale to je celkem fuk.
>Marnì pøemý¹lím, proè by se tedy mìlo v pøeru¹ení ukládat je¹tì nìco 
>jiného, kdy¾ po návratu z nìj budou popsaným zpùsobem registry v¾dy v 
>pùvodním stavu. Asi mi nìco uniká.
>
>Mrazík
>
>On 04/11/2014 08:26 AM, HUDA volny wrote:
>> Dobrý den,
>>
>> pou¾ívám GCC pøekladaè pro ATTiny a potøeboval bych
>> mu øíct, aby u jednoho pøeru¹ení neukládal automaticky
>> registry. Obsluhu napí¹u v asm. Jsou to 4 øádky.
>> Pøekladaè to ale obalí push a pop instrukcemi, které
>> jsou del¹í ne¾ vlastní kód.
>>
>
>_______________________________________________
>HW-list mailing list  -  sponsored by www.HW.cz
>Hw-list at list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list