반응형

 

우선순위 높은 태스크1만 실행되야 하는데 태스크 1에서 태스크2의 우선순위를 높여서 태스크 2를 실행되도록 하고 태스크1은 우선순위가 그보다 낮아서 실행이 안됩니다.

다시 태스크 2에서 자신의 우선순위를 낮추어서 태스크1만 실행되게 해주는데 결국 태스크1과 태스크2가 번갈아 가며 실행되게 됩니다. 첨에 이해가 잘 안되서 단계별로 코드를 나누어서 분석해봤습니다.

 

1단계

  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. // 개의 태스크 함수 선언  
  10. void vTask1( void *pvParameters );  
  11. void vTask2( void *pvParameters );  
  12.     
  13. // 태스크2 핸들을 저장하기 위해 사용됨   
  14. //Used to hold the handle of Task2. */  
  15. TaskHandle_t xTask2Handle;  
  16.     
  17. /*-----------------------------------------------------------*/  
  18.     
  19. void setup( void )  
  20. {  
  21.   Serial.begin(9600);  
  22.       
  23.   //첫번째 태스크는 우선순위 2 해서 생성한다.  
  24.   xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );  
  25.     
  26.   //두번째 태스크는 우선순위를 낮추어 1 생성한다  
  27.   //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다  
  28.   xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );  
  29.       
  30.   //스케줄러를 시작한다.  
  31.   vTaskStartScheduler();  
  32.     
  33.   for( ;; );  
  34. //  return 0;  
  35. }  
  36. /*-----------------------------------------------------------*/  
  37.     
  38. void vTask1( void *pvParameters )  
  39. {  
  40.   unsigned portBASE_TYPE uxPriority;  
  41.     
  42.   //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.  
  43.   // 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.  
  44.       
  45.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  46.   uxPriority = uxTaskPriorityGet( NULL );  
  47.     
  48.   for( ;; )  
  49.   {  
  50.     //태스크의 이름을 출력한다.  
  51.     vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );  
  52.     
  53.   }  
  54. }  
  55.     
  56. /*-----------------------------------------------------------*/  
  57.     
  58. void vTask2( void *pvParameters )  
  59. {  
  60.    unsigned portBASE_TYPE uxPriority;  
  61.     
  62.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  63.   uxPriority = uxTaskPriorityGet( NULL );  
  64.     
  65.   for( ;; )  
  66.   {  
  67.      //태스크의 이름을 출력한다.  
  68.       vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );  
  69.   }  
  70. }  
  71. /*-----------------------------------------------------------*/  
  72. void loop() {}  

우선순위 높은 태스크 1만 계속 실행된다.

 

 

2단계

태스크1에서 태스크2의 우선순위를 자신보다 높게 해줍니다.(55~56줄)

  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. // 개의 태스크 함수 선언  
  10. void vTask1( void *pvParameters );  
  11. void vTask2( void *pvParameters );  
  12.     
  13. // 태스크2 핸들을 저장하기 위해 사용됨   
  14. //Used to hold the handle of Task2. */  
  15. TaskHandle_t xTask2Handle;  
  16.     
  17. /*-----------------------------------------------------------*/  
  18.     
  19. void setup( void )  
  20. {  
  21.   Serial.begin(9600);  
  22.       
  23.   //첫번째 태스크는 우선순위 2 해서 생성한다.  
  24.   xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );  
  25.     
  26.   //두번째 태스크는 우선순위를 낮추어 1 생성한다  
  27.   //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다  
  28.   xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );  
  29.       
  30.   //스케줄러를 시작한다.  
  31.   vTaskStartScheduler();  
  32.     
  33.   for( ;; );  
  34. //  return 0;  
  35. }  
  36. /*-----------------------------------------------------------*/  
  37.     
  38. void vTask1( void *pvParameters )  
  39. {  
  40.   unsigned portBASE_TYPE uxPriority;  
  41.     
  42.   //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.  
  43.   // 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.  
  44.       
  45.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  46.   uxPriority = uxTaskPriorityGet( NULL );  
  47.     
  48.   for( ;; )  
  49.   {  
  50.     //태스크의 이름을 출력한다.  
  51.     vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );  
  52.     
  53.     //태스크2 우선순위를 태스크1 우선순위보다 높게 만들것이다.  
  54.     //따라서 태스크 2 높은 우선순위로 실행되어 질것이다.  
  55.     vPrintStringAndNumber( "About to raise the Task2 priority\r\n",( uxPriority + 1 ) );  
  56.     vTaskPrioritySet( xTask2Handle, ( uxPriority + 1 ) );  
  57.   }  
  58. }  
  59.     
  60. /*-----------------------------------------------------------*/  
  61.     
  62. void vTask2( void *pvParameters )  
  63. {  
  64.    unsigned portBASE_TYPE uxPriority;  
  65.     
  66.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  67.   uxPriority = uxTaskPriorityGet( NULL );  
  68.     
  69.   for( ;; )  
  70.   {  
  71.     // For this task to reach this point Task1 must have already run and  
  72.     //set the priority of this task higher than its own.  
  73.     
  74.      //태스크의 이름을 출력한다.  
  75.       vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );  
  76.     
  77.   }  
  78. }  
  79. /*-----------------------------------------------------------*/  
  80. void loop() {}  

 

