아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기Arduino FreeRTOS2015. 1. 17. 00:55
Table of Contents
반응형
역시 마찬가지로 아래 포스팅에서 설치했던 라이브러리에 포함되어있던 예제를 분석합니다. 이제 여섯 개가 남았군요..
Arduino Uno에서 freeRTOS 올려보기(http://webnautes.tistory.com/595 )
우선순위 높은 Thread1이 먼저 실행되지만 사용 가능한 세마포어가 없어 무한정 기다리게 된다.
이때 우선순위 낮은 Thread2가 실행되어 LED 를 켜고 200밀리세컨드 대기했다가 세마포어를 놓아주면
다시 우선순위 높은 Thread1이 실행되어 세마포어를 획득한 후 LED를 끄게 되고 다시 세마포어를 기다리는 상태가 된다.
그러면 다시 Thread2에서 200밀리세컨드 더 기다렸다가 다시 LED를 켜게 된다.
결과적으로 LED를 200밀리세컨드 주기로 깜빡이게 만든다.
- /*
- * Example to demonstrate thread definition, semaphores, and thread sleep.
- */
- #include <FreeRTOS_AVR.h>
- //LED를 13번 핀에 연결
- const uint8_t LED_PIN = 13;
- //세마포어 핸들을 선언
- SemaphoreHandle_t sem;
- static void Thread1(void* arg) {
- while (1) {
- //세마포어를 획득할 떄 까지 무한정 기다린다.
- xSemaphoreTake(sem, portMAX_DELAY);
- //LED를 끈다.
- digitalWrite(LED_PIN, LOW);
- }
- }
- //------------------------------------------------------------------------------
- static void Thread2(void* arg) {
- pinMode(LED_PIN, OUTPUT);
- while (1) {
- //LED를 켜고
- digitalWrite(LED_PIN, HIGH);
- //200밀리세컨드 대기한다.
- vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
- //세마포어를 하나 놓아주어서 Thread1이 LED를 끌 수 있도록 한다.
- xSemaphoreGive(sem);
- //200밀리세컨드 대기한다.
- vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
- }
- }
- //------------------------------------------------------------------------------
- void setup() {
- portBASE_TYPE s1, s2;
- Serial.begin(9600);
- //카운팅 세마포어를 생성한다.
- //최대값 1, 초기값 0
- sem = xSemaphoreCreateCounting(1, 0);
- //우선순위 2로 LED끄는 태스크를 생성한다.
- s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL);
- //우선순위 1로 LED켜는 태스크를 생성한다.
- s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- //생성중 에러 발생했는지 체크
- if (sem== NULL || s1 != pdPASS || s2 != pdPASS ) {
- Serial.println(F("Creation problem"));
- while(1);
- }
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- //여기가 실행된다면 메모리 부족 상태
- Serial.println(F("Insufficient RAM"));
- while(1);
- }
- //------------------------------------------------------------------------------
- // WARNING idle loop has a very small stack (configMINIMAL_STACK_SIZE)
- // loop must never block
- void loop() {
- // Not used.
- }
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 19 – 세 개의 태스크 실행 (0) | 2015.01.17 |
---|---|
아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 16 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 14 (0) | 2015.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!