아두이노 freeRTOS 튜토리얼 6Arduino FreeRTOS2015. 1. 14. 21:05
Table of Contents
반응형
여섯번째 예제는 딜레이없이 계속 두 개의 태스크가 문자열을 출력하는 상황에서 vTaskDelayUntil함수를 사용하여 정확히 500밀리세컨드마다 자신의 문자열을 출력하려는 태스크의 동작을 보여줍니다. 얼마나 오차가 생기는지 볼려고 주기적으로 실행되는 태스크에서 밀리세컨드로 스케줄러가 시작된 이후로 지난 시간을 출력해봤습니다.
초반에는 0, 500, 1001로 거의 500밀리세컨드마다 실행되는듯 하지만..
좀 지나면 24017, 24521, 25025로 오차가 약간 커지는걸 볼 수 있었습니다. freeRTOS함수들은 아직 익숙치 않아서 시간을 Serial.print함수를 이용해서 출력했는데 이로 인해 생긴 오차가 아닐지 약간 걱정이 되네요..
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- //태스크에서 사용될 함수
- void vContinuousProcessingTask( void *pvParameters );
- void vPeriodicTask( void *pvParameters );
- //태스크로 넘겨줄 문자열 선언
- const char *pcTextForTask1 = "Continuous task 1 running\r\n";
- const char *pcTextForTask2 = "Continuous task 2 running\r\n";
- const char *pcTextForPeriodicTask = "Periodic task is running\r\n";
- /*-----------------------------------------------------------*/
- void setup( void )
- {
- Serial.begin(9600);
- //vContinuousProcessingTask 함수를 사용하는 두 개의 태스크를 각각 우선순위 1로 생성
- xTaskCreate( vContinuousProcessingTask, "Task 1", 200, (void*)pcTextForTask1, 1, NULL );
- xTaskCreate( vContinuousProcessingTask, "Task 2", 200, (void*)pcTextForTask2, 1, NULL );
- //vPeriodicTask 함수를 사용하는 태스크를 우선순위 2로 생성
- xTaskCreate( vPeriodicTask, "Task 3", 200, (void*)pcTextForPeriodicTask, 2, NULL );
- //스케줄러 시작
- vTaskStartScheduler();
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- void vContinuousProcessingTask( void *pvParameters )
- {
- char *pcTaskName;
- pcTaskName = ( char * ) pvParameters;
- for( ;; )
- {
- //딜레이나 블록킹 없이 계속 반복적으로 출력한다.
- vPrintString( pcTaskName );
- }
- }
- /*-----------------------------------------------------------*/
- void vPeriodicTask( void *pvParameters )
- {
- TickType_t xLastWakeTime;
- /* The xLastWakeTime variable needs to be initialized with the current tick
- count. Note that this is the only time we access this variable. From this
- point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
- API function. */
- xLastWakeTime = xTaskGetTickCount();
- /* As per most tasks, this task is implemented in an infinite loop. */
- for( ;; )
- {
- //xTaskGetTickCount함수는 vTaskStartScheduler함수가 호출된 이후로부터의 틱 카운터수를 반환한다.
- //정확히 500밀리세컨드마다 출력되는지 확인하려고 추가함.
- Serial.print( xTaskGetTickCount()/ portTICK_PERIOD_MS );
- //태스크 이름을 출력한다.
- vPrintString( "Periodic task is running\r\n" );
- //정확히 500밀리세컨드마다 출력되도록 설정한다.
- vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_PERIOD_MS ) );
- }
- }
- //------------------------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 8 (0) | 2015.01.15 |
---|---|
아두이노 freeRTOS 튜토리얼 7 (0) | 2015.01.14 |
아두이노 freeRTOS 튜토리얼 5 (0) | 2015.01.14 |
아두이노 freeRTOS 튜토리얼 4 (0) | 2015.01.14 |
아두이노 freeRTOS 튜토리얼 3 (0) | 2015.01.14 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!