아두이노 freeRTOS 튜토리얼 10Arduino FreeRTOS2015. 1. 15. 17:35
Table of Contents
반응형
5개까지 값을 넣을 수 있는 큐를 하나 생성하고 3개의 태스크가 각각 100,200,300이라는 값을 넣습니다.
또 다른 태스크 하나가 실행되어 큐에서 데이터를 꺼내와 화면에 뿌려줍니다.
- /* FreeRTOS.org includes. */
- #include "FreeRTOS_AVR.h"
- //#include "task.h"
- //#include "queue.h"
- /* Demo includes. */
- #include "basic_io_avr.h"
- //큐에 값을 기록하는 함수
- static void vSenderTask( void *pvParameters );
- //큐에서 값을 꺼내오는 함수
- static void vReceiverTask( void *pvParameters );
- /*-----------------------------------------------------------*/
- //QueueHandle_t타입의 변수를 선언
- //큐에 접근하기 위해 사용되는 핸들이 저장됨
- QueueHandle_t xQueue;
- void setup( void )
- {
- Serial.begin(9600);
- //5개의 long 값을 저장할 수 있는 큐를 위한 메모리를 할당하고 핸들을 반환한다.
- xQueue = xQueueCreate( 5, sizeof( long ) );
- if( xQueue != NULL )
- {
- //큐에 값을 기록하는 세 개의 태스크를 똑같은 우선순위로 생성한다.
- //파라메터로 각각의 태스크가 큐에 기록할 값을 넘겨준다.
- xTaskCreate( vSenderTask, "Sender1", 200, ( void * ) 100, 1, NULL );
- xTaskCreate( vSenderTask, "Sender2", 200, ( void * ) 200, 1, NULL );
- xTaskCreate( vSenderTask, "Sender3", 200, ( void * ) 300, 1, NULL );
- //큐로부터 값을 읽어오는 하나의 태스크를 생성한다.
- xTaskCreate( vReceiverTask, "Receiver1", 200, NULL, 1, NULL );
- //스케줄러를 시작한다.
- vTaskStartScheduler();
- }
- else
- {
- //메모리 부족으로 큐가 생성되지 못했을 경우
- }
- //메모리가 부족하지 않는한 여기가 실행되지 않을 것임
- for( ;; );
- // return 0;
- }
- /*-----------------------------------------------------------*/
- static void vSenderTask( void *pvParameters )
- {
- long lValueToSend;
- lValueToSend = ( long ) pvParameters;
- portBASE_TYPE xStatus;
- for( ;; )
- {
- //첫번째 파라메터는 값이 저장될 큐에 대한 핸들
- //스커줄러가 실행되기 전, 즉 이 태스크가 실행되기 전에 큐는 이미 생성되었다.
- //
- //두번째 파라메터는 큐에 저장할 데이터를 저장하고 있는 변수에 대한 주소
- //
- //세번째 파라메터는 큐에 공간이 비어있을때 까지 태스크가 블록될 시간을 지정한다.
- xStatus = xQueueSendToBack( xQueue, &lValueToSend, 0 );
- vPrintStringAndNumber( "sended = ", lValueToSend );
- if( xStatus != pdPASS )
- {
- //큐가 꽉찬상태라 더 집어넣을 수가 없다.
- vPrintString( "Queue is full\r\n" );
- }
- //다른 sender 태스크가 실행되는 것이 가능하도록 문맥교환을 한다.
- taskYIELD();
- }
- }
- /*-----------------------------------------------------------*/
- static void vReceiverTask( void *pvParameters )
- {
- /* Declare the variable that will hold the values received from the queue. */
- long lReceivedValue;
- portBASE_TYPE xStatus;
- const TickType_t xTicksToWait = 100/portTICK_PERIOD_MS;
- for( ;; )
- {
- //큐에 저장된 메시지 갯수를 반환한다.
- if( uxQueueMessagesWaiting( xQueue ) == 0 )
- {
- //큐가 비어있는 상태이다.
- vPrintString( "Queue is empty!\r\n" );
- }
- //첫번째 파라메터는 값을 꺼내올 큐에 대한 핸들
- //
- //두번째 파라메터는 큐에서 꺼내온 값을 저장할 변수에 대한 주소
- //
- //세번째 파라메터는 큐가 비어있을 경우 데이터를 꺼내오기위해 대기하는 시간이다.
- xStatus = xQueueReceive( xQueue, &lReceivedValue, xTicksToWait );
- if( xStatus == pdPASS )
- {
- //큐에서 데이터를 성공적으로 꺼내와서 출력해준다.
- vPrintStringAndNumber( "Received = ", lReceivedValue );
- }
- else
- {
- //큐가 비어 있어서 꺼내올 데이터가 없다.
- vPrintString( "Queue is empty\r\n" );
- }
- }
- }
- //------------------------------------------------------------------------------
- void loop() {}
반응형
'Arduino FreeRTOS' 카테고리의 다른 글
아두이노 freeRTOS 튜토리얼 12 (0) | 2015.01.16 |
---|---|
아두이노 freeRTOS 튜토리얼 11 (0) | 2015.01.16 |
아두이노 freeRTOS 튜토리얼 9 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 8 (0) | 2015.01.15 |
아두이노 freeRTOS 튜토리얼 7 (0) | 2015.01.14 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!