반응형

 

역시 마찬가지로 아래 포스팅에서 설치했던 라이브러리에 포함되어있던 예제를 분석합니다. 이제 여섯 개가 남았군요..

Arduino Uno에서 freeRTOS 올려보기(http://webnautes.tistory.com/595 )

 

 

우선순위 높은 Thread1이 먼저 실행되지만 사용 가능한 세마포어가 없어 무한정 기다리게 된다.

이때 우선순위 낮은 Thread2가 실행되어 LED 를 켜고 200밀리세컨드 대기했다가 세마포어를 놓아주면

다시 우선순위 높은 Thread1이 실행되어 세마포어를 획득한 후 LED를 끄게 되고 다시 세마포어를 기다리는 상태가 된다.

그러면 다시 Thread2에서 200밀리세컨드 더 기다렸다가 다시 LED를 켜게 된다.

 

결과적으로 LED를 200밀리세컨드 주기로 깜빡이게 만든다.

 

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


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


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

+ Recent posts