아두이노 freeRTOS 튜토리얼 8Arduino FreeRTOS2015. 1. 15. 09:40
Table of Contents
반응형
우선순위 높은 태스크1만 실행되야 하는데 태스크 1에서 태스크2의 우선순위를 높여서 태스크 2를 실행되도록 하고 태스크1은 우선순위가 그보다 낮아서 실행이 안됩니다.
다시 태스크 2에서 자신의 우선순위를 낮추어서 태스크1만 실행되게 해주는데 결국 태스크1과 태스크2가 번갈아 가며 실행되게 됩니다. 첨에 이해가 잘 안되서 단계별로 코드를 나누어서 분석해봤습니다.
1단계
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- //두 개의 태스크 함수 선언
- void vTask1( void *pvParameters );
- void vTask2( void *pvParameters );
- // 태스크2의 핸들을 저장하기 위해 사용됨
- //Used to hold the handle of Task2. */
- TaskHandle_t xTask2Handle;
- /*-----------------------------------------------------------*/
- void setup( void )
- {
- Serial.begin(9600);
- //첫번째 태스크는 우선순위 2로 해서 생성한다.
- xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );
- //두번째 태스크는 우선순위를 낮추어 1로 생성한다.
- //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다.
- xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- void vTask1( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.
- //두 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );
- }
- }
- /*-----------------------------------------------------------*/
- void vTask2( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );
- }
- }
- /*-----------------------------------------------------------*/
- void loop() {}
우선순위 높은 태스크 1만 계속 실행된다.
2단계
태스크1에서 태스크2의 우선순위를 자신보다 높게 해줍니다.(55~56줄)
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- //두 개의 태스크 함수 선언
- void vTask1( void *pvParameters );
- void vTask2( void *pvParameters );
- // 태스크2의 핸들을 저장하기 위해 사용됨
- //Used to hold the handle of Task2. */
- TaskHandle_t xTask2Handle;
- /*-----------------------------------------------------------*/
- void setup( void )
- {
- Serial.begin(9600);
- //첫번째 태스크는 우선순위 2로 해서 생성한다.
- xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );
- //두번째 태스크는 우선순위를 낮추어 1로 생성한다.
- //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다.
- xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- void vTask1( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.
- //두 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );
- //태스크2의 우선순위를 태스크1의 우선순위보다 높게 만들것이다.
- //따라서 태스크 2가 높은 우선순위로 실행되어 질것이다.
- vPrintStringAndNumber( "About to raise the Task2 priority\r\n",( uxPriority + 1 ) );
- vTaskPrioritySet( xTask2Handle, ( uxPriority + 1 ) );
- }
- }
- /*-----------------------------------------------------------*/
- void vTask2( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- // For this task to reach this point Task1 must have already run and
- //set the priority of this task higher than its own.
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );
- }
- }
- /*-----------------------------------------------------------*/
- void loop() {}
태스크 1에서 태스크2의 우선순위를 자신보다 높게 올렸기 때문에 태스크 2만 실행된다.
3단계
태스크2에서 다시 자신의 우선순위를 태스크1보다 낮게 만듭니다.(79~80줄)
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- //두 개의 태스크 함수 선언
- void vTask1( void *pvParameters );
- void vTask2( void *pvParameters );
- // 태스크2의 핸들을 저장하기 위해 사용됨
- //Used to hold the handle of Task2. */
- TaskHandle_t xTask2Handle;
- /*-----------------------------------------------------------*/
- void setup( void )
- {
- Serial.begin(9600);
- //첫번째 태스크는 우선순위 2로 해서 생성한다.
- xTaskCreate( vTask1, "Task 1", 200, NULL, 2, NULL );
- //두번째 태스크는 우선순위를 낮추어 1로 생성한다.
- //핸들을 얻기 위해서 xTaskHandle 변수의 주소를 넘겨주고 있다.
- xTaskCreate( vTask2, "Task 2", 200, NULL, 1, &xTask2Handle );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- void vTask1( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //태스크2보다 높은 우선순위를 가지고 있기 때문에 항상 먼저 실행될 것이다.
- //두 개의 태스크 모두 블럭되지 않는 다면 항상 실행상태 혹은 준비 상태일 것이다.
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task1 is running\r\n", uxPriority );
- //태스크2의 우선순위를 태스크1의 우선순위보다 높게 만들것이다.
- //따라서 태스크 2가 높은 우선순위로 실행되어 질것이다.
- vPrintStringAndNumber( "About to raise the Task2 priority\r\n",( uxPriority + 1 ) );
- vTaskPrioritySet( xTask2Handle, ( uxPriority + 1 ) );
- }
- }
- /*-----------------------------------------------------------*/
- void vTask2( void *pvParameters )
- {
- unsigned portBASE_TYPE uxPriority;
- //인자가 NULL이므로 호출한 태스크의 우선순위를 반환한다.
- uxPriority = uxTaskPriorityGet( NULL );
- for( ;; )
- {
- // For this task to reach this point Task1 must have already run and
- //set the priority of this task higher than its own.
- //태스크의 이름을 출력한다.
- vPrintStringAndNumber( "Task2 is running\r\n",uxPriority );
- //자신의 우선순위를 낮춘다.
- //태스크1의 우선순위보다 낮아지게되면 태스크1이 즉시 실행될 것이다.
- vPrintStringAndNumber( "About to lower the Task2 priority\r\n",( uxPriority - 2 ) );
- vTaskPrioritySet( NULL, ( uxPriority - 2 ) );
- }
- }
- /*-----------------------------------------------------------*/
- void loop() {}
다시 태스크2에서 자신의 우선순위를 태스크1보다 낮게 낮추었기 때문에 태스크 1이 실행된다. 이젠 태스트1->태스크2->태스크1이 반복적으로 실행되게 된다.
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 10 (0) | 2015.01.15 |
---|---|
아두이노 freeRTOS 튜토리얼 9 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 7 (0) | 2015.01.14 |
아두이노 freeRTOS 튜토리얼 6 (0) | 2015.01.14 |
아두이노 freeRTOS 튜토리얼 5 (0) | 2015.01.14 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!