컨택스트 스위치 발생시 펄스 발생하는데 걸리는 시간과 그냥 만들었을 때 펄스 발생하는데 걸리는 시간을 비교스코프가 없어서 오차있겠지만 그냥 소프트웨어적으로 측정해봄 아두이노 Uno의 경우 스코프로 재면 50마이크로세컨트 차이난다는데 여기에선 70마이크로 세컨드 정도 차이남. // Test to determine context switch time with a semaphore // Connect a scope to pin 13 // Measure difference in time between first pulse with no context switch // and second pulse started in ledControl and ended in ledOffTask. // Difference sho..
LED 2개가 번갈아 가며 켜지는 예제를 세마포어 2개를 이용하여 만들어봤습니다. 세마포어를 얻으면 서로 상대방의 LED를 끄고 자신의 LED를 켜는 구조입니다. 처음에 어쩔 수 없이 한쪽 LED켜는 태스크에 세마포어를 주어서 시작하는 방식을 이용했습니다.. 아직 공부 중이라 이게 올바른 방법인지는 모르겠군요. 많은 구현 방법 중 하나라고 생각됩니다. #include //LED를 연결하는 핀 번호 const uint8_t LED_PIN = 13; const uint8_t LED_PIN2 = 9; //세마포어 핸들을 선언 SemaphoreHandle_t sem; SemaphoreHandle_t sem2; static void Thread1(void* arg) { pinMode(LED_PIN2, OUTPUT..
역시 마찬가지로 아래 포스팅에서 설치했던 라이브러리에 포함되어있던 예제를 분석합니다. 이제 여섯 개가 남았군요.. Arduino Uno에서 freeRTOS 올려보기(http://webnautes.tistory.com/595 ) 우선순위 높은 Thread1이 먼저 실행되지만 사용 가능한 세마포어가 없어 무한정 기다리게 된다. 이때 우선순위 낮은 Thread2가 실행되어 LED 를 켜고 200밀리세컨드 대기했다가 세마포어를 놓아주면 다시 우선순위 높은 Thread1이 실행되어 세마포어를 획득한 후 LED를 끄게 되고 다시 세마포어를 기다리는 상태가 된다. 그러면 다시 Thread2에서 200밀리세컨드 더 기다렸다가 다시 LED를 켜게 된다. 결과적으로 LED를 200밀리세컨드 주기로 깜빡이게 만든다. /* ..
공유자원인 시리얼을 두 개의 태스크가 동시에 기록하면 아래처럼 첫번째 태스크에서 다 기록하기 전에 두번째 태스크가 선점하여 문자열을 출력하는 원치 않은 결과를 얻을 수 있다. 이를 방지하기 위해서 뮤텍스 타입의 세마포어를 사용하여 시리얼을 사용 중일 때에는 다른 태스크가 시리얼에 접근 할 수 없도록 막는다. 정상적으로 수행되는 경우의 결과… /* FreeRTOS.org includes. */ #include "FreeRTOS_AVR.h" //#include "task.h" //#include "semphr.h" /* Compiler includes. */ //#include //#include //화면에 문자열을 출력하는 태스크를 위한 함수 static void prvPrintTask( void *pvP..
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 "..