2016-11-07 3 views
1

무료 RTOS에서 내 작업은 3 가지 다른 이벤트를 기다려야합니다. 그래서, 내가 한 것은 ISR에서 3 가지 다른 이벤트의 대기열을 통해 데이터를 보냅니다. 그리고 대기열 중 하나라도 기록되면 tsak는 차단 해제됩니다. 또한이 대기열 각각을 덮어 쓸 수 있습니다. atmost 하나의 이벤트가 대기열에 채워집니다. 이제는 3 개의 큐에있는 데이터를 기반으로 단일 태스크의 차단을 해제 할 수 있습니까? QueueSet()을 보았습니다. 그것을 사용하는 것이 좋습니까?무료 RTOS에서 대기열 사용

답변

0

QueueSet은 3 개의 대기열을 대기하는 유일한 해결책입니다. 그러나 하나의 대기열에서 대기하는 솔루션을 사용할 수 있다고 생각합니다. 이는 더 간단합니다. 이벤트 유형에 대한 코드와 각 데이터를 저장하는 공용체가 포함 된 구조를 만들어야합니다.

enum EventType 
{ 
    Event1, 
    Event2, 
    Event3 
}; 

struct EventMessage 
{ 
    enum EventType event; 
    union 
    { 
     int paramEvent1; 
     char paramEvent2; 
     unsigned char paramEvent3[4]; 
    } parameters; 
}; 

void sendEvent1(...) 
{ 
    struct EventMessage msg; 
    msg.event = Event1; 
    msg.parameters.paramEvent1 = ...; 

    xQueueSend(queue, &msg, portMAX_DELAY); //or xQueueSendFromISR if is in ISR 
} 

// Same for event2 and 3, replacing "msg.event = " with correct code 
// And set correct parameters 

void task(void * cookie) 
{ 
    struct EventMessage msg; 

    for(;;) 
    { 
     xQueueReceive(queue, &msg, portMAX_DELAY); 
     switch(msg.event) 
     { 
      case Event1: 
       //manage event1 
       break; 
      case Event2: 
       //manage event2 
       break; 
      case Event3: 
       //manage event3 
       break; 
     } 
    } 
} 
+0

답장을 보내 주셔서 감사합니다 :). 내가 가진 문제는 3 개의 이벤트가 모두 독립적이며 포 그라운드에서 이벤트를 처리하기 전에 여러 번 발생할 수 있습니다. 또한 나는 최신 사건의 내용에 만족할 것이다. 따라서 [Queue Overwrite] (http://www.freertos.org/xQueueOverwrite.html)를 사용하고 있습니다. 따라서 솔루션 (예 : 단일 대기열을 사용하여 이벤트를 인라인으로 보내는 경우) 중 하나가 내 이벤트를 덮어 쓸 수 있습니다. 또한 새로운 스택 오버플로입니다. 잘못된 형식으로 죄송합니다. – user2717596

+0

@ user2717596 그래서 'QueueSet'과 함께 3 개의 큐를 사용해야합니다;) – Garf365

+0

"유일한 해결책"- 실제로는 아닙니다; 이 기능은 하위 OS 프리미티브에서 만들 수 있습니다. 예를 들어, 이벤트 플래그 그룹에서 차단할 수 있습니다. 각 플래그는 메시지를 포함하는 큐를 나타냅니다. 발신자는 해당 큐에 메시지를 저장하고 해당 이벤트 플래그를 설정합니다. 즉, QueueSet에 해당하지 않는 RTOS에서 수행하는 방법입니다. OS가 짝수 플래그를 지원하지 않으면 세마포를 사용할 수 있고 큐를 기다리지 않습니다. 항상 또 다른 해결책이 있습니다. 그러나 FreeRTOS에서는 이러한 방법이 다소 비효율적 일 수 있습니다. – Clifford