아두이노 freeRTOS 튜토리얼 11Arduino FreeRTOS2015. 1. 16. 01:10
Table of Contents
반응형
큐에 값을 넣는 태스크를 두 개 선언하는데 파라메터로 자신을 나타내는 ID와 출력할 값을 구조체에 넣어 넘겨줍니다.
다른 하나의 태스크가 구조체를 꺼내어 ID와 값을 출력합니다.
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- //#include "queue.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- #define mainSENDER_1 1
- #define mainSENDER_2 2
- //큐에 값을 넣는 함수
- static void vSenderTask( void *pvParameters );
- //큐에서 값을 가져오는 함수
- static void vReceiverTask( void *pvParameters );
- /*-----------------------------------------------------------*/
- //큐에 접근하기 위해 사용되는 핸들이 저장됨
- QueueHandle_t xQueue;
- //큐에 넣을 때 사용될 구조체 타입을 정의
- typedef struct
- {
- unsigned char ucValue;
- unsigned char ucSource;
- } xData;
- //xData 구조체 타입의 두 개의 변수를 선언
- static const xData xStructsToSend[ 2 ] =
- {
- { 100, mainSENDER_1 }, //Sender1에서 사용됨
- { 200, mainSENDER_2 } //Sender2에서 사용됨
- };
- void setup( void )
- {
- Serial.begin(9600);
- //xData 타입의 값을 최대 3개 넣을 수 있는 큐를 생성함.
- xQueue = xQueueCreate( 3, sizeof( xData ) );
- if( xQueue != NULL )
- {
- //큐에 값을 넣을 태스크를 두 개를 똑같이 우선순위 2로 생성한다.
- //각각 다른 파라메터를 넘겨줌.(자신의 ID와 출력할 값)
- xTaskCreate( vSenderTask, "Sender1", 200, ( void * ) &( xStructsToSend[ 0 ] ), 2, NULL );
- xTaskCreate( vSenderTask, "Sender2", 200, ( void * ) &( xStructsToSend[ 1 ] ), 2, NULL );
- //큐에서 데이터를 가져올 태스크를 우선순위 1로 생성
- xTaskCreate( vReceiverTask, "Receiver", 200, NULL, 1, NULL );
- //스케줄러 시작
- vTaskStartScheduler();
- }
- else
- {
- //메모리 부족으로 큐가 생성되지 못함
- }
- //메모리부족으로 여기가 실행됨
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- static void vSenderTask( void *pvParameters )
- {
- portBASE_TYPE xStatus;
- const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
- for( ;; )
- {
- //첫번째 파라메터는 값이 저장될 큐에 대한 핸들
- //두번째 파라메터는 큐에 넣을 구조체의 주
- //세번째 파라메터는 블록되는 시간
- //블록되는 시간을 둠으로써 우선순위 낮은 Receiver태스크가 실행될수 있도록 한다.
- xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );
- if( xStatus != pdPASS )
- {
- vPrintString( "Queue is Full\r\n" );
- }
- //다른 sender 태스크가 실행되도록 문맥교환을 강제로 함.
- taskYIELD();
- }
- }
- /*-----------------------------------------------------------*/
- static void vReceiverTask( void *pvParameters )
- {
- xData xReceivedStructure;
- portBASE_TYPE xStatus;
- for( ;; )
- {
- //sender 태스크들이 큐가 꽉차서 블록된 상태일때에만 이 태스크가 실행된다.
- if( uxQueueMessagesWaiting( xQueue ) == 3 )
- {
- vPrintString( "Queue is Full\r\n" );
- }
- //첫번째 파라메터는 값을 꺼내올 큐에 대한 핸들
- //
- //두번째 파라메터는 큐에서 꺼내온 데이터를 저장할 구조체의 주소
- //
- //세번째 파라메터는 큐가 비어있을 경우 데이터를 꺼내오기위해 대기하는 시간이다.
- xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );
- if( xStatus == pdPASS )
- {
- if( xReceivedStructure.ucSource == mainSENDER_1 )
- {
- vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );
- }
- else
- {
- vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );
- }
- }
- else
- {
- vPrintString( "Queue is Empty\r\n" );
- }
- }
- }
- //------------------------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 13 (0) | 2015.01.16 |
---|---|
아두이노 freeRTOS 튜토리얼 12 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 10 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 9 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 8 (0) | 2015.01.15 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!