Page 146 - The Unofficial Guide to Lego Mindstorms Robots
P. 146
135
(table continued from previous page)
Table 6-11. SOUND_PLAY Sounds (continued)
Sound Number Description
2 D escending arpeggio
3 Ascending arpeggio
4 Long low note
5 Quick ascending arpeggio (same as 3 but faster)
The sounds can be either unqueued or q ueued. Unqueued sounds will be played right away if no sound is currently
playing. If a sound i s currently playing (i.e., the sound system is already busy), then the unqueued sound will not be
play ed at all. A queued sound, on the other hand, waits for the sound system to finish whatever it's doing and then plays.
The value of code determines if a sound is queu ed (4003) or unqueued (4004).
SOUND_GET (address --)
This word returns the curr ent state of the sound system to the given variable. You can use the pbFORTH-supplied variable
RCX_SOUND for this word . A zero indicates that the sound system is not busy. Any other value means that the sound system
is busy playing another sound .
Cooperative Multitasking
pbFORTH version 1. 0.5 introduced words that support cooperative multitasking. Cooperative multitasking allows multiple
tasks to appear to run simultaneously. In rea lity, each task must voluntarily yield control to the next task in line. The other kind
of multitasking, wh ich you've seen in NQ C and will see again in legOS, is called preemptive multitasking. With preemptive
multitasking, the system gives litt le bits of time to each task, interrupting each task to give control to the next task. Cooperative
multitasking is a little tricky to pro gram because each task needs to explicitly yield control to the other tasks. If your robot has
a task that is going to do any lengthy pro cessing, the task needs to be structured so that it can yield control frequently.
The pbFORTH w eb page has more information on cooperative multitasking. Take a look at the tortask.txt example, which is a
good dem onstratio n of the use of multiple tasks in pbFORTH.
The basic procedure for running a multitasking program has four steps:
1 . First, you need to a llocate space for each task using the ALLOT_TASK word. This includes space for user variables and
space for a parameter and return stack. Here's a sample from tortask.txt:
0 32 CELLS 32 CELLS ALLOT_TASK MOTOR_TASK