반응형

 

 

5개까지 값을 넣을 수 있는 큐를 하나 생성하고 3개의 태스크가 각각 100,200,300이라는 값을 넣습니다.

또 다른 태스크 하나가 실행되어 큐에서 데이터를 꺼내와 화면에 뿌려줍니다.

 

 

 

  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.     
  10. //큐에 값을 기록하는 함수  
  11. static void vSenderTask( void *pvParameters );  
  12.     
  13. //큐에서 값을 꺼내오는 함수  
  14. static void vReceiverTask( void *pvParameters );  
  15.     
  16. /*-----------------------------------------------------------*/  
  17.     
  18. //QueueHandle_t타입의 변수를 선언  
  19. //큐에 접근하기 위해 사용되는 핸들이 저장됨  
  20. QueueHandle_t xQueue;  
  21.     
  22.     
  23. void setup( void )  
  24. {  
  25.   Serial.begin(9600);  
  26.     
  27.   //5개의 long 값을 저장할  있는 큐를 위한 메모리를 할당하고 핸들을 반환한다.  
  28.   xQueue = xQueueCreate( 5, sizeoflong ) );  
  29.     
  30.   if( xQueue != NULL )  
  31.   {  
  32.     //큐에 값을 기록하는  개의 태스크를 똑같은 우선순위로 생성한다.  
  33.     //파라메터로 각각의 태스크가 큐에 기록할 값을 넘겨준다.  
  34.     xTaskCreate( vSenderTask, "Sender1", 200, ( void * ) 100, 1, NULL );  
  35.     xTaskCreate( vSenderTask, "Sender2", 200, ( void * ) 200, 1, NULL );  
  36.     xTaskCreate( vSenderTask, "Sender3", 200, ( void * ) 300, 1, NULL );  
  37.      
  38.     //큐로부터 값을 읽어오는 하나의 태스크를 생성한다.  
  39.     xTaskCreate( vReceiverTask, "Receiver1", 200, NULL, 1, NULL );  
  40.     
  41.     //스케줄러를 시작한다.  
  42.     vTaskStartScheduler();  
  43.   }  
  44.   else  
  45.   {  
  46.     //메모리 부족으로 큐가 생성되지 못했을 경우  
  47.   }  
  48.     
  49.   //메모리가 부족하지 않는한 여기가 실행되지 않을 것임  
  50.   for( ;; );  
  51. //  return 0;  
  52. }  
  53. /*-----------------------------------------------------------*/  
  54.     
  55. static void vSenderTask( void *pvParameters )  
  56. {  
  57.   long lValueToSend;  
  58.   lValueToSend = ( long ) pvParameters;  
  59.     
  60.   portBASE_TYPE xStatus;  
  61.     
  62.     
  63.   for( ;; )  
  64.   {  
  65.         
  66.     //첫번째 파라메터는 값이 저장될 큐에 대한 핸들  
  67.     //스커줄러가 실행되기   태스크가 실행되기 전에 큐는 이미 생성되었다.  
  68.     //  
  69.     //두번째 파라메터는 큐에 저장할 데이터를 저장하고 있는 변수에 대한 주소  
  70.     //  
  71.     //세번째 파라메터는 큐에 공간이 비어있을때 까지 태스크가 블록될 시간을 지정한다.    
  72.     xStatus = xQueueSendToBack( xQueue, &lValueToSend, 0 );  
  73.     vPrintStringAndNumber( "sended = ", lValueToSend );  
  74.     
  75.     if( xStatus != pdPASS )  
  76.     {  
  77.       //큐가 꽉찬상태라  집어넣을 수가 없다.  
  78.       vPrintString( "Queue is full\r\n" );  
  79.     }  
  80.     
  81.     //다른 sender 태스크가 실행되는 것이 가능하도록 문맥교환을 한다.  
  82.     taskYIELD();  
  83.   }  
  84. }  
  85. /*-----------------------------------------------------------*/  
  86.     
  87. static void vReceiverTask( void *pvParameters )  
  88. {  
  89.   /* Declare the variable that will hold the values received from the queue. */  
  90.   long lReceivedValue;  
  91.       
  92.   portBASE_TYPE xStatus;  
  93.   const TickType_t xTicksToWait = 100/portTICK_PERIOD_MS;  
  94.     
  95.     
  96.   for( ;; )  
  97.   {    
  98.     //큐에 저장된 메시지 갯수를 반환한다.  
  99.     if( uxQueueMessagesWaiting( xQueue ) == 0 )  
  100.     {  
  101.         //큐가 비어있는 상태이다.  
  102.         vPrintString( "Queue is empty!\r\n" );  
  103.     }  
  104.     
  105.         
  106.     //첫번째 파라메터는 값을 꺼내올 큐에 대한 핸들  
  107.     //  
  108.     //두번째 파라메터는 큐에서 꺼내온 값을 저장할 변수에 대한 주소  
  109.     //  
  110.     //세번째 파라메터는 큐가 비어있을 경우 데이터를 꺼내오기위해 대기하는 시간이다.  
  111.     xStatus = xQueueReceive( xQueue, &lReceivedValue, xTicksToWait );  
  112.     
  113.     if( xStatus == pdPASS )  
  114.     {  
  115.       //큐에서 데이터를 성공적으로 꺼내와서 출력해준다.  
  116.       vPrintStringAndNumber( "Received = ", lReceivedValue );  
  117.     }  
  118.     else  
  119.     {  
  120.       //큐가 비어 있어서 꺼내올 데이터가 없다.  
  121.       vPrintString( "Queue is empty\r\n" );  
  122.     }  
  123. }  
  124. }  
  125. //------------------------------------------------------------------------------  
  126. void loop() {}  

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


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

+ Recent posts