/** * 키보드 인터럽트의 핸들러 */ void kKeyboardHandler( int iVectorNumber ) { char vcBuffer[] = "[INT: , ]"; static int g_iKeyboardInterruptCount = 0; BYTE bTemp; //========================================================================= // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분 // 인터럽트 벡터를 화면 왼쪽 위에 2자리 정수로 출력 vcBuffer[ 5 ] = '0' + iVectorNumber / 10; vcBuffer[ 6 ] = '0' + iVectorNumber % 10; // 발생한 횟수 출력 vcBuffer[ 8 ] = '0' + g_iKeyboardInterruptCount; g_iKeyboardInterruptCount = ( g_iKeyboardInterruptCount + 1 ) % 10; kPrintStringXY( 0, 0, vcBuffer ); //========================================================================= // 키보드 컨트롤러에서 데이터를 읽어서 ASCII로 변환하여 큐에 삽입 if( kIsOutputBufferFull() == TRUE ) { bTemp = kGetKeyboardScanCode(); kConvertScanCodeAndPutQueue( bTemp ); } // EOI 전송 kSendEOIToPIC( iVectorNumber - PIC_IRQSTARTVECTOR ); }
// 키보드 인터럽트 핸들러 void kKeyboardHandler(int iVectorNumber) { char vcBuffer[] = "[INT: , ]"; static int g_iKeyboardInterruptCount = 0; BYTE bTemp; //============================================================ // Interrupt 발생 메시지 출력 // Interrupt Vector 출력 vcBuffer[5] = '0' + iVectorNumber / 10; vcBuffer[6] = '0' + iVectorNumber % 10; // Interrupt 발생 횟수 출력 vcBuffer[8] = '0' + g_iKeyboardInterruptCount; g_iKeyboardInterruptCount = (g_iKeyboardInterruptCount + 1) % 10; kPrintString(0, 0, vcBuffer); //============================================================ // 키보드 컨트롤러에서 데이터를 읽어서 ASCII로 변환하여 큐에 삽입 if(kIsOutputBufferFull() == TRUE) { bTemp = kGetKeyboardScanCode(); kConvertScanCodeAndPutQueue(bTemp); } // Send EOI. kSendEOIToPIC(iVectorNumber - PIC_IRQSTARTVECTOR); }
/** * 타이머 인터럽트의 핸들러 */ void kTimerHandler( int iVectorNumber ) { char vcBuffer[] = "[INT: , ]"; static int g_iTimerInterruptCount = 0; //========================================================================= // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분 // 인터럽트 벡터를 화면 오른쪽 위에 2자리 정수로 출력 vcBuffer[ 5 ] = '0' + iVectorNumber / 10; vcBuffer[ 6 ] = '0' + iVectorNumber % 10; // 발생한 횟수 출력 vcBuffer[ 8 ] = '0' + g_iTimerInterruptCount; g_iTimerInterruptCount = ( g_iTimerInterruptCount + 1 ) % 10; kPrintStringXY( 70, 0, vcBuffer ); //========================================================================= // EOI 전송 kSendEOIToPIC( iVectorNumber - PIC_IRQSTARTVECTOR ); // 타이머 발생 횟수를 증가 g_qwTickCount++; // 태스크가 사용한 프로세서의 시간을 줄임 kDecreaseProcessorTime(); // 프로세서가 사용할 수 있는 시간을 다 썼다면 태스크 전환 수행 if( kIsProcessorTimeExpired() == TRUE ) { kScheduleInInterrupt(); } }
/** * 하드 디스크에서 발생하는 인터럽트의 핸들러 */ void kHDDHandler( int iVectorNumber ) { char vcBuffer[] = "[INT: , ]"; static int g_iHDDInterruptCount = 0; BYTE bTemp; //========================================================================= // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분 // 인터럽트 벡터를 화면 왼쪽 위에 2자리 정수로 출력 vcBuffer[ 5 ] = '0' + iVectorNumber / 10; vcBuffer[ 6 ] = '0' + iVectorNumber % 10; // 발생한 횟수 출력 vcBuffer[ 8 ] = '0' + g_iHDDInterruptCount; g_iHDDInterruptCount = ( g_iHDDInterruptCount + 1 ) % 10; // 왼쪽 위에 있는 메시지와 겹치지 않도록 (10, 0)에 출력 kPrintStringXY( 10, 0, vcBuffer ); //========================================================================= // 첫 번째 PATA 포트의 인터럽트 발생 여부를 TRUE로 설정 kSetHDDInterruptFlag( TRUE, TRUE ); // PIC 컨트롤러로 EOI 전송 kSendEOIToPIC( iVectorNumber - PIC_IRQSTARTVECTOR ); // 로컬 APIC로 EOI 전송 kSendEOIToLocalAPIC(); }
/** * 현재 인터럽트 모드에 맞추어 EOI를 전송 */ void kSendEOI( int iIRQ ) { // 대칭 I/O 모드가 아니면 PIC 모드이므로, PIC 컨트롤러로 EOI를 전송해야 함 if( gs_stInterruptManager.bSymmetricIOMode == FALSE ) { kSendEOIToPIC( iIRQ ); } // 대칭 I/O 모드이면 로컬 APIC로 EOI를 전송해야 함 else { kSendEOIToLocalAPIC(); } }
// 공용 Interrupt Handler void kCommonInterruptHandler(int iVectorNumber) { char vcBuffer[] = "[INT: , ]"; static int g_iCommonInterruptCount = 0; //============================================================ // Interrupt 발생 메시지 출력 // Interrupt Vector 출력 vcBuffer[5] = '0' + iVectorNumber / 10; vcBuffer[6] = '0' + iVectorNumber % 10; // Interrupt 발생 횟수 출력 vcBuffer[8] = '0' + g_iCommonInterruptCount; g_iCommonInterruptCount = (g_iCommonInterruptCount + 1) % 10; kPrintString(70, 0, vcBuffer); //============================================================ // Send EOI. kSendEOIToPIC(iVectorNumber - PIC_IRQSTARTVECTOR); }
/** * 공통으로 사용하는 인터럽트 핸들러 */ void kCommonInterruptHandler( int iVectorNumber ) { char vcBuffer[] = "[INT: , ]"; static int g_iCommonInterruptCount = 0; //========================================================================= // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분 // 인터럽트 벡터를 화면 오른쪽 위에 2자리 정수로 출력 vcBuffer[ 5 ] = '0' + iVectorNumber / 10; vcBuffer[ 6 ] = '0' + iVectorNumber % 10; // 발생한 횟수 출력 vcBuffer[ 8 ] = '0' + g_iCommonInterruptCount; g_iCommonInterruptCount = ( g_iCommonInterruptCount + 1 ) % 10; kPrintStringXY( 70, 0, vcBuffer ); //========================================================================= // EOI 전송 kSendEOIToPIC( iVectorNumber - PIC_IRQSTARTVECTOR ); }