18f??k42 Timer 2/4/6 interrupts?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: 18f??k42 Timer 2/4/6 interrupts?

Inlägg av Icecap »

Vektorns adress har inget med prioriteten att göra.

En interrupt med viktigare prioritet kan avbryta lägre prioritet interrupts.
Och då alla ISR ska se till att fixa att spara status osv. samt återställa.

Men om detta sker automatisk måste det ju finnas en stack för detta - vilket antingen är hårdvarustack med minne just för detta eller en stack som använder allmän RAM - och då ska man oftast ställa en pekare till rätt startpunkt.

Men stacken ska ju bara ha lika många steg som det finns prioriteter * antal bytes som ska gömmas så det är ju inte enorma mängder som går åt.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6886
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: 18f??k42 Timer 2/4/6 interrupts?

Inlägg av Marta »

I de nya *K42 är ordningsföljden per konstruktion avgörande för prioriteten om de har samma status enligt bitarna i IPR eller endast en prioritetsnivå använs.

Sedan finns det ett par stycken i databladet som jag tycker är motsägelsefulla. Under 9.3.1 finns följande text:

"Interrupts defined with the same software priority
cannot preempt or interrupt each other.

Concurrent pending interrupts with the same user
priority are resolved using the natural order priority.
(when MVECEN = ON) or in the order the interrupt
flag bits are polled in the ISR (when MVECEN =
OFF)"

Denna tolkar jag som att när en ISR med hög prioritet exekveras och en annan interruptkälla med hög prioritet under tiden begär service så exekveras pågående ISR färdigt innan nästa påbörjas. Detta oavsett deras placeringar i IVT.

Under 9.3.2. finns denna text:

"For example, when two concurrently occurring interrupt
sources that are both designated high priority using the
IPRx register will be resolved using the natural order
priority (i.e., the interrupt with a lower corresponding
vector number will preempt the interrupt with the higher
vector number)
."

Denna tolkar jag som att en interuptkälla som kommer före i IVT komer att bryta exekveringen av en pågående ISR med placering längre ned i IVT. Jag blir yr av dedett i mitt tycke luddiga svammel i databladet.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: 18f??k42 Timer 2/4/6 interrupts?

Inlägg av Icecap »

Jag läser det som att om de två interrupts kommer <exakt samtidigt> prioriteras den med högre interruptvektor före den andra. Men att detta bara sker när de sker på exakt samma tid/maskincykel.

När en ISR med prioritet X väl är igång med kan den bara avbrytas av en interrupt med prioritet > X.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6886
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: 18f??k42 Timer 2/4/6 interrupts?

Inlägg av Marta »

Det är verkligen en strikt tolkning av "concurrently occurring". Men i det läget att de initieras i exakt samma stund har ju ingen av dem påbörjat exekvering och kan därmed inte bli "preempted". Det är ett val mellan vilken som skall startas. Inte om den pågående skall avbrytas eller få exekvera klart. "preempt" betyder just avbryta innan något är färdigt, inte välja.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6886
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: 18f??k42 Timer 2/4/6 interrupts?

Inlägg av Marta »

Din tolkning är den rätta. Har testat efter middag och vila. En interrupt kan inte bryta en annan utom när en hög prioritet inträffar när en låg exekveras. Två på samma nivå exekverar klart innan nästa startas.

Om GIE clearas så blockeras interrupt precis som förväntat. Både om grundprogrammet eller låg prio ISR gör det.

Då ve jag med säkerhet vad som gällr. Nu skall "bara" buggen ut... Bugs i samband med interrupts brukar vara envisa. :(
Skriv svar