ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기
    Arduino Uno/FreeRTOS 2015. 1. 17. 00:55

     

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

    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. }  


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

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

    유튜브 구독하기


    댓글 0

Designed by Tistory.