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;
}
}
}
답장을 보내 주셔서 감사합니다 :). 내가 가진 문제는 3 개의 이벤트가 모두 독립적이며 포 그라운드에서 이벤트를 처리하기 전에 여러 번 발생할 수 있습니다. 또한 나는 최신 사건의 내용에 만족할 것이다. 따라서 [Queue Overwrite] (http://www.freertos.org/xQueueOverwrite.html)를 사용하고 있습니다. 따라서 솔루션 (예 : 단일 대기열을 사용하여 이벤트를 인라인으로 보내는 경우) 중 하나가 내 이벤트를 덮어 쓸 수 있습니다. 또한 새로운 스택 오버플로입니다. 잘못된 형식으로 죄송합니다. – user2717596
@ user2717596 그래서 'QueueSet'과 함께 3 개의 큐를 사용해야합니다;) – Garf365
"유일한 해결책"- 실제로는 아닙니다; 이 기능은 하위 OS 프리미티브에서 만들 수 있습니다. 예를 들어, 이벤트 플래그 그룹에서 차단할 수 있습니다. 각 플래그는 메시지를 포함하는 큐를 나타냅니다. 발신자는 해당 큐에 메시지를 저장하고 해당 이벤트 플래그를 설정합니다. 즉, QueueSet에 해당하지 않는 RTOS에서 수행하는 방법입니다. OS가 짝수 플래그를 지원하지 않으면 세마포를 사용할 수 있고 큐를 기다리지 않습니다. 항상 또 다른 해결책이 있습니다. 그러나 FreeRTOS에서는 이러한 방법이 다소 비효율적 일 수 있습니다. – Clifford