반응형

 


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

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

 

아두이노 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. }  


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


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

+ Recent posts