태스크 1에서 태스크2의 우선순위를 자신보다 높게 올렸기 때문에 태스크 2만 실행된다.

 

 

3단계

태스크2에서 다시 자신의 우선순위를 태스크1보다 낮게 만듭니다.(79~80줄)

  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. // 개의 태스크 함수 선언  
  10. void vTask1( void *pvParameters );  
  11. void vTask2( void *pvParameters );  
  12.     
  13. // 태스크2 핸들을 저장하기 위해 사용됨   
  14. //Used to hold the handle of Task2. */  
  15. TaskHandle_t xTask2Handle;  
  16.     
  17. /*-----------------------------------------------------------*/  
  18.     
  19. void setup( void )  
  20. {  
  21.   Serial.begin(9600);  
  22.       
  23.   //첫번째 태스크는 우선순위 2 해서 생성한다.  
  24.   xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );  
  25.     
  26.   //두번째 태스크는 우선순위를 낮추어 1 생성한다  
  27.   //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다  
  28.   xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );  
  29.       
  30.   //스케줄러를 시작한다.  
  31.   vTaskStartScheduler();  
  32.     
  33.   for( ;; );  
  34. //  return 0;  
  35. }  
  36. /*-----------------------------------------------------------*/  
  37.     
  38. void vTask1( void *pvParameters )  
  39. {  
  40.   unsigned portBASE_TYPE uxPriority;  
  41.     
  42.   //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.  
  43.   // 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.  
  44.       
  45.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  46.   uxPriority = uxTaskPriorityGet( NULL );  
  47.     
  48.   for( ;; )  
  49.   {  
  50.     //태스크의 이름을 출력한다.  
  51.     vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );  
  52.     
  53.     //태스크2 우선순위를 태스크1 우선순위보다 높게 만들것이다.  
  54.     //따라서 태스크 2 높은 우선순위로 실행되어 질것이다.  
  55.     vPrintStringAndNumber( "About to raise the Task2 priority\r\n",( uxPriority + 1 ) );  
  56.     vTaskPrioritySet( xTask2Handle, ( uxPriority + 1 ) );  
  57.   }  
  58. }  
  59.     
  60. /*-----------------------------------------------------------*/  
  61.     
  62. void vTask2( void *pvParameters )  
  63. {  
  64.    unsigned portBASE_TYPE uxPriority;  
  65.     
  66.   //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다  
  67.   uxPriority = uxTaskPriorityGet( NULL );  
  68.     
  69.   for( ;; )  
  70.   {  
  71.     // For this task to reach this point Task1 must have already run and  
  72.     //set the priority of this task higher than its own.  
  73.     
  74.      //태스크의 이름을 출력한다.  
  75.       vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );  
  76.     
  77.     //자신의 우선순위를 낮춘다.  
  78.     //태스크1 우선순위보다 낮아지게되면 태스크1 즉시 실행될 것이다.  
  79.     vPrintStringAndNumber( "About to lower the Task2 priority\r\n",( uxPriority - 2 ) );  
  80.     vTaskPrioritySet( NULL, ( uxPriority - 2 ) );  
  81.   }  
  82. }  
  83. /*-----------------------------------------------------------*/  
  84. void loop() {}  

 

다시 태스크2에서 자신의 우선순위를 태스크1보다 낮게 낮추었기 때문에 태스크 1이 실행된다. 이젠 태스트1->태스크2->태스크1이 반복적으로 실행되게 된다.

반응형

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

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


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

+ Recent posts