/** * PIT 컨트롤러를 직접 사용하여 ms 동안 대기 */ void kWaitUsingPIT( const char* pcParameterBuffer ) { char vcParameter[ 100 ]; int iLength; PARAMETERLIST stList; long lMillisecond; int i; // 파라미터 초기화 kInitializeParameter( &stList, pcParameterBuffer ); if( kGetNextParameter( &stList, vcParameter ) == 0 ) { kPrintf( "ex)wait 100(ms)\n" ); return ; } lMillisecond = kAToI( pcParameterBuffer, 10 ); kPrintf( "%d ms Sleep Start...\n", lMillisecond ); // 인터럽트를 비활성화하고 PIT 컨트롤러를 통해 직접 시간을 측정 kDisableInterrupt(); for( i = 0 ; i < lMillisecond / 30 ; i++ ) { kWaitUsingDirectPIT( MSTOCOUNT( 30 ) ); } kWaitUsingDirectPIT( MSTOCOUNT( lMillisecond % 30 ) ); kEnableInterrupt(); kPrintf( "%d ms Sleep Complete\n", lMillisecond ); // 타이머 복원 kInitializePIT( MSTOCOUNT( 1 ), TRUE ); }
// Wait for ms by PIT controller void kWaitUsingPIT( const char * pcParameterBuffer ) { char vcParameter[100]; int iLength; PARAMETERLIST stList; long lMillisecond; int i; // Initialize parameter kInitializeParameter( &stList, pcParameterBuffer ); if (kGetNextParameter( &stList, vcParameter ) == 0 ) { kPrintf( "ex) wait 100(ms)\n" ); return; } lMillisecond = kAToI( pcParameterBuffer, 10 ); kPrintf( "%d ms Sleep Start...\n", lMillisecond ); // Disable interrupt and measure the time by PIT controller kDisableInterrupt(); for ( i = 0 ; i < lMillisecond / 30 ; i++ ) { kWaitUsingDirectPIT( MSTOCOUNT( 30 ) ); } kWaitUsingDirectPIT( MSTOCOUNT( lMillisecond % 30 ) ); kEnableInterrupt(); kPrintf( "%d ms Sleep Complete\n", lMillisecond ); // Restore kSetTimer kInitializePIT( MSTOCOUNT( 1 ), TRUE ); }
/** * 프로세서의 속도를 측정 */ static void kMeasureProcessorSpeed( const char* pcParameterBuffer ) { int i; QWORD qwLastTSC, qwTotalTSC = 0; kPrintf( "Now Measuring." ); // 10초 동안 변화한 타임 스탬프 카운터를 이용하여 프로세서의 속도를 간접적으로 측정 kDisableInterrupt(); for( i = 0 ; i < 200 ; i++ ) { qwLastTSC = kReadTSC(); kWaitUsingDirectPIT( MSTOCOUNT( 50 ) ); qwTotalTSC += kReadTSC() - qwLastTSC; kPrintf( "." ); } // 타이머 복원 kInitializePIT( MSTOCOUNT( 1 ), TRUE ); kEnableInterrupt(); kPrintf( "\nCPU Speed = %d MHz\n", qwTotalTSC / 10 / 1000 / 1000 ); }
// Measure the speed of processor void kMeasureProcessorSpeed( const char * pcParameterBuffer ) { int i; QWORD qwLastTSC, qwTotalTSC = 0; kPrintf( "Now Measuring." ); // For 10 seconds, calculate processor speed by measuring the change of time stamp kDisableInterrupt(); for ( i = 0 ; i < 200 ; i++ ) { qwLastTSC = kReadTSC(); kWaitUsingDirectPIT( MSTOCOUNT( 50 ) ); qwTotalTSC += kReadTSC() - qwLastTSC; kPrintf( "." ); } // Restore timer kInitializePIT( MSTOCOUNT( 1 ), TRUE ); kEnableInterrupt(); kPrintf( "\nCPU Speed = %d MHz\n", qwTotalTSC / 10 / 1000 / 1000 ); }