ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 freeRTOS 튜토리얼 20
    Arduino Uno/FreeRTOS 2015. 1. 18. 05:40

     


    컨택스트 스위치 발생시 펄스 발생하는데 걸리는 시간과 그냥 만들었을 때 펄스 발생하는데 걸리는 시간을 비교

    스코프가 없어서 오차있겠지만 그냥 소프트웨어적으로 측정해봄

     

    아두이노 Uno의 경우 스코프로 재면 50마이크로세컨트 차이난다는데

    여기에선 70마이크로 세컨드 정도 차이남.

     

    1. // Test to determine context switch time with a semaphore  
    2. // Connect a scope to pin 13  
    3. // Measure difference in time between first pulse with no context switch  
    4. // and second pulse started in ledControl and ended in ledOffTask.  
    5. // Difference should be about 50 usec on a 16 MHz 328 Arduino.  
    6. #include <FreeRTOS_AVR.h>  
    7. #include "basic_io_avr.h"    
    8.     
    9. #define LED_PIN 13  
    10.     
    11. //context switch 위한 세마포어  
    12. SemaphoreHandle_t xSemaphore;  
    13.     
    14. unsigned long before, after;  
    15. //------------------------------------------------------------------------------  
    16. // 높은 우선순위를 가지고 있지만 세마포어를 기다리는 대기상태임   
    17. static void ledOffTask(void *pvParameters) {  
    18.   for (;;) {  
    19.     xSemaphoreTake(xSemaphore, portMAX_DELAY);  
    20.         
    21.     digitalWrite(LED_PIN, LOW);      
    22.     after=micros();  
    23.     vPrintStringAndNumber("elapsed time(usec) ", after-before );  
    24.   }  
    25. }  
    26. //------------------------------------------------------------------------------  
    27. //낮은 우선순위를 가지고 있으며 세마포어를 놓아주게됨   
    28. static void ledControl(void *pvParameters) {  
    29.   for (;;) {  
    30.     //컨택스트 스위치가 발생하지 않았을때의 첫번째 펄스  
    31.      before=micros();  
    32.      digitalWrite(LED_PIN, HIGH);  
    33.      digitalWrite(LED_PIN, LOW);  
    34.      after=micros();  
    35.     vPrintStringAndNumber("elapsed time(usec) ", after-before );  
    36.         
    37.         
    38.     //세마포어를 통해 컨택스트 스위치를 발생시켜서  
    39.     //두번째 펄스를 만들어냄  
    40.     before=micros();  
    41.     digitalWrite(LED_PIN, HIGH);  
    42.         
    43.     //세마포어를 놓아줌  
    44.      xSemaphoreGive(xSemaphore);  
    45.         
    46.     //아두이노 uno(16Mhz)에선  1밀리세컨드 정도 대기  
    47.     vTaskDelay(1);  
    48.      
    49.   }  
    50. }  
    51. //------------------------------------------------------------------------------  
    52. void setup() {  
    53.   Serial.begin(9600);  
    54.   pinMode(LED_PIN, OUTPUT);  
    55.       
    56.   //태스크 생성    
    57.   xTaskCreate(ledOffTask,  
    58.     "Task1",  
    59.     configMINIMAL_STACK_SIZE+100,  
    60.     NULL,  
    61.     tskIDLE_PRIORITY + 2,  
    62.     NULL);  
    63.     
    64.   xTaskCreate(ledControl,  
    65.     "Task2",  
    66.     configMINIMAL_STACK_SIZE+100,  
    67.     NULL,  
    68.     tskIDLE_PRIORITY + 1,  
    69.     NULL);    
    70.         
    71.   //바이너리 세마포어 생성  
    72.   vSemaphoreCreateBinary(xSemaphore);  
    73.       
    74.   //스케줄러 시작  
    75.   vTaskStartScheduler();  
    76.       
    77.   //메모리 부족으로 여기 실행될  있음  
    78.   Serial.println("Die");  
    79.       
    80.   while(1);  
    81. }  
    82. //------------------------------------------------------------------------------  
    83. void loop() {  
    84.   //idle loop  
    85.   //스택 사이즈는 configMINIMAL_STACK_SIZE  
    86. }  


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

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

    유튜브 구독하기


    댓글 2

Designed by Tistory.