Vilken prioritet har vilka interrupt?
Om processorn håller på med låt oss kalla det interrupt A.
Om interrupt B aktiveras under tiden, vad blir händelseprocessen?
Kommer processorn köra färdigt interruptet eller hoppa direkt?
Interrupt på en ATmega32L
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Men grabbar, läser ni inte manualen? Detta är en typisk RTMF-fråga. Men snäll som jag är så "kuttar och pejstar" jag lite åt er/dig.
The AVR provides several different interrupt sources. These interrupts and the separate reset vector each have a separate program vector in the program memory space. All interrupts are assigned individual enable bits which must be written logic one together with the Global Interrupt Enable bit in the Status Register in order to enable the interrupt.
The lowest addresses in the program memory space are by default defined as the Reset and Interrupt Vectors. The complete list of vectors is shown in Interrupts on page 42. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 - the External Interrupt Request 0.
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the I-bit to enable nested interrupts.
All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction RETI is executed.
Översatt till ren enkel svenska: Ett interrupt med lägre adress (=högre prioritet) kan avbryta ett redan pågående interrupt SÅVIDA man har slagit på GIE-bitten igen i det första interruptet, annars så blir händer det inget förrän den första interuptet är klart.
The AVR provides several different interrupt sources. These interrupts and the separate reset vector each have a separate program vector in the program memory space. All interrupts are assigned individual enable bits which must be written logic one together with the Global Interrupt Enable bit in the Status Register in order to enable the interrupt.
The lowest addresses in the program memory space are by default defined as the Reset and Interrupt Vectors. The complete list of vectors is shown in Interrupts on page 42. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 - the External Interrupt Request 0.
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the I-bit to enable nested interrupts.
All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction RETI is executed.
Översatt till ren enkel svenska: Ett interrupt med lägre adress (=högre prioritet) kan avbryta ett redan pågående interrupt SÅVIDA man har slagit på GIE-bitten igen i det första interruptet, annars så blir händer det inget förrän den första interuptet är klart.
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Jo, manualen är ju lite stor, särskilt "complete"-versionen av den. Och det är ju definitivt inget som man läser alla sidor av i sträck och tror att man ska komma ihåg allt. Jag har av erfarenhet lärt mig att det inte är nån idé att tro att man kommer ihåg en viss sak, det är bättre att slå upp det vid mista osäkerhet, i långa loppet så blir det bättre på det sättet eftersom man slipper en massa onödig debugging på saker som man "tror sig veta att dom är rätt".
Manualen har ju ett index, och acrobat reader har en hygglig sökfunktion så det går rätt fort att hitta det man är ute efter.
Ja, det stämmer fint det. GIE-bitten nollställs/disablas automatiskt vid ett interrupt och blir sedan automatiskt påslagen. När man returnerar från interrupt-hanteraren med RETI-instruktionen så slås interruptena på igen genom att GIE-bitten ettställs/enablas.
Vill du att ett interrupt ska kunna interrupta ett annat interrupt i ditt program?
Manualen har ju ett index, och acrobat reader har en hygglig sökfunktion så det går rätt fort att hitta det man är ute efter.
Ja, det stämmer fint det. GIE-bitten nollställs/disablas automatiskt vid ett interrupt och blir sedan automatiskt påslagen. När man returnerar från interrupt-hanteraren med RETI-instruktionen så slås interruptena på igen genom att GIE-bitten ettställs/enablas.
Vill du att ett interrupt ska kunna interrupta ett annat interrupt i ditt program?
Använder en C-kompilator, men det fungerar väl på samma sätt som assembler, nej jag vill inte aktivera ett interrupt i ett annat, men antar att det bara är att skriva #asm("sei") där man vill kunna aktivera det..
Ursäkta för frågorna, men jag vill bara vara idiotsäker innan jag rycker av allt hår :)
Ursäkta för frågorna, men jag vill bara vara idiotsäker innan jag rycker av allt hår :)
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Utan att veta vad det är för porblem du har med din kod så kan jag tippsa om attributet volatile. Det vette tusen om det verkligen heter just attribut, men jag kallar det för det, jag har inte nån formell programmeringsutbildning :-)
Variabler som du vill komma åt innifrån en interrupthanterare bör/måste sättas som volatile för att tala om för kompilatorn att den variabeln kan plötsligt behövas användas av interrupt-rutinen. Och att den därför inte får optimeras genom att läggas i ett cpu-register för att få snabbare access till den, den ska alltså alltid ligga på sin plats bland variaberna.
Nu är jag inte till 100% säker på att det verkligen behövs på en avr-cross-compiler, men i vanliga fall är det livsnödvändigt.
Fast det skadar ju inte att prova med att definiera dom variablerna med
volatile int bletch;
istället för
int bletch;
Variabler som du vill komma åt innifrån en interrupthanterare bör/måste sättas som volatile för att tala om för kompilatorn att den variabeln kan plötsligt behövas användas av interrupt-rutinen. Och att den därför inte får optimeras genom att läggas i ett cpu-register för att få snabbare access till den, den ska alltså alltid ligga på sin plats bland variaberna.
Nu är jag inte till 100% säker på att det verkligen behövs på en avr-cross-compiler, men i vanliga fall är det livsnödvändigt.
Fast det skadar ju inte att prova med att definiera dom variablerna med
volatile int bletch;
istället för
int bletch;