반응형

 

여섯번째 예제는 딜레이없이 계속 두 개의 태스크가 문자열을 출력하는 상황에서 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() {}  


반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


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

+ Recent posts