|
From: <ho...@tj...> - 2026-02-13 10:23:24
|
On 2026-02-08 15:38, Martin Nicholas via Amforth-devel wrote: > Firstly, here's the docs: > http://amforth.sourceforge.net/TG/AVR8.html#interrupts > http://amforth.sourceforge.net/TG/recipes/Interrupt-Critical-Section.html > > Source files: > amforth-6.9/avr8/lib/hardware/int-q.frt > etc. > > Because of the way AmForth handles interrupts, the I-flag can be > cleared (disabling the interrupts globally) at any time during the > execution of a Forth primative. It can change to zero between any two > M/C code instructions. > > So "int?" has to check both the I-flag and the value of "isrflag" > (T-flag) to come to a valid conclusion. "-int" cannot just perform a > CLI instruction as the next NEXT may process a pending (pending before > the CLI was executed) interrupt and re-enable them. Etc. > > Reliable fetch of interrupt status. > Checks for pending interrupts. > I T*** int? Remarks > = = ==== ======= > 0 0 0 Interrupts disabled by the program. > 0 1 -1 Interrupt pending* > 1 0 -1 Normal operation. > 1 1 -1 Shouldn't ever be** > > * This will be serviced by the next NEXT and SREG:I will be > set once more. > ** The interrupt will still get serviced, provided it isn't > overwritten. > *** The T-flag seems to be reserved as a holder for the ISR > status, but currently it isn't used. Location "isrflag" is used > instead and is a much slower. > > Special care has to be taken to save and restore the I-flag. I have > written macro "no_ints". It uses MCUCR:IVCE to > disable interrupts without affecting the I-flag - see the docs. > > Correctly preserve the interrupt status in @0: > > .macro no_ints > in @0, MCUCR > ori @0, (1<<IVCE) > out MCUCR, @0 > in @0, SREG > cli > .endmacro > > Later Atmel cores automatically disable interrupts for a time if you > fiddle with the SP register, so "no_ints" is not required here. Maybe > there are other operations that do this too. Hi Martin, Thank you. Added to the list. A preliminary check of the archives shows that the way interrupts were handled by the VM changed between releases 6.4 and 6.5 In 6.4 there is brts DO_INTERRUPT In 6.5 there is cp isrflag, zerol brne DO_INTERRUPT The release notes for 6.5 [1] state that there was a bug in the interrupt handling on the avr8. Erich discovered and fixed the bug, and so may be able to help. Current avr8 documentation references the T flag but does not reference isrflag, so this is something that will need to be updated. The file avr8//drivers/generic-isr.asm shows considerable related changes between the releases but I need more time to study it. Best wishes, Tristan [1] https://sourceforge.net/p/amforth/mailman/message/35814877/ |