
A Decent Embedded Operating System 113
void
main(void)
{
os.start();
// This point will never be reached.
} /* main() */
Because this is an important piece of code, let me reiterate what you are looking
at. This is an example of the application code you might write as a user of
ADEOS. You begin by including the header file adeos.h and declaring your tasks.
After you declare the tasks and call os.start, the task functions taskAfunction and
taskBfunction will begin to execute (in pseudoparallel). Of course, taskB has the
highest priority of the two (200), so it will get to run first. However, as soon as it
relinquishes control of the processor for any reason, the other task will have a
chance to run as well.
The other situation in which the ADEOS scheduler will not perform a context
switch is during interrupt processing. The operating system tracks the nesting level
of the current interrupt service routine and allows context switches only if the
nesting level is zero. If the scheduler is called from an ISR (as it is during the timer
tick), the bSchedule flag is set to indicate that the scheduler should be called
again as soon as the outermost interrupt handler exits. This delayed scheduling
speeds up interrupt response times throughout the system.
Context Switch
The actual process of changing from one task to another is called a context switch.
Because contexts are processor-specific, so is the code ...