- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
TEST11.C
资源名称:ertos.rar [点击查看]
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:
操作系统开发
开发平台:
DOS
- /**************************************************************************/
- /* test11 - demonstrate IRQ handling */
- /**************************************************************************/
- #include "rtos.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <dos.h>
- bq_str *bq = NULL; /* byte queue to hold input */
- void interrupt (*oldisr)() = NULL;
- thread_x *kbd_thread;
- #define DATA_PORT 0x60
- #define CTL_PORT 0x61
- #define ACK 0x80
- #define KBDIRQ 1
- /************************************************************************/
- /* my_isr - a simple keyboard handler */
- /************************************************************************/
- void interrupt my_isr(void)
- {
- BYTE data, ctl;
- BYTE nop;
- /* read the data */
- data = inportb( DATA_PORT );
- /* strobe the ACK signal */
- ctl = inportb( CTL_PORT );
- outportb( CTL_PORT, ctl | ACK );
- nop ++; /* need to do something for a tiny delay */
- outportb( CTL_PORT, ctl );
- /* now queue that data */
- bq_sendbyte( bq, data );
- /* send End of Interrupt (EOI) to the controller */
- outportb( 0x20, 0x20 );
- }
- /************************************************************************/
- void isr_setup( void )
- {
- /* the keyboard is on IRQ 1 */
- oldisr = rt_enableirq( KBDIRQ, my_isr );
- }
- /************************************************************************/
- void isr_shutdown( void )
- {
- /* normally we would use rt_disableirq, but instead we want to
- * return to the ISR handler in place before we started, so we
- * do that with rt_enableirq() and the original handler
- */
- rt_enableirq( KBDIRQ, oldisr );
- }
- /************************************************************************/
- void keyboard(DWORD arg)
- {
- BYTE x;
- /* this message automatically gets sent when we terminate */
- kmessage_on_exit( NULL, /* parent */
- EMSG_THREAD_DEAD,
- 0L );
- do {
- bq_readbyte( bq , &x );
- cprintf( "Key %02x was %srn",
- (x & 127), (x & 128) ? "released" : "pressed");
- /* exit on ESC, key 1 */
- if (( x & 127) == 1 ) {
- cputs("ESC... time to exit");
- return; /* note: this sends the termination message */
- }
- } while ( 1 );
- }
- main()
- {
- int value;
- long data;
- rt_init(100);
- bq = bq_alloc( 100 );
- kbd_thread = rt_newthread( keyboard, 2,4096, 0, "keyboard thread" );
- cputs("Press keys and see what codes we get, Esc to exitrn");
- isr_setup();
- /* message gets sent automatically when thread exits - see thread code */
- kreadmessage( &value, &data );
- isr_shutdown();
- }