반응형

 

 

LED 2개가 번갈아 가며 켜지는 예제를 세마포어 2개를 이용하여 만들어봤습니다. 세마포어를 얻으면 서로 상대방의 LED를 끄고 자신의 LED를 켜는 구조입니다.

처음에 어쩔 수 없이 한쪽 LED켜는 태스크에 세마포어를 주어서 시작하는 방식을 이용했습니다.. 아직 공부 중이라 이게 올바른 방법인지는 모르겠군요. 많은 구현 방법 중 하나라고 생각됩니다.

 

  1. #include <FreeRTOS_AVR.h>  
  2.     
  3. //LED 연결하는  번호  
  4. const uint8_t LED_PIN = 13;  
  5. const uint8_t LED_PIN2 = 9;  
  6.     
  7. //세마포어 핸들을 선언  
  8. SemaphoreHandle_t sem;  
  9. SemaphoreHandle_t sem2;  
  10.     
  11.     
  12. static void Thread1(void* arg) {  
  13.     
  14.   pinMode(LED_PIN2, OUTPUT);  
  15.     
  16.   while (1) {     
  17.     //세마포어를 획득할  까지 무한정 기다린다.  
  18.      xSemaphoreTake(sem2, portMAX_DELAY);  
  19.     
  20.     //상대방 LED 끄고  
  21.     digitalWrite(LED_PIN, LOW);  
  22.         
  23.     //자신의 LED 켜고   
  24.     digitalWrite(LED_PIN2, HIGH);  
  25.     
  26.     //200밀리세컨드 대기한다.  
  27.     vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);  
  28.     
  29.     //세마포어를 하나 놓아주어서 Thread2 LED   있도록 한다  
  30.     xSemaphoreGive(sem);  
  31.   }  
  32. }  
  33.     
  34. //------------------------------------------------------------------------------  
  35.     
  36. static void Thread2(void* arg) {  
  37.     
  38.   pinMode(LED_PIN, OUTPUT);  
  39.     
  40.   while (1) {  
  41.     //세마포어를 획득할  까지 무한정 기다린다.  
  42.      xSemaphoreTake(sem, portMAX_DELAY);  
  43.         
  44.     //상대방 LED 끄고  
  45.     digitalWrite(LED_PIN2, LOW);  
  46.         
  47.     //자신의 LED 켜고   
  48.     digitalWrite(LED_PIN, HIGH);  
  49.     
  50.     //200밀리세컨드 대기한다.  
  51.     vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);  
  52.     
  53.     //세마포어를 하나 놓아주어서 Thread1 LED   있도록 한다  
  54.     xSemaphoreGive(sem2);  
  55.     
  56.   }  
  57. }  
  58. //------------------------------------------------------------------------------  
  59. void setup() {  
  60.   portBASE_TYPE s1, s2;  
  61.     
  62.   Serial.begin(9600);  
  63.       
  64.   //카운팅 세마포어를 생성한다.  
  65.   sem = xSemaphoreCreateCounting(1, 1); //세마포어를 주고 시작함 
  66.   sem2 = xSemaphoreCreateCounting(1, 0);  
  67.       
  68.       
  69.   //우선순위 1 LED끄는 태스크를 생성한다.  
  70.   s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);  
  71.     
  72.   //우선순위 1 LED켜는 태스크를 생성한다.  
  73.   s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);  
  74.     
  75.   //생성중 에러 발생했는지 
  76.   if ((sem== NULL||sem2==NULL) || (s1 != pdPASS || s2 != pdPASS )) {  
  77.     Serial.println(F("Creation problem"));  
  78.     while(1);  
  79.   }  
  80.       
  81.   //스케줄러를 시작한다.  
  82.   vTaskStartScheduler();  
  83.       
  84.   //여기가 실행된다면 메모리 부족 상태  
  85.   Serial.println(F("Insufficient RAM"));  
  86.       
  87.   while(1);  
  88. }  
  89. //------------------------------------------------------------------------------  
  90. // WARNING idle loop has a very small stack (configMINIMAL_STACK_SIZE)  
  91. // loop must never block  
  92. void loop() {  
  93.   // Not used.  
  94. }  


반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts