본문 바로가기
전자공학

RTOS의 예제 코드

by 무에서 2017. 10. 6.
반응형

RTOS (Real-time OS)에서 프로그램을 작성하는 방법은 PC에서 사용되는 MS 윈도우나 리눅스와 다르다. 그래서, 처음 RTOS를 접할 때 RTOS에서 프로그래밍하는 개념을 이해하기 어려울 수 있다.


내부 소스 코드가 오픈된 RTOS가 있고, 바이너리 파일로 소소 코드가 감춰진 RTOS가 있다. FreeRTOS는 소스 코드가 오픈 되어 있고 VxWorks는 바이너리 파일로 숨겨져 있다.


오픈소스 RTOS인 FreeRTOS의 예제 프로그램의 코드는 다음과 같다.


1. 프로그램은 main 함수에서 시작한다.


2. 처음에 FreeRTOS의 시스템 초기화 함수를 실행한다. 


3. xTaskCreate 함수로 태스크를 정의한다. 아래코드에서 "Check"이라는 태스크와 "LCD"라는 태스크 2개를 정의했다. 각각의 태스크는 vCheckTask와 vLCDTask라는 함수로 구현한다.


4. vTaskStartScheduler라는 FreeRTOS 내부 함수를 호출하여 2개의 태스크를 번갈아 가며 실행한다.


대부분의 경우 사용자가 실제 코딩해야 하는 부분은 xTaskCreate 함수을 호출하는 부분과 각 태스크의 함수이다. 나머지 부분은 거의 정해져 있다. (아래 코드에서 빨강색과 파랑색 부분만 코딩하면 된다.)


 

int main( void )

{

  prvSetupHardware();


  xLCDQueue = xQueueCreate( mainLCD_QUEUE_SIZE, sizeof( xLCDMessage ) );


   vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );

  vCreateBlockTimeTasks();

  vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );

  vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );

  vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY );

   vStartLEDFlashTasks( mainFLASH_TASK_PRIORITY );

  vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );


  xTaskCreate( vCheckTask, "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );

   xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );


  vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );


  vSetupTimerTest();


   vTaskStartScheduler();


   return 0;

}


/*-----------------------------------------------------------*/

// Task#1

void vLCDTask( void *pvParameters )

{

  xLCDMessage xMessage;


   prvConfigureLCD();

   LCD_DrawMonoPict( ( unsigned long * ) pcBitmap );

   for( ;; )

   {

      while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS );

      printf( ( char const * ) xMessage.pcMessage );

   }

}


/*-----------------------------------------------------------*/

// Task#2

static void vCheckTask( void *pvParameters )

{

  TickType_t xLastExecutionTime;

  xLCDMessage xMessage;

  static signed char cPassMessage[ mainMAX_MSG_LEN ];

  extern unsigned short usMaxJitter;


  xLastExecutionTime = xTaskGetTickCount();

  xMessage.pcMessage = cPassMessage;


  for( ;; )

  {

    vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY );


    if( xAreBlockingQueuesStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN BLOCK Q\n";

    }

    else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN BLOCK TIME\n";

    }

    else if( xAreSemaphoreTasksStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN SEMAPHORE\n";

    }

    else if( xArePollingQueuesStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN POLL Q\n";

    }

    else if( xIsCreateTaskStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN CREATE\n";

    }

    else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )

    {

      xMessage.pcMessage = "ERROR IN MATH\n";

    }

       else if( xAreComTestTasksStillRunning() != pdTRUE )

       {

          xMessage.pcMessage = "ERROR IN COM TEST\n";

       }

       else

       {

         sprintf( ( char * ) cPassMessage, "PASS [%uns]\n", ( ( unsigned long ) usMaxJitter ) * mainNS_PER_CLOCK );

        }


     xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );

  }

}



이와 같은 코드는 PC에서 컴파일하면 헥사 파일이 생성되고, 헥사 파일은 라이팅 툴로 임베디드 보드의 플래시에 라이팅 한다.



반응형

'전자공학' 카테고리의 다른 글

자동차 통신 방식  (0) 2017.10.08
우리나라 라디오 주파수  (0) 2017.10.06
솔레노이드(Solenoid)의 인덕턴스  (0) 2017.10.05
정전용량식 근접센서의 원리  (0) 2017.10.05
PLL (Phase-Locked Loop) 이해  (0) 2017.10.03

댓글