처음 실행시키면 vIntegerGenerator태스크보다 vStringPrinter태스크의 우선순위가 높기때문에 먼저 실행이 되나 큐가 비어있기때문에 블록 상태가 된다. 따라서 vIntegerGenerator태스크가 실행되지만 vTaskDelayUntil함수를 사용했기 때문에 정해준 값인 200밀리세컨드마다 대기상태에서 벗어나와 작업을 시작할 수 있다. vIntegerGenerator에서 증가시킨 정수값을 큐에 넣는 것을 5번 반복한 후 인터럽트를 발생시킨다. 인터럽트 서비스 루틴인 vExampleInterruptHandler 함수가 호출된다. vExampleInterruptHandler에서 정수값을 넣은 큐에서 데이터를 꺼내와서 정수에 대응되는 문자열을 큐에 문자열을 넣는 큐에 넣는다. 정수값을 꺼내오..
여섯번째 예제는 딜레이없이 계속 두 개의 태스크가 문자열을 출력하는 상황에서 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"; /*--..