반응형

 

여섯번째 예제는 딜레이없이 계속 두 개의 태스크가 문자열을 출력하는 상황에서 vTaskDelayUntil함수를 사용하여 정확히 500밀리세컨드마다 자신의 문자열을 출력하려는 태스크의 동작을 보여줍니다. 얼마나 오차가 생기는지 볼려고 주기적으로 실행되는 태스크에서 밀리세컨드로 스케줄러가 시작된 이후로 지난 시간을 출력해봤습니다.

 

초반에는 0, 500, 1001로 거의 500밀리세컨드마다 실행되는듯 하지만..

 

 

좀 지나면 24017, 24521, 25025로 오차가 약간 커지는걸 볼 수 있었습니다. freeRTOS함수들은 아직 익숙치 않아서 시간을 Serial.print함수를 이용해서 출력했는데 이로 인해 생긴 오차가 아닐지 약간 걱정이 되네요..

 

 

 

  1. /* FreeRTOS.org includes. */  
  2. #include "FreeRTOS_AVR.h"  
  3. //#include "task.h"  
  4.     
  5. /* Demo includes. */  
  6. #include "basic_io_avr.h"  
  7.     
  8. //태스크에서 사용될 함수  
  9. void vContinuousProcessingTask( void *pvParameters );  
  10. void vPeriodicTask( void *pvParameters );  
  11.     
  12. //태스크로 넘겨줄 문자열 선언  
  13. const char *pcTextForTask1 = "Continuous task 1 running\r\n";  
  14. const char *pcTextForTask2 = "Continuous task 2 running\r\n";  
  15. const char *pcTextForPeriodicTask = "Periodic task is running\r\n";  
  16.     
  17. /*-----------------------------------------------------------*/  
  18.     
  19. void setup( void )  
  20. {  
  21.   Serial.begin(9600);  
  22.       
  23.   //vContinuousProcessingTask 함수를 사용하는  개의 태스크를 각각 우선순위 1 생성  
  24.   xTaskCreate( vContinuousProcessingTask, "Task 1", 200, (void*)pcTextForTask1, 1, NULL );  
  25.   xTaskCreate( vContinuousProcessingTask, "Task 2", 200, (void*)pcTextForTask2, 1, NULL );  
  26.     
  27.   //vPeriodicTask 함수를 사용하는 태스크를 우선순위 2 생성  
  28.   xTaskCreate( vPeriodicTask, "Task 3", 200, (void*)pcTextForPeriodicTask, 2, NULL );  
  29.     
  30.   //스케줄러 시작  
  31.   vTaskStartScheduler();  
  32.     
  33.   for( ;; );  
  34. //  return 0;  
  35. }  
  36. /*-----------------------------------------------------------*/  
  37.     
  38. void vContinuousProcessingTask( void *pvParameters )  
  39. {  
  40.   char *pcTaskName;  
  41.   pcTaskName = ( char * ) pvParameters;  
  42.     
  43.   for( ;; )  
  44.   {    
  45.     //딜레이나 블록킹 없이 계속 반복적으로 출력한다.  
  46.     vPrintString( pcTaskName );  
  47.   }  
  48. }  
  49. /*-----------------------------------------------------------*/  
  50.     
  51. void vPeriodicTask( void *pvParameters )  
  52. {  
  53.    TickType_t xLastWakeTime;  
  54.     
  55.   /* The xLastWakeTime variable needs to be initialized with the current tick 
  56.   count.  Note that this is the only time we access this variable.  From this 
  57.   point on xLastWakeTime is managed automatically by the vTaskDelayUntil() 
  58.   API function. */  
  59.   xLastWakeTime = xTaskGetTickCount();  
  60.     
  61.   /* As per most tasks, this task is implemented in an infinite loop. */  
  62.   for( ;; )  
  63.   {  
  64.        
  65.     //xTaskGetTickCount함수는 vTaskStartScheduler함수가 호출된 이후로부터의  카운터수를 반환한다  
  66.     //정확히 500밀리세컨드마다 출력되는지 확인하려고 추가함.  
  67.     Serial.print( xTaskGetTickCount()/ portTICK_PERIOD_MS );  
  68.         
  69.         
  70.     //태스크 이름을 출력한다  
  71.     vPrintString( "Periodic task is running\r\n" );  
  72.     
  73.     //정확히 500밀리세컨드마다 출력되도록 설정한다.  
  74.     vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_PERIOD_MS ) );  
  75.   }  
  76. }  
  77. //------------------------------------------------------------------------------  
  78. void loop() {}  


반응형

해본 것을 문서화하여 기록합니다.


포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">