아두이노 freeRTOS 튜토리얼 20Arduino FreeRTOS2015. 1. 18. 05:40
Table of Contents
반응형
컨택스트 스위치 발생시 펄스 발생하는데 걸리는 시간과 그냥 만들었을 때 펄스 발생하는데 걸리는 시간을 비교
스코프가 없어서 오차있겠지만 그냥 소프트웨어적으로 측정해봄
아두이노 Uno의 경우 스코프로 재면 50마이크로세컨트 차이난다는데
여기에선 70마이크로 세컨드 정도 차이남.
- // Test to determine context switch time with a semaphore
- // Connect a scope to pin 13
- // Measure difference in time between first pulse with no context switch
- // and second pulse started in ledControl and ended in ledOffTask.
- // Difference should be about 50 usec on a 16 MHz 328 Arduino.
- #include <FreeRTOS_AVR.h>
- #include "basic_io_avr.h"
- #define LED_PIN 13
- //context switch를 위한 세마포어
- SemaphoreHandle_t xSemaphore;
- unsigned long before, after;
- //------------------------------------------------------------------------------
- // 높은 우선순위를 가지고 있지만 세마포어를 기다리는 대기상태임
- static void ledOffTask(void *pvParameters) {
- for (;;) {
- xSemaphoreTake(xSemaphore, portMAX_DELAY);
- digitalWrite(LED_PIN, LOW);
- after=micros();
- vPrintStringAndNumber("elapsed time(usec) ", after-before );
- }
- }
- //------------------------------------------------------------------------------
- //낮은 우선순위를 가지고 있으며 세마포어를 놓아주게됨
- static void ledControl(void *pvParameters) {
- for (;;) {
- //컨택스트 스위치가 발생하지 않았을때의 첫번째 펄스
- before=micros();
- digitalWrite(LED_PIN, HIGH);
- digitalWrite(LED_PIN, LOW);
- after=micros();
- vPrintStringAndNumber("elapsed time(usec) ", after-before );
- //세마포어를 통해 컨택스트 스위치를 발생시켜서
- //두번째 펄스를 만들어냄
- before=micros();
- digitalWrite(LED_PIN, HIGH);
- //세마포어를 놓아줌
- xSemaphoreGive(xSemaphore);
- //아두이노 uno(16Mhz)에선 약 1밀리세컨드 정도 대기
- vTaskDelay(1);
- }
- }
- //------------------------------------------------------------------------------
- void setup() {
- Serial.begin(9600);
- pinMode(LED_PIN, OUTPUT);
- //태스크 생성
- xTaskCreate(ledOffTask,
- "Task1",
- configMINIMAL_STACK_SIZE+100,
- NULL,
- tskIDLE_PRIORITY + 2,
- NULL);
- xTaskCreate(ledControl,
- "Task2",
- configMINIMAL_STACK_SIZE+100,
- NULL,
- tskIDLE_PRIORITY + 1,
- NULL);
- //바이너리 세마포어 생성
- vSemaphoreCreateBinary(xSemaphore);
- //스케줄러 시작
- vTaskStartScheduler();
- //메모리 부족으로 여기 실행될 수 있음
- Serial.println("Die");
- while(1);
- }
- //------------------------------------------------------------------------------
- void loop() {
- //idle loop
- //스택 사이즈는 configMINIMAL_STACK_SIZE
- }
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 19 – 세 개의 태스크 실행 (0) | 2015.01.17 |
---|---|
아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 16 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!