Interrupt AVR

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


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