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