Interrupt AVR

Miroslav Mraz mraz na seznam.cz
Pátek Duben 11 14:26:16 CEST 2014


To zní docela rozumně. Je už docela dlouho, co jsem dělal s AVR, tak už 
si moc nepamatuji, měl jsem dojem, že se toho ukládá víc. A nedávno tu 
běžela diskuse o překladu pro PIC s podobným problémem. Do toho 
nezasahuji protože PIC neznám a ze zdejších diskusí soudím, že ani znát 
nechci.
X51 to měly docela vymakané - aby se nemuselo ukládat na zásobník, šlo 
přepnout banku registrů a bylo.
U Cortex-Mx vím, že je tam nějaká hardwarová obezlička, takže obsluha 
přerušení je funkce jako každá jiná, ale do hloubky to nezkoumám. Hraju 
si s tím v C++ a je zajímavé, že jde napsat obsluha přerušení jako 
statická členská metoda zapouzdřená do příslušné třídy. Ovšem je otázka, 
zda je to k něčemu dobré. Celkově se mi ale C++ dost líbí, zkoušel jsem 
i překladač clang + LLVM, pro ty ARMy bude asi za pár let docela 
použitelný, zatím se to musí lepit pomocí binutils. Ale do té doby to 
bude moloch, kam se na něj hrabe GCC.

Díky za reakce.

Mrazík

On 04/11/2014 01:34 PM, Jan Waclawek wrote:
> Prazdne prerusenie avr-gcc vyzera nejako takto:
>
>    e8:	1f 92       	push	r1
>    ea:	0f 92       	push	r0
>    ec:	0f b6       	in	r0, 0x3f	; 63
>    ee:	0f 92       	push	r0
>    f0:	11 24       	eor	r1, r1
>
>    f2:	0f 90       	pop	r0
>    f4:	0f be       	out	0x3f, r0	; 63
>    f6:	0f 90       	pop	r0
>    f8:	1f 90       	pop	r1
>    fa:	18 95       	reti
>
>
> Na IO adrese  0x3F je stavove slovo SREG, toto sa vsak neda ulozit na stack
> priamo, treba preto najprv ulozit nejaky register (tu r0), nacitat do neho
> SREG, ulozit ten; no a pri odchode naopak.
>
> Teoreticky by prekladac mohol zistit, ze sa v preruseni ziadny bit v SREG
> nemeni, ale zistovat take nieco je silne netrivialna zalezitost a u
> drvivej vacsiny praktickych programov to aj tak nemoze nastat (asi jediny
> prakticky priklad, kde to nastane, je, ked sa v preruseni ulozi na nejake
> konkretne pamatove miesto nejaka konkretna konstanta, a nic ine sa
> neurobi), takze toto nikto riesit nebude.
>
> Preco sa uklada (a nuluje skrz eor r1, r1) r1, to je trocha zlozitejsia
> pricina - r0 ako tzv. "tmp register" a r1 ako tzv. "zero register" su
> pomocne registre generatora kodu v avr backende, napriklad ked treba
> urobit viacbytovu aritmeticku operaciu. Vzdy sa predpoklada, ze r0 je
> nulove pred aj po takejto operacii, a inak r0 aj r1 je mozne kedykolvek
> pocas operacie zmenit; v tomto duchu je potom aj poziadavka na cele
> funkcie v avr-gcc ABI. Kedze takto r0 a r1 su z pohladu prekladaca akoby
> sucast procesora a nie general-purpose registre, prekladac nesleduje ich
> pouzitie tak, ako sleduje pouzitie ostatnych registrov. Znova, asi by sa
> to dalo dorobit, ale znova, nestoji to za to.
>
>
> A napokon, ak je ISR take jednoduche, ze by uvedeny prolog/epilog bol
> neuzitocny, tak je jednoduche ho aj napisat v asm, tak co...
>
> wek
>



Další informace o konferenci Hw-list