g_harrison@vger.nsu.edu (George C. Harrison, Norfolk State University) (03/16/91)
Ada teachers and Real-Time types - I'd like some helpful hints about how to handle an "immediate get" type of procedure in a tasking environment. By "immediate get" (IGET) I mean the ability to read a character directly from the keyboard without pressing the return key. Some, if not most, implementations of Ada have the ability to do such a reading albeit indirectly. Here's the "problem." Doing an IGET inside a task generally causes the other tasks to wait until the user presses a key. In my real time simulations for my students when they must act as monitors or interrups it would be nice to have the program run with all its tasks until a key is pressed (and then read, if necessary). Do-While Jones in "Ada in Action" proposes a solution similar to the following: Define a function KEYPRESSED (boolean) and an IGET procedure that only works when KEYPRESSED is TRUE. These subroutines call a task which essentially holds the incoming character as the value of a local [task] variable, setting KEYPRESSED to true until the character is retrieved from the task. So another task might do this: loop do_stuff; if keypressed then iget(ch); do_something_with_ch; else do_something_else; end if; end loop; I welcome any and all ideas. I have used the Do-While Jones method, but it seems to have a lot of overhead. George -- George C. Harrison ----------------------- ----- Professor of Computer Science ----------------------- ----- Norfolk State University ----------------------- ----- 2401 Corprew Avenue, Norfolk, Virginia 23504 ----------------------- ----- INTERNET: g_harrison@vger.nsu.edu ---------------------------------
loftus@wpllabs.UUCP (William Loftus) (03/19/91)
In article <739.27e1226c@vger.nsu.edu> g_harrison@vger.nsu.edu (George C. Harrison, Norfolk State University) writes: >Ada teachers and Real-Time types - > >Do-While Jones in "Ada in Action" proposes a solution similar to the following: > >Define a function KEYPRESSED (boolean) and an IGET procedure that only works >when KEYPRESSED is TRUE. These subroutines call a task which essentially holds >the incoming character as the value of a local [task] variable, setting >KEYPRESSED to true until the character is retrieved from the task. > >So another task might do this: > >loop > do_stuff; > if keypressed then > iget(ch); > do_something_with_ch; > else > do_something_else; > end if; >end loop; > >I welcome any and all ideas. I have used the Do-While Jones method, but it >seems to have a lot of overhead. It does have a lot of overhead. In many real-time systems the cost of executing "keypressed" is too much. If the call to keypressed is 100ms and you need to process a user typing (i.e. ~50 wpm) and other information you are devoting 1/2 sec/sec to processing keystrokes (these numbers come from a project that I am currently working on). Fortunately, keystrokes are often interrupts, and many Ada systems allow the mapping of interrupts to task entries. Using this approach the task (see below for a quick example) waits (allowing other tasks to execute) for a rendezvous from the system software and is not constantly polling for keystroke availability. task Keystroke is entry Key (Code : Byte); end Keystroke; task body Keystroke is Stroke : Byte; begin loop accept Key (Code : Byte) do Stroke := Code; end accept; Rest_Of_System.Process_Keystroke (Stroke); end loop; end Keystroke; -- William Loftus (215) 668 3661 WPL Laboratories, Inc. UUCP: loftus@wpllabs.UUCP P.O. Box 111 ARPA: loftus!wpllabs@prc.unisys.com 216 Wynne Lane Penn Valley, PA 19072 Ada and Unix Software Consultants