Periodic태스크에서 주기적으로 소프트웨어적으로 인터럽트를 발생시킨다. 인터럽트가 발생하면 인터럽트를 위한 서비스 루틴인 vExampleInterruptHandler함수가 호출되어 세마포어를 놓아주고 컨택스트 스위치를 한다. 바로 Handler 태스크에서 세마포어를 획득하고는 필요한 처리작업을 하게 된다. 이후 다시 세마포어를 기다리는 블록상태에 빠지고 다시 Periodic태스크에서 인터럽트 발생 후 해야 할 작업을 이어서 계속한다. 지난번 예제와 차이점이 있다면 한번에 세마포어를 세 개씩 주지만 이벤트를 놓치지 않고 잘 처리해주는 것이다. Handler에서 작업하던 중 인터럽트가 발생되면 다시 Handler를 처리하려 하고 하다 보니 결국 마지막에 발생한 인터럽트 처리부터 하기 때문에 count값이..
Periodic태스크에서 주기적으로 소프트웨어적으로 인터럽트를 발생시킨다. 인터럽트가 발생하면 인터럽트를 위한 서비스 루틴인 vExampleInterruptHandler함수가 호출되어 세마포어를 놓아주고 컨택스트 스위치를 한다. 바로 Handler 태스크에서 세마포어를 획득하고는 필요한 처리작업을 하게 된다. 이후 다시 세마포어를 기다리는 블록상태에 빠지고 다시 Periodic태스크에서 인터럽트 발생 후 해야 할 작업을 이어서 계속한다. /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "semphr.h" //#include "portasm.h" /* Demo includes. */ #include "..
큐에 값을 넣는 태스크를 두 개 선언하는데 파라메터로 자신을 나타내는 ID와 출력할 값을 구조체에 넣어 넘겨줍니다. 다른 하나의 태스크가 구조체를 꺼내어 ID와 값을 출력합니다. /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "queue.h" /* Demo includes. */ #include "basic_io_avr.h" #define mainSENDER_1 1 #define mainSENDER_2 2 //큐에 값을 넣는 함수 static void vSenderTask( void *pvParameters ); //큐에서 값을 가져오는 함수 static void vReceiverTask( void..
5개까지 값을 넣을 수 있는 큐를 하나 생성하고 3개의 태스크가 각각 100,200,300이라는 값을 넣습니다. 또 다른 태스크 하나가 실행되어 큐에서 데이터를 꺼내와 화면에 뿌려줍니다. /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "queue.h" /* Demo includes. */ #include "basic_io_avr.h" //큐에 값을 기록하는 함수 static void vSenderTask( void *pvParameters ); //큐에서 값을 꺼내오는 함수 static void vReceiverTask( void *pvParameters ); /*-------------------..
태스크 1이 실행되면 자신보다 우선순위 높은 태스크 2를 생성한다. 그러면 태스크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 ); //Task2에 대한 핸들을 저장할 변수 선언 TaskHandle_t xTask2Handle; /*----..
우선순위 높은 태스크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..