반응형

 

 

세 개의 태스크를 수행한다.

  • LED를 깜빡이게 하는 테스크
  • 현재 남은 스택크기와 힙의 크기를 시리얼로 출력하는 태스크
  • IDLE 루프

 

 

  1. // Simple demo of three threads  
  2. // LED blink thread, print thread, and idle loop  
  3. #include <FreeRTOS_AVR.h>  
  4.     
  5. const uint8_t LED_PIN = 13;  
  6.     
  7. volatile uint32_t count = 0;  
  8.     
  9. // handle for blink task  
  10. TaskHandle_t blink;  
  11.     
  12. //------------------------------------------------------------------------------  
  13. //LED 깜빡이게 하는 태스크가 우선순위가 가장 높다.  
  14. static void vLEDFlashTask(void *pvParameters) {  
  15.   pinMode(LED_PIN, OUTPUT);  
  16.       
  17.   //200밀리세컨드를 주기로 LED 깜빡인다.  
  18.   for (;;) {  
  19.     //LED 켠다.  
  20.     digitalWrite(LED_PIN, HIGH);  
  21.         
  22.     //50밀리세컨드 대기한다.  
  23.     vTaskDelay((50L * configTICK_RATE_HZ) / 1000L);  
  24.         
  25.     //LED 끈다.  
  26.     digitalWrite(LED_PIN, LOW);  
  27.         
  28.     //150밀리세컨드 대기한다.  
  29.     vTaskDelay((150L * configTICK_RATE_HZ) / 1000L);  
  30.   }  
  31. }  
  32. //------------------------------------------------------------------------------  
  33. static void vPrintTask(void *pvParameters) {  
  34.   while (1) {  
  35.     //1초동안 대기한다.  
  36.     vTaskDelay(configTICK_RATE_HZ);  
  37.         
  38.     //이전 초의 카운트를 출력한다.  
  39.     Serial.print(F("Count: "));  
  40.     Serial.print(count);  
  41.         
  42.     // Print unused stack for threads.  
  43.     Serial.print(F(", Unused Stack: blink task="));  
  44.     Serial.print(uxTaskGetStackHighWaterMark(blink));//blink 태스크의 남은 스택 크기 출력  
  45.     Serial.print('/');  
  46.     Serial.print(configMINIMAL_STACK_SIZE + 50); //blink 태스크 생성시 스택 크기  
  47.     Serial.print(" print task=");  
  48.     Serial.print(uxTaskGetStackHighWaterMark(0)); //현재 태스크(print) 남은 스택 크기 출력  
  49.     Serial.print('/');  
  50.     Serial.print(configMINIMAL_STACK_SIZE + 100); //print 태스크 생성시 스택 크기  
  51.     Serial.print(" free heap=");  
  52.     Serial.println(freeHeap()); //남은 heap 크기  
  53.         
  54.     //0으로 카운터 초기화  
  55.     count = 0;  
  56.   }  
  57. }  
  58. //------------------------------------------------------------------------------  
  59. void setup() {  
  60.   Serial.begin(9600);  
  61.   // wait for Leonardo  
  62.   while(!Serial) {}  
  63.     
  64.   //LED 깜빡이게 하는 태스크의 우선순위를 가장 높게 생성  
  65.   xTaskCreate(vLEDFlashTask, "blink", configMINIMAL_STACK_SIZE + 50, NULL,  
  66.     tskIDLE_PRIORITY + 2, &blink);  
  67.     
  68.   //태스크별 남은 스택 크기와 남은 힙의 크기를 출력하는 태스크의 우선 순위가 두번째로 크게 생성   
  69.   xTaskCreate(vPrintTask, "print",    configMINIMAL_STACK_SIZE + 100,  NULL,  
  70.     tskIDLE_PRIORITY + 1, NULL);  
  71.     
  72.     
  73.   //스케줄러를 시작한다  
  74.   vTaskStartScheduler();  
  75.     
  76.   //여기에 도달하면 거의 메모리 부족 때문   
  77.   Serial.println(F("Die"));  
  78.   while(1){  
  79.        Serial.println(F("Die"));  
  80.   }  
  81. }  
  82. //------------------------------------------------------------------------------  
  83. //IDLE 루프는 매우 작은 스택 크기를 가지기 때문에 (configMINIMAL_STACK_SIZE)  
  84. //블럭되면 안됨  
  85. void loop() {  
  86.   while(1) {  
  87.     //카운터하는 사이에 인터럽트가 안걸리도록 조치를함.  
  88.     noInterrupts();//인터럽트를 금지시켰다가  
  89.     count++; //카운터를 증가시키고  
  90.     interrupts();//인터럽트를 다시 가능하도록   
  91.   }  
  92. }  


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


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

+ Recent posts