반응형

 

큐에 값을 넣는 태스크를 두 개 선언하는데 파라메터로 자신을 나타내는 ID와 출력할 값을 구조체에 넣어 넘겨줍니다.

다른 하나의 태스크가 구조체를 꺼내어 ID와 값을 출력합니다.

 

  1. /* FreeRTOS.org includes. */  
  2. #include "FreeRTOS_AVR.h"  
  3. //#include "task.h"  
  4. //#include "queue.h"  
  5.     
  6. /* Demo includes. */  
  7. #include "basic_io_avr.h"  
  8.     
  9. #define mainSENDER_1    1  
  10. #define mainSENDER_2    2  
  11.     
  12.     
  13. //큐에 값을 넣는 함수  
  14. static void vSenderTask( void *pvParameters );  
  15.     
  16. //큐에서 값을 가져오는 함수  
  17. static void vReceiverTask( void *pvParameters );  
  18.     
  19.     
  20. /*-----------------------------------------------------------*/  
  21.     
  22. //큐에 접근하기 위해 사용되는 핸들이 저장됨   
  23. QueueHandle_t xQueue;  
  24.     
  25.     
  26. //큐에 넣을  사용될 구조체 타입을 정의  
  27. typedef struct  
  28. {  
  29.   unsigned char ucValue;  
  30.   unsigned char ucSource;  
  31. } xData;  
  32.     
  33. //xData 구조체 타입의   개의 변수를 선언  
  34. static const xData xStructsToSend[ 2 ] =  
  35. {  
  36.   { 100, mainSENDER_1 }, //Sender1에서 사용됨  
  37.   { 200, mainSENDER_2 }  //Sender2에서 사용됨  
  38. };  
  39.     
  40. void setup( void )  
  41. {  
  42.     Serial.begin(9600);  
  43.       
  44.     //xData 타입의 값을 최대 3 넣을  있는 큐를 생성함.  
  45.     xQueue = xQueueCreate( 3, sizeof( xData ) );  
  46.     
  47.   if( xQueue != NULL )  
  48.   {  
  49.     //큐에 값을 넣을 태스크를  개를 똑같이 우선순위 2 생성한다.  
  50.     //각각 다른 파라메터를 넘겨줌.(자신의 ID 출력할 )  
  51.     xTaskCreate( vSenderTask, "Sender1", 200, ( void * ) &( xStructsToSend[ 0 ] ), 2, NULL );  
  52.     xTaskCreate( vSenderTask, "Sender2", 200, ( void * ) &( xStructsToSend[ 1 ] ), 2, NULL );  
  53.     
  54.     //큐에서 데이터를 가져올 태스크를 우선순위 1 생성  
  55.     xTaskCreate( vReceiverTask, "Receiver", 200, NULL, 1, NULL );  
  56.     
  57.     //스케줄러 시작  
  58.     vTaskStartScheduler();  
  59.   }  
  60.   else  
  61.   {  
  62.      //메모리 부족으로 큐가 생성되지 못함   
  63.   }  
  64.     
  65.   //메모리부족으로 여기가 실행됨  
  66.       
  67.   for( ;; );  
  68. //  return 0;  
  69. }  
  70. /*-----------------------------------------------------------*/  
  71.     
  72. static void vSenderTask( void *pvParameters )  
  73. {  
  74.     portBASE_TYPE xStatus;  
  75.     const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;  
  76.     
  77.       
  78.   for( ;; )  
  79.   {  
  80.     //첫번째 파라메터는 값이 저장될 큐에 대한 핸들   
  81.     //두번째 파라메터는 큐에 넣을 구조체의   
  82.     //세번째 파라메터는 블록되는 시간  
  83.     //블록되는 시간을 둠으로써 우선순위 낮은 Receiver태스크가 실행될수 있도록 한다  
  84.     xStatus = xQueueSendToBack( xQueue, pvParameters, xTicksToWait );  
  85.     
  86.     if( xStatus != pdPASS )  
  87.     {  
  88.       vPrintString( "Queue is Full\r\n" );  
  89.     }  
  90.     
  91.     //다른 sender 태스크가 실행되도록 문맥교환을 강제로 .  
  92.     taskYIELD();  
  93.   }  
  94. }  
  95. /*-----------------------------------------------------------*/  
  96.     
  97. static void vReceiverTask( void *pvParameters )  
  98. {  
  99.   xData xReceivedStructure;  
  100.   portBASE_TYPE xStatus;  
  101.     
  102.       
  103.   for( ;; )  
  104.   {  
  105.      //sender 태스크들이 큐가 꽉차서 블록된 상태일때에만  태스크가 실행된다.  
  106.     if( uxQueueMessagesWaiting( xQueue ) == 3 )  
  107.     {  
  108.        vPrintString( "Queue is Full\r\n" );  
  109.     }  
  110.     
  111.     //첫번째 파라메터는 값을 꺼내올 큐에 대한 핸들  
  112.     //  
  113.     //두번째 파라메터는 큐에서 꺼내온 데이터를 저장할 구조체의 주소  
  114.     //  
  115.      //세번째 파라메터는 큐가 비어있을 경우 데이터를 꺼내오기위해 대기하는 시간이다.    
  116.     xStatus = xQueueReceive( xQueue, &xReceivedStructure, 0 );  
  117.     
  118.     if( xStatus == pdPASS )  
  119.     {  
  120.       if( xReceivedStructure.ucSource == mainSENDER_1 )  
  121.       {  
  122.         vPrintStringAndNumber( "From Sender 1 = ", xReceivedStructure.ucValue );  
  123.       }  
  124.       else  
  125.       {  
  126.         vPrintStringAndNumber( "From Sender 2 = ", xReceivedStructure.ucValue );  
  127.       }  
  128.     }  
  129.     else  
  130.     {  
  131.       vPrintString( "Queue is Empty\r\n" );  
  132.     }  
  133.   }  
  134. }  
  135. //------------------------------------------------------------------------------  
  136. void loop() {}  


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

+ Recent posts