/** * PIT 컨트롤러의 카운터 0 설정 */ void kSetTimer( const char* pcParameterBuffer ) { char vcParameter[ 100 ]; PARAMETERLIST stList; long lValue; BOOL bPeriodic; // 파라미터 초기화 kInitializeParameter( &stList, pcParameterBuffer ); // milisecond 추출 if( kGetNextParameter( &stList, vcParameter ) == 0 ) { kPrintf( "ex)settimer 10(ms) 1(periodic)\n" ); return ; } lValue = kAToI( vcParameter, 10 ); // Periodic 추출 if( kGetNextParameter( &stList, vcParameter ) == 0 ) { kPrintf( "ex)settimer 10(ms) 1(periodic)\n" ); return ; } bPeriodic = kAToI( vcParameter, 10 ); kInitializePIT( MSTOCOUNT( lValue ), bPeriodic ); kPrintf( "Time = %d ms, Periodic = %d Change Complete\n", lValue, bPeriodic ); }
/** * 태스크의 우선 순위를 변경 */ static void kChangeTaskPriority( const char* pcParameterBuffer ) { PARAMETERLIST stList; char vcID[ 30 ]; char vcPriority[ 30 ]; QWORD qwID; BYTE bPriority; // 파라미터를 추출 kInitializeParameter( &stList, pcParameterBuffer ); kGetNextParameter( &stList, vcID ); kGetNextParameter( &stList, vcPriority ); // 태스크의 우선 순위를 변경 if( kMemCmp( vcID, "0x", 2 ) == 0 ) { qwID = kAToI( vcID + 2, 16 ); } else { qwID = kAToI( vcID, 10 ); } bPriority = kAToI( vcPriority, 10 ); kPrintf( "Change Task Priority ID [0x%q] Priority[%d] ", qwID, bPriority ); if( kChangePriority( qwID, bPriority ) == TRUE ) { kPrintf( "Success\n" ); } else { kPrintf( "Fail\n" ); } }
/** * 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 kKillTask( const char* pcParameterBuffer ) { PARAMETERLIST stList; char vcID[ 30 ]; QWORD qwID; TCB* pstTCB; int i; // 파라미터를 추출 kInitializeParameter( &stList, pcParameterBuffer ); kGetNextParameter( &stList, vcID ); // 태스크를 종료 if( kMemCmp( vcID, "0x", 2 ) == 0 ) { qwID = kAToI( vcID + 2, 16 ); } else { qwID = kAToI( vcID, 10 ); } // 특정 ID만 종료하는 경우 if( qwID != 0xFFFFFFFF ) { pstTCB = kGetTCBInTCBPool( GETTCBOFFSET( qwID ) ); qwID = pstTCB->stLink.qwID; // 시스템 테스트는 제외 if( ( ( qwID >> 32 ) != 0 ) && ( ( pstTCB->qwFlags & TASK_FLAGS_SYSTEM ) == 0x00 ) ) { kPrintf( "Kill Task ID [0x%q] ", qwID ); if( kEndTask( qwID ) == TRUE ) { kPrintf( "Success\n" ); } else { kPrintf( "Fail\n" ); } } else {
/** * 태스크를 생성해서 멀티 태스킹 수행 */ void kCreateTestTask( const char* pcParameterBuffer ) { PARAMETERLIST stList; char vcType[ 30 ]; char vcCount[ 30 ]; int i; // 파라미터를 추출 kInitializeParameter( &stList, pcParameterBuffer ); kGetNextParameter( &stList, vcType ); kGetNextParameter( &stList, vcCount ); switch( kAToI( vcType, 10 ) ) { // 타입 1 태스크 생성 case 1: for( i = 0 ; i < kAToI( vcCount, 10 ) ; i++ ) { if( kCreateTask( 0, ( QWORD ) kTestTask1 ) == NULL ) { break; } } kPrintf( "Task1 %d Created\n", i ); break; // 타입 2 태스크 생성 case 2: default: for( i = 0 ; i < kAToI( vcCount, 10 ) ; i++ ) { if( kCreateTask( 0, ( QWORD ) kTestTask2 ) == NULL ) { break; } } kPrintf( "Task2 %d Created\n", i ); break; } }
/** * 문자열로 된 숫자를 숫자로 변환하여 화면에 출력 */ void kStringToDecimalHexTest( const char* pcParameterBuffer ) { char vcParameter[ 100 ]; int iLength; PARAMETERLIST stList; int iCount = 0; long lValue; // 파라미터 초기화 kInitializeParameter( &stList, pcParameterBuffer ); while( 1 ) { // 다음 파라미터를 구함, 파라미터의 길이가 0이면 파라미터가 없는 것이므로 // 종료 iLength = kGetNextParameter( &stList, vcParameter ); if( iLength == 0 ) { break; } // 파라미터에 대한 정보를 출력하고 16진수인지 10진수인지 판단하여 변환한 후 // 결과를 printf로 출력 kPrintf( "Param %d = '%s', Length = %d, ", iCount + 1, vcParameter, iLength ); // 0x로 시작하면 16진수, 그외는 10진수로 판단 if( kMemCmp( vcParameter, "0x", 2 ) == 0 ) { lValue = kAToI( vcParameter + 2, 16 ); kPrintf( "HEX Value = %q\n", lValue ); } else { lValue = kAToI( vcParameter, 10 ); kPrintf( "Decimal Value = %d\n", lValue ); } iCount++; } }
// Translate number string to number void kStringToDecimalHexTest( const char * pcParameterBuffer ) { char vcParameter[100]; int iLength; PARAMETERLIST stList; int iCount = 0; long lValue; // Initialize parameter kInitializeParameter( &stList, pcParameterBuffer ); while( 1 ) { // Get next parameter iLength = kGetNextParameter( &stList, vcParameter ); if( iLength == 0 ) { break; } // Print information of parameter // Detect 16 or 10 digit kPrintf( "Param %d = '%s', Length = %d, ", iCount + 1, vcParameter, iLength ); // If first is 0x, 16 digit // Other 10 digit if ( kMemCmp( vcParameter, "0x", 2 ) == 0 ) { lValue = kAToI( vcParameter + 2, 16 ); kPrintf( "HEX Value = %q\n", lValue ); } else { lValue = kAToI( vcParameter, 10 ); kPrintf( "Decimal Value = %d\n", lValue ); } iCount++; } }