Spørgsmål:
afbryder en afbrydelse
perigalacticon
2016-08-14 21:08:34 UTC
view on stackexchange narkive permalink

Hvad kan man forvente, hvis koden i timeren afbryder ISR ikke afsluttes, før afbrydelsen kaldes igen? For eksempel Timer0 ISR (TIMER0_COMPA_vect) {} på Uno. Dette er til fejlfindingsformål i et komplekst program. Tak.

To svar:
Gerben
2016-08-14 23:34:47 UTC
view on stackexchange narkive permalink
  1. timeren indstiller Timer Interrupt Flag (TIFR0-register)
  2. ISR kaldes, og flaget ryddes
  3. du laver nogle lange beregninger eller noget
  4. timeren svarer til OCR0A og indstiller afbrydelsesflagget igen.
  5. dine beregninger er færdige, og ISR-funktionen afsluttes.
  6. uC vil spring tilbage til hovedsløjfekoden, og udfør 2 1 instruktion s .
  7. UC vil se flag og kalde ISR igen. Som i trin 2.

PS skal du være opmærksom på, at ISR-makroen som standard slukker for global afbrydelse (cli) i begyndelsen af ​​funktionen og sætter den tilbage i slutningen. Du kan genaktivere afbrydelser inde i ISR, men du skal være meget forsigtig her, da afbrydelser kan indlejres og forårsage stack-overløb.

Du kan genaktivere afbrydelser inde i ISR , men det betyder kun, at anden afbrydelse kan afbryde denne ISR, men aldrig den samme vektor. (dvs. kun en ISR pr. vektor kan køre på samme tid). Så i dit tilfælde kan timeren ISR ikke afbrydes af den samme timerafbrydelse.

Tillykke, det er et ret godt resumé af, hvad der sker i denne situation.
1.- Min forståelse er, at uC vil udføre en _single_ instruktion (ikke 2) af hovedkoden, inden den går ind i ISR ​​igen. 2.- Hvor har du læst, at kun en ISR pr. Vektor kan køre på samme tid? Det er første gang, jeg læser noget lignende.
Bemærk, at hvis du genaktiverer afbrydelser inde i ISR, kan _same_ interrupt bestemt ** igen ** indtaste _same_-vektoren. Dette er en af ​​grundene til, at genaktivering af afbrydelser inden i en ISR kræver grundig overvejelse ... Du sagde det selv: (trin 2) - "... flaget bliver ryddet."
Tilsyneladende tog jeg fejl i sidste afsnit. Jeg er ikke sikker på, hvor jeg har det fra, men det vises ikke nogen steder i databladet.
Majenko
2016-08-14 21:45:11 UTC
view on stackexchange narkive permalink

Det kaldes først, før den aktuelle afbrydelse er afsluttet. Så snart den aktuelle afbrydelsesfunktion vender tilbage, vil den afventende afbrydelse udløse og kalde ISR igen.

Du skal udtrykkeligt tillade, at afbrydelser afbrydes. For mere information foreslår jeg, at du ser afsnittet `nestede afbrydelser` på [avr-libc] (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html).


Denne spørgsmål og svar blev automatisk oversat fra det engelske sprog.Det originale indhold er tilgængeligt på stackexchange, som vi takker for den cc by-sa 3.0-licens, den distribueres under.
Loading...