In the late 1970s Digitial Equipment Corporation (now part of HP by way of Compaq) introduced a "smart" terminal called the VT100; its smart feature was cursor addressing. There were keys added to its keyboard that sent several characters at once. The first character was always ESCAPE, so these key sequences were called escape codes.
The first escape codes moved the cursor around the display. They were used more often by programs that by users. Without cursor adderssing it was necessary to write 80 X 24 characters to make a change to the display, even if only 2 characters were changing. With cursor addressing an escape codes could put the cursor in the right place and send the characters to be changed.
Escape codes vary from one terminal program to another with a common core which is the set created for the VT100.
How does one keep time in a computer?
In practice, how do you find out the time for a0?
In practice, how do you know that you are keeping accurate time?
This is used to synchronize with an external event, minimizing response time. This bit of code waits for something to be ready then does something as soon at whatever it is is ready.
#define FOREVER for( ; ; ) FOREVER { if ( ready( ) ) do-it( ); }Actually, the code above does not necessarily work. Almost every compiler that optimizes even a little will convert the above code to
if ( ready( ) ) do-it( );The compiler does not know that a value inside ready( ) will change without an assignment.
Note. The volatile
keyword is one way of controlling
the compiler.
Let's suppose
int ready( ) { return *status-addr >> # & 1;which the compiler will in-line.
Exercise for the reader. What is the longest possible time between
the ready-bit setting and execution of the first instruction of
do-it
. Case 1: do-it inlined; case 2: do-it run as
a function.
What if the CPU has to three things at once?
E.g.,
To understand this problem we need to do a little mental arithmetic to see, for example, how long the CPU would spend busy-waiting.
Four questions.
Polling loops allow you to manage more than one condition/activity pair at the same time.
The basic polling loop
FOREVER { if( c1 ) a1; if( c2 ) a2; ... if( cN ) aN; }
if( c<n>
) +
execution time of a<n>}
Suppose you put busy-wait I/O to the train controller into an action
Will you catch it in your testing?
Suppose you want a better response time for a1. Then try the loop
FOREVER { if( c1 ) a1; if( c2 ) a2; if( c1 ) a1; if( c3 ) a3; ... if( c1 ) a1; if( cN ) aN; }
Worst case response time for a1
if( c1 )
+ maximum over n of execution
time for if( cn ) an
Suppose the response time is still too long, because the execution of one action, say a2, is too long. Then you can break a2 into two parts
FOREVER { if( c1 ) a1; if( c2 ) { a2.1; half-done = TRUE; } if( c1 ) a1; if( half-done ) { a2.2; half-done = FALSE; } ... }
This is strarting to get a little complicated and we haven't said anything about inter-action communication. How would you accomplish that?
Return to: