우선순위 높은 태스크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..
태스크들이 딜레이 함수에 의해서 대기상태가 되면 IDLE 태스크가 실행되면서 후크 함수 vApplicationIdleHook 가 호출된다. 이때 마다 이 함수 내부에서 카운터를 증가시킨다. 즉 아래에서 보이는 숫자는 후크 함수가 호출된 횟수이다. 두 개의 태스크에서 모두 딜레이 함수를 뺴버리면 후크함수가 한번도 호출되지 않는 것을 볼 수 있다. /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" /* Demo includes. */ #include "basic_io_avr.h" //태스크에서 사용될 함수 void vTaskFunction( void *pvParameters ); //idle task hook 함수에 의해서 ..
여섯번째 예제는 딜레이없이 계속 두 개의 태스크가 문자열을 출력하는 상황에서 vTaskDelayUntil함수를 사용하여 정확히 500밀리세컨드마다 자신의 문자열을 출력하려는 태스크의 동작을 보여줍니다. 얼마나 오차가 생기는지 볼려고 주기적으로 실행되는 태스크에서 밀리세컨드로 스케줄러가 시작된 이후로 지난 시간을 출력해봤습니다. 초반에는 0, 500, 1001로 거의 500밀리세컨드마다 실행되는듯 하지만.. 좀 지나면 24017, 24521, 25025로 오차가 약간 커지는걸 볼 수 있었습니다. freeRTOS함수들은 아직 익숙치 않아서 시간을 Serial.print함수를 이용해서 출력했는데 이로 인해 생긴 오차가 아닐지 약간 걱정이 되네요.. /* FreeRTOS.org includes. */ #incl..
네번째 예제와 달리 두 개의 태스크의 우선순위를 똑같이 하더라도 번갈아가며 실행되는 것을 볼 수 있다. /* FreeRTOS.org includes. */ //#include "FreeRTOS.h" //#include "task.h" #include "FreeRTOS_AVR.h" /* Demo includes. */ #include "basic_io_avr.h" //태스크에서 사용되는 함수 void vTaskFunction( void *pvParameters ); //태스크로 넘겨줄 두 개의 문자열을 선언 const char *pcTextForTask1 = "Task 1 is running\r\n"; const char *pcTextForTask2 = "Task 2 is running\t\n"; /*--..
네번째 예제는 그동안 for문으로 일정시간 대기 했던 것을 vTaskDelay함수를 사용하도록 변경합니다. 두 개의 태스크의 우선순위가 서로 다른 경우에는 번갈아 가며 실행되지만…. 두 개의 태스크의 우선순위가 같으면 for문을 사용했을 때와 달리 똑같은 태스크가 두 번씩 실행되네요. /* FreeRTOS.org includes. */ //#include "FreeRTOS.h" //#include "task.h" #include "FreeRTOS_AVR.h" /* Demo includes. */ #include "basic_io_avr.h" //태스크에서 사용되는 함수 void vTaskFunction( void *pvParameters ); //태스크로 넘겨줄 두 개의 문자열을 선언 const char..
세번째 예제는 똑같이 두 개의 태스크를 실행하는데 우선순위를 다르게 하면 어떻게 되는지를 보여줍니다. 아두이노에 업로드 시켜보며 우선선위가 높은 태스크2만 계속 출력되는 것을 확인할 수 있습니다. 이전 예제들에서는 두 개의 태스크가 모두 우선순위가 같아서 번갈아 문자열이 출력 되었죠. /* FreeRTOS.org includes. */ //#include "FreeRTOS.h" //#include "task.h" #include "FreeRTOS_AVR.h" /* Demo includes. */ #include "basic_io_avr.h" /* Used as a loop counter to create a very crude delay. */ #define mainDELAY_LOOP_COUNT 4000..
두번째 예제에서는 하나의 함수를 구현해놓고 두 개의 태스크에서 같이 사용하는 것을 보여줍니다. 어떤 태스크가 돌고 있는지 구분하기 위해서 파라메터로 문자열을 넘겨주어 태스크가 출력하도록 하고 있습니다. 실행결과는 첫번째 예제와 동일합니다. /* FreeRTOS.org includes. */ //#include "FreeRTOS.h" //#include "task.h" #include "FreeRTOS_AVR.h" /* Demo includes. */ #include "basic_io_avr.h" /* Used as a loop counter to create a very crude delay. */ #define mainDELAY_LOOP_COUNT 400000// ( 0xffffff ) //태스크에서 ..
아래 포스팅으로 설치된 예제코드들을 하나씩 분석해보고 있습니다. 아두이노 코드랑 freeRTOS코드랑 같이 사용하는게 생소하네요. freeRTOS는 각 포팅되는 플랫폼에서 사용되는 함수들하고 같이 사용되어 지는 거 같네요. Arduino Uno에서 freeRTOS 올려보기 http://webnautes.tistory.com/595 첫번째 예제는 두 개의 택스트가 시리얼로 문자열을 출력하는 예제입니다. Task2와 Task1이 번갈아 가며 출력됩니다. /* FreeRTOS.org includes. */ //#include "FreeRTOS.h" //#include "task.h" #include "FreeRTOS_AVR.h" /* Demo includes. */ #include "basic_io_avr.h..
https://github.com/greiman/FreeRTOS-Arduino에서 Download ZIP을 클릭하여 전체 소스를 다운로드 압축을 풀은 후.. 아래 경로에 있는 폴더 세 개를 복사하여 다음 경로에 넣어주었다. 그리고 나서 Arduino IDE를 실행시켜보면 라이브러리가 포함되어 있는 것을 확인해 볼 수 있음. 예제 코드도 추가되어 있음. 쓰레드 2개를 이용하여 LED를 깜빡이게 하는 frBlink예제를 불러와서 업로드 시켜보았다. 그전에 디지털입력 13번에 LED를 연결시켜주어야 함. 잠시 후 LED가 깜빡이기 시작함.