아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기Arduino FreeRTOS2015. 1. 17. 01:05
Table of Contents
반응형
LED 2개가 번갈아 가며 켜지는 예제를 세마포어 2개를 이용하여 만들어봤습니다. 세마포어를 얻으면 서로 상대방의 LED를 끄고 자신의 LED를 켜는 구조입니다.
처음에 어쩔 수 없이 한쪽 LED켜는 태스크에 세마포어를 주어서 시작하는 방식을 이용했습니다.. 아직 공부 중이라 이게 올바른 방법인지는 모르겠군요. 많은 구현 방법 중 하나라고 생각됩니다.
- #include <FreeRTOS_AVR.h>
- //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);
- while (1) {
- //세마포어를 획득할 떄 까지 무한정 기다린다.
- xSemaphoreTake(sem2, portMAX_DELAY);
- //상대방 LED를 끄고
- digitalWrite(LED_PIN, LOW);
- //자신의 LED를 켜고
- digitalWrite(LED_PIN2, HIGH);
- //200밀리세컨드 대기한다.
- vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
- //세마포어를 하나 놓아주어서 Thread2가 LED를 켤 수 있도록 한다.
- xSemaphoreGive(sem);
- }
- }
- //------------------------------------------------------------------------------
- static void Thread2(void* arg) {
- pinMode(LED_PIN, OUTPUT);
- while (1) {
- //세마포어를 획득할 떄 까지 무한정 기다린다.
- xSemaphoreTake(sem, portMAX_DELAY);
- //상대방 LED를 끄고
- digitalWrite(LED_PIN2, LOW);
- //자신의 LED를 켜고
- digitalWrite(LED_PIN, HIGH);
- //200밀리세컨드 대기한다.
- vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);
- //세마포어를 하나 놓아주어서 Thread1이 LED를 끌 수 있도록 한다.
- xSemaphoreGive(sem2);
- }
- }
- //------------------------------------------------------------------------------
- void setup() {
- portBASE_TYPE s1, s2;
- Serial.begin(9600);
- //카운팅 세마포어를 생성한다.
- sem = xSemaphoreCreateCounting(1, 1); //세마포어를 주고 시작함
- sem2 = xSemaphoreCreateCounting(1, 0);
- //우선순위 1로 LED끄는 태스크를 생성한다.
- s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- //우선순위 1로 LED켜는 태스크를 생성한다.
- s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);
- //생성중 에러 발생했는지 체크
- if ((sem== NULL||sem2==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 튜토리얼 20 (2) | 2015.01.18 |
---|---|
아두이노 freeRTOS 튜토리얼 19 – 세 개의 태스크 실행 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 16 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!