아두이노 freeRTOS 튜토리얼 13Arduino FreeRTOS2015. 1. 16. 15:39
Table of Contents
반응형
Periodic태스크에서 주기적으로 소프트웨어적으로 인터럽트를 발생시킨다.
인터럽트가 발생하면 인터럽트를 위한 서비스 루틴인 vExampleInterruptHandler함수가 호출되어 세마포어를 놓아주고 컨택스트 스위치를 한다.
바로 Handler 태스크에서 세마포어를 획득하고는 필요한 처리작업을 하게 된다. 이후 다시 세마포어를 기다리는 블록상태에 빠지고
다시 Periodic태스크에서 인터럽트 발생 후 해야 할 작업을 이어서 계속한다.
지난번 예제와 차이점이 있다면 한번에 세마포어를 세 개씩 주지만 이벤트를 놓치지 않고 잘 처리해주는 것이다.
Handler에서 작업하던 중 인터럽트가 발생되면 다시 Handler를 처리하려 하고 하다 보니 결국 마지막에 발생한 인터럽트 처리부터 하기 때문에 count값이 마지막에 증가한 값으로 출력되는 것으로 보인다.
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- //#include "semphr.h"
- //#include "portasm.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- /* Compiler includes. */
- //#include <dos.h>
- static void vHandlerTask( void *pvParameters );
- static void vPeriodicTask( void *pvParameters );
- //인터럽트를 위한 서비스 루틴
- static void vExampleInterruptHandler( void );
- int count=0;
- /*-----------------------------------------------------------*/
- //태스크들에서 세마포어에 접근하기 위해 전역으로 변수 선언
- SemaphoreHandle_t xCountingSemaphore;
- // pin to generate interrupts
- #if defined(CORE_TEENSY)
- const uint8_t interruptPin = 0;
- #elfif defined(__AVR_ATmega32U4__)
- const uint8_t interruptPin = 3;
- #else // interruptPin
- const uint8_t interruptPin = 2;
- #endif // interruptPin
- void setup( void )
- {
- Serial.begin(9600);
- //최대 10개까지 사용가능한 세마포어를 생성한다.초기값은 0이다.
- xCountingSemaphore = xSemaphoreCreateCounting( 10, 0 );
- //인터럽트핀을 출력으로 설정
- pinMode(interruptPin, OUTPUT);
- //인터럽트 서비스 루틴을 지정한다. LOW->HIGH로 핀 전압이 변화시 인터럽트 발생
- attachInterrupt(0, vExampleInterruptHandler, RISING);
- //세마포어가 성공적으로 생성되었다면
- if( xCountingSemaphore != NULL )
- {
- //인터럽트 발생후 바로 실행되기 위해서 우선순위가 높도록해서 Handler 태스크 생성
- xTaskCreate( vHandlerTask, "Handler", 200, NULL, 3, NULL );
- //주기적으로 소프트웨어 인터럽트를 발생시키는 Periodic태스크를 생성한다.
- //우선순위가 낮기때문에 Handler태스크가 블록될때에만 실행될 것이다.
- xTaskCreate( vPeriodicTask, "Periodic", 200, NULL, 1, NULL );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- }
- //여기에 도달하면 아마도 메모리가 부족한 상태이다.
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- static void vHandlerTask( void *pvParameters )
- {
- /* As per most tasks, this task is implemented within an infinite loop. */
- for( ;; )
- {
- //이벤트를 기다리기 위해서 세마포어를 이용한다.
- //세마포어를 얻을떄 까지 대기하게 된다.
- //첫번째 파라메터는 세마포어 핸들러
- //두번째 파라메터는 세마포어를 획득할때 까지 기다리는 최대 틱수
- //portMAX_DELAY로 설정하면 무한히 기다리게 된다.
- xSemaphoreTake( xCountingSemaphore, portMAX_DELAY );
- //세마포어를 획득했으므로 이제 이벤트를 처리한다.
- vPrintStringAndNumber( "Handler task - Processing event.\r\n", count );
- }
- }
- /*-----------------------------------------------------------*/
- static void vPeriodicTask( void *pvParameters )
- {
- for( ;; )
- {
- //주기적으로 소프트웨어 인터럽트를 발생시키는 태스크이다.
- vTaskDelay( 500 / portTICK_PERIOD_MS );
- //인터업트 발생전 실행되는 코드
- vPrintString( "Perodic task - About to generate an interrupt.\r\n" );
- //인터럽트 발생
- digitalWrite(interruptPin, LOW);
- digitalWrite(interruptPin, HIGH);
- //인터럽트 발생하여 서비스루틴 처리 후 실행되는 코드
- vPrintString( "Periodic task - Interrupt generated.\r\n\r\n\r\n" );
- }
- }
- /*-----------------------------------------------------------*/
- static void vExampleInterruptHandler( void )
- {
- static portBASE_TYPE xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken = pdFALSE;
- //세마포어를 세번 연달아 놓아준다. 세 번 다 정상적으로 이벤트를 처리한다.
- //중복적으로 인터럽트가 발생할 경우 어느 것부터 처리하는지 알아보려고 count를 증가시킴.
- count++;
- xSemaphoreGiveFromISR( xCountingSemaphore, (BaseType_t*)&xHigherPriorityTaskWoken );
- count++;
- xSemaphoreGiveFromISR( xCountingSemaphore, (BaseType_t*)&xHigherPriorityTaskWoken );
- count++;
- xSemaphoreGiveFromISR( xCountingSemaphore, (BaseType_t*)&xHigherPriorityTaskWoken );
- if( xHigherPriorityTaskWoken == pdTRUE )
- {
- //세마포어를 놓아준 걸로 인해서 우선순위 높은 태스크가 블록상태에서 빠져나왔다.
- //컨텍스트 스위치를 통해 해당 태스크가 바로 실행될 수 있도록한다.
- vPortYield();
- }
- }
- //---------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
---|---|
아두이노 freeRTOS 튜토리얼 14 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 12 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 11 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 10 (0) | 2015.01.15 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!