/** * 타이머 인터럽트의 핸들러 */ 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 kTimerHandler( int iVectorNumber ) { char vcBuffer[] = "[INT: , ]"; static int g_iTimerInterruptCount = 0; int iIRQ; BYTE bCurrentAPICID; //========================================================================= // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분 // 인터럽트 벡터를 화면 오른쪽 위에 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 ); //========================================================================= // 인터럽트 벡터에서 IRQ 번호 추출 iIRQ = iVectorNumber - PIC_IRQSTARTVECTOR; // EOI 전송 kSendEOI( iIRQ ); // 인터럽트 발생 횟수를 업데이트 kIncreaseInterruptCount( iIRQ ); // IRQ 0 인터럽트 처리는 Bootstrap Processor만 처리 bCurrentAPICID = kGetAPICID(); if( bCurrentAPICID == 0 ) { // 타이머 발생 횟수를 증가 g_qwTickCount++; } // 태스크가 사용한 프로세서의 시간을 줄임 kDecreaseProcessorTime( bCurrentAPICID ); // 프로세서가 사용할 수 있는 시간을 다 썼다면 태스크 전환 수행 if( kIsProcessorTimeExpired( bCurrentAPICID ) == TRUE ) { kScheduleInInterrupt(); } }