아두이노 freeRTOS 튜토리얼 12Arduino FreeRTOS2015. 1. 16. 13:17
Table of Contents
반응형
Periodic태스크에서 주기적으로 소프트웨어적으로 인터럽트를 발생시킨다.
인터럽트가 발생하면 인터럽트를 위한 서비스 루틴인 vExampleInterruptHandler함수가 호출되어 세마포어를 놓아주고 컨택스트 스위치를 한다.
바로 Handler 태스크에서 세마포어를 획득하고는 필요한 처리작업을 하게 된다. 이후 다시 세마포어를 기다리는 블록상태에 빠지고
다시 Periodic태스크에서 인터럽트 발생 후 해야 할 작업을 이어서 계속한다.
- /* 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 );
- /*-----------------------------------------------------------*/
- /* Declare a variable of type SemaphoreHandle_t. This is used to reference the
- semaphore that is used to synchronize a task with an interrupt. */
- SemaphoreHandle_t xBinarySemaphore;
- // 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);
- //바이너리 세마포어 생성
- vSemaphoreCreateBinary( xBinarySemaphore );
- //인터럽트 핀을 출력으로 설정
- pinMode(interruptPin, OUTPUT);
- //인터럽트 서비스 루틴을 지정한다. LOW->HIGH로 핀 전압이 변화시 인터럽트 발생
- attachInterrupt(0, vExampleInterruptHandler, RISING);
- //세마포어가 성공적으로 생성되었다면
- if( xBinarySemaphore != NULL )
- {
- //Handler 태스크를 생성한다.인터럽트가 발생하면 즉시 실행되도록 우선순위를
- //다른 태스크보다 높게해서 생성한다.
- xTaskCreate( vHandlerTask, "Handler", 200, NULL, 3, NULL );
- //주기적으로 소프트웨어 인터럽트를 발생시키는 Periodic태스크를 생성한다.
- /* Create the task that will periodically generate a software interrupt.
- This is created with a priority below the handler task to ensure it will
- get preempted each time the handler task exist the Blocked state. */
- xTaskCreate( vPeriodicTask, "Periodic", 200, NULL, 1, NULL );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- }
- //메모리가 부족하지 않는한 여기에 도달하지 않는다.
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- static void vHandlerTask( void *pvParameters )
- {
- /* Note that when you create a binary semaphore in FreeRTOS, it is ready
- to be taken, so you may want to take the semaphore after you create it
- so that the task waiting on this semaphore will block until given by
- another task. */
- //세마포어를 획득하기 위해 대기한다.
- //두번째 파라메터가 0인경우에는 사용가능한 세마포어를 찾아 폴링한다.
- xSemaphoreTake( xBinarySemaphore, 0);
- for( ;; )
- {
- //이벤트를 기다리기 위해서 세마포어를 이용한다.
- //세마포어를 얻을떄 까지 대기하게 된다.
- //첫번째 파라메터는 세마포어 핸들러
- //두번째 파라메터는 세마포어를 획득할때 까지 기다리는 최대 틱수
- //portMAX_DELAY로 설정하면 무한히 기다리게 된다.
- xSemaphoreTake( xBinarySemaphore, portMAX_DELAY );
- //세마포어를 획득했으므로 이제 이벤트를 처리한다.
- vPrintString( "Handler task - Processing event.\r\n" );
- }
- }
- /*-----------------------------------------------------------*/
- 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 signed portBASE_TYPE xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken = pdFALSE;
- //세마포어를 놓아주기 위한 함수이다.
- xSemaphoreGiveFromISR( xBinarySemaphore, (signed portBASE_TYPE*)&xHigherPriorityTaskWoken );
- if( xHigherPriorityTaskWoken == pdTRUE )
- {
- //세마포어를 놓아준 걸로 인해서 우선순위 높은 태스크가 블록상태에서 빠져나왔다.
- //컨텍스트 스위치를 통해 해당 태스크가 실행될 수 있도록한다.
- vPortYield();
- }
- }
- //------------------------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 14 (0) | 2015.01.16 |
---|---|
아두이노 freeRTOS 튜토리얼 13 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 11 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 10 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 9 (0) | 2015.01.15 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!