TEST11.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  1. /**************************************************************************/
  2. /* test11 - demonstrate IRQ handling                                      */
  3. /**************************************************************************/
  4. #include "rtos.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <dos.h>
  8. bq_str *bq = NULL;          /* byte queue to hold input */
  9. void interrupt (*oldisr)() = NULL;
  10. thread_x *kbd_thread;
  11. #define DATA_PORT 0x60
  12. #define CTL_PORT  0x61
  13. #define ACK       0x80
  14. #define KBDIRQ    1
  15. /************************************************************************/
  16. /* my_isr - a simple keyboard handler                                   */
  17. /************************************************************************/
  18. void interrupt my_isr(void)
  19. {
  20.     BYTE data, ctl;
  21.     BYTE nop;
  22.     /* read the data */
  23.     data = inportb( DATA_PORT );
  24.     /* strobe the ACK signal */
  25.     ctl = inportb( CTL_PORT );
  26.     outportb( CTL_PORT, ctl | ACK );
  27.     nop ++;     /* need to do something for a tiny delay */
  28.     outportb( CTL_PORT, ctl );
  29.     /* now queue that data */
  30.     bq_sendbyte( bq, data );
  31.     /* send End of Interrupt (EOI) to the controller */
  32.     outportb( 0x20, 0x20 );
  33. }
  34. /************************************************************************/
  35. void isr_setup( void )
  36. {
  37.     /* the keyboard is on IRQ 1 */
  38.     oldisr = rt_enableirq( KBDIRQ, my_isr );
  39. }
  40. /************************************************************************/
  41. void isr_shutdown( void )
  42. {
  43.     /* normally we would use rt_disableirq, but instead we want to
  44.      * return to the ISR handler in place before we started, so we
  45.      * do that with rt_enableirq() and the original handler
  46.      */
  47.     rt_enableirq( KBDIRQ, oldisr );
  48. }
  49. /************************************************************************/
  50. void keyboard(DWORD arg)
  51. {
  52.     BYTE x;
  53.     /* this message automatically gets sent when we terminate */
  54.     kmessage_on_exit( NULL, /* parent */
  55.                       EMSG_THREAD_DEAD,
  56.                       0L );
  57.     do {
  58.         bq_readbyte( bq , &x );
  59.         cprintf( "Key %02x was %srn",
  60.             (x & 127), (x & 128) ? "released" : "pressed");
  61.         /* exit on ESC, key 1 */
  62.         if (( x & 127) == 1 ) {
  63.             cputs("ESC... time to exit");
  64.             return;     /* note: this sends the termination message */
  65.         }
  66.     } while ( 1 );
  67. }
  68. main()
  69. {
  70.     int value;
  71.     long data;
  72.     rt_init(100);
  73.     bq = bq_alloc( 100 );
  74.     kbd_thread = rt_newthread( keyboard, 2,4096, 0, "keyboard thread" );
  75.     cputs("Press keys and see what codes we get, Esc to exitrn");
  76.     isr_setup();
  77.     /* message gets sent automatically when thread exits - see thread code */
  78.     kreadmessage( &value, &data );
  79.     isr_shutdown();
  80. }