아두이노 freeRTOS 튜토리얼 16Arduino FreeRTOS2015. 1. 16. 23:52
Table of Contents
반응형
우선순위 높은 Print2 태스크가 실행되어 자신에 해당되는 문자열을 큐에 넣고 임의의 시간 대기한다.
그 사이 태스크 1이 실행되어 자신에 해당되는 문자열을 넣고 임의의 시간 대기한다. 태스크2의 대기 시간보다 짧아서 여러 번 실행될 수 있다.
다른 태스크들이 블록되어 있는 동안 우선순위 가장 낮은 Gatekeeper 태스크가 큐에 있는 데이터를 출력한다.
틱 후크 인터럽트가 발생하면 틱 인터럽트 서비스 루틴이 실행되어 큐에 대응되는 문자열을 넣는다.
역시 나중에 Gatekeeper 태스크에서 출력되어 진다.
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- //#include "semphr.h"
- /* Compiler includes. */
- //#include <stdlib.h>
- //#include <stdio.h>
- //gatekeeper 태스크로 메시지를 보내기 위한 Print1,Print2 태스크에서 사용되는 함수
- static void prvPrintTask( void *pvParameters );
- //gatekeeper 태스크에서 사용되는 함수, 큐에서 메시지를 꺼내어 출력한다.
- //시리얼에 값을 기록하기 위한 전용 태스크가 되는 셈이다.
- static void prvStdioGatekeeperTask( void *pvParameters );
- //출력할때 사용할 문자열 정의
- static char *pcStringsToPrint[] =
- {
- "Task 1 ****************************************************\r\n",
- "Task 2 ----------------------------------------------------\r\n",
- "Message printed from the tick hook interrupt ##############\r\n"
- };
- /*-----------------------------------------------------------*/
- //gatekeeper 태스크로 데이터를 보낼때 사용되는 큐에 대한 핸들
- QueueHandle_t xPrintQueue;
- void setup( void )
- {
- Serial.begin(9600);
- //5개까지 문자열을 저장할 큐를 생성한다.
- xPrintQueue = xQueueCreate( 5, sizeof( char * ) );
- //난수 발생시 사용할 씨드
- srand( 567 );
- //큐가 성공적으로 생성되었다면
- if( xPrintQueue != NULL )
- {
- //Gatekeeper태스크로 메세지를 보내는 두개의 태스크를 생성한다.
- //자신에게 맞는 문자열을 출력할 수 있게 문자열 배열의 인덱스를 파라메터로 넘겨준다.
- xTaskCreate( prvPrintTask, "Print1", 200, ( void * ) 0, 1, NULL );
- xTaskCreate( prvPrintTask, "Print2", 200, ( void * ) 1, 2, NULL );
- //gatekeeper 태스크를 생성한다. 시리얼로 데이터를 보내는게 유일하게 허용된 태스크이다.
- xTaskCreate( prvStdioGatekeeperTask, "Gatekeeper", 200, NULL, 0, NULL );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- }
- //메모리가 부족한 상황이면 여기에 도달한다.
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- static void prvStdioGatekeeperTask( void *pvParameters )
- {
- char *pcMessageToPrint;
- for( ;; )
- {
- //큐에서 메시지를 꺼낸다.
- //portMAX_DELAY 인자를 사용했기 때문에 큐가 비어있다며 무한히 대기한다.
- xQueueReceive( xPrintQueue, &pcMessageToPrint, portMAX_DELAY );
- //시리얼로 문자열을 출력하고
- Serial.print(pcMessageToPrint );
- //문자열이 출력완료되기를 기다린다.
- Serial.flush();
- //버퍼가 비어있지 않다면 True를 반환한다.
- if (Serial.available()) {
- //커널 틱을 정지시키고 모든 생성된 태스크들을 삭제한다
- //시리얼 포트에 있는 데이터가 다 기록될때 까지 위에서 기다렸는데도 버퍼가 꽉차있다는 것은
- //먼가 문제가 있는 것이므로 스케줄러를 다시 시작하는 것으로 보인다.
- vTaskEndScheduler();
- }
- // 다시 xQueueReceive에서 새로운 메세지를 대기한다.
- }
- }
- /*-----------------------------------------------------------*/
- extern "C"{ // FreeRTOS expectes C linkage
- //틱 후크 인터럽트가 발생했을 때 수행된다.
- void vApplicationTickHook( void )
- {
- static int iCount = 0;
- portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
- //후크 함수 내부에서 카운터를 증가시킨다.
- iCount++;
- if( iCount >= 200 ) //200틱을 넘을때 마다
- {
- //인터럽트 서비스 루틴내에서 큐에 데이터를 넣을때에는 xQueueSendToFrontFromISR함수를 사용한다.
- //틱 후크 인터럽트가 발생했음을 알리기위해 큐에 해당되는 메시지를 넣는다.
- xQueueSendToFrontFromISR( xPrintQueue, &( pcStringsToPrint[ 2 ] ), (BaseType_t*)&xHigherPriorityTaskWoken );
- //카운터를 리셋한다.
- iCount = 0;
- }
- }
- }
- /*-----------------------------------------------------------*/
- static void prvPrintTask( void *pvParameters )
- {
- //파라메터로 자신에게 맞는 문자열을 출력할 수 있게 문자열 배열의 인덱스 값을 받음
- int iIndexToString;
- iIndexToString = ( int ) pvParameters;
- for( ;; )
- {
- //iIndexToString값을 이용하여 자신에 해당되는 문자열을 큐에 넣는다.
- xQueueSendToBack( xPrintQueue, &( pcStringsToPrint[ iIndexToString ] ), 0 );
- //rand로 생성한 임의의 시간동안 대기한다.
- //여기에서 critical section없이 사용하려면 rand함수가 reentrant해야 한다.
- //여러 쓰레드에서 코드를 동시에 수행하더라도 실행결과가 정확함을 보장한다는 것이다.
- vTaskDelay( ( rand() & 0x1FF ) );
- }
- }
- //------------------------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 18 – LED 2개 번갈아가며 깜빡이게 하기 (0) | 2015.01.17 |
---|---|
아두이노 freeRTOS 튜토리얼 17 - LED깜빡이게 하기 (0) | 2015.01.17 |
아두이노 freeRTOS 튜토리얼 15 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 14 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 13 (0) | 2015.01.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!