[PicForth] Another gotcha- @ and ! can break interrupts
Alex Holden
alex at linuxhacker.org
Sun Nov 14 19:42:38 CET 2004
Here's another gotcha which took me a couple of hours to get to the
bottom of. Sometimes when you do '@' and '!' picforth will ask you to
include libfetch.fs / libstore.fs. These files define words called any-@
and any-! which are sometimes called when you use '@' and '!'. any-@ and
any-! use suspend-interrupts and restore-interrupts to prevent
interrupts from occuring in the middle of a fetch or store. I also used
suspend-interrupts and restore-interrupts to protect a critical section
of my own, which happened to call '@' a couple of times. If
suspend-interrupts is called twice without a restore inbetween, the next
restore-interrupts will restore the state after the first
suspend-interrupts (ie. interrupts-off). So what was happening was that
every time my word with the critical section in it was called, the
interrupt system on the PIC froze solid.
I can think of a few possible solutions:
* Make suspend/restore-interrupts take an argument which is a number
between 0 and 7 that points to which bit in the isr-enabled variable to
use (so system-type stuff could use a different bit in isr-enabled to
user-type stuff).
* Make suspend/restore-interrupts nestable by creating a new variable
which is used to automatically keep track of which bit in the
isr-enabled variable was used by the last save-interrupts.
* Have two versions of suspend/restore-interrupts which use different
bits in isr-enabled - one intended for 'system' type words with critical
sections in them, and one intended for user defined words.
* Simply revise the documentation to warn against using
suspend/restore-interrupts unless you're absolutely certain none of the
words in your critical section also use them (pointing out that even @
and ! aren't safe).
--
------------ Alex Holden - http://www.linuxhacker.org ------------
If it doesn't work, you're not hitting it with a big enough hammer
More information about the PicForth
mailing list