Embedded RTOS-队列中不同数据的挂起

Embedded RTOS-队列中不同数据的挂起,embedded,message-queue,rtos,isr,Embedded,Message Queue,Rtos,Isr,我正在从TI编写一个板,我希望能够以某种方式将两个不同的ISR的post发送到任务的消息队列。那部分很好用。但是,在接收端,任务是否有任何智能方法挂起其队列,并根据发布的ISR对数据执行不同的操作 基本上,我有一个LCD更新任务,显示来自我的马达的信息。但是,如果我有一个电机传感器ISR和一个按钮按下ISR,它们发送不同的信息进行更新,这可以在一个队列上完成吗?当然。当每个ISR向队列发送消息时,在消息中放入标识发送消息的ISR的内容。然后,当接收方读取队列时,它可以根据标识符决定要采取的操作

我正在从TI编写一个板,我希望能够以某种方式将两个不同的ISR的post发送到任务的消息队列。那部分很好用。但是,在接收端,任务是否有任何智能方法挂起其队列,并根据发布的ISR对数据执行不同的操作


基本上,我有一个LCD更新任务,显示来自我的马达的信息。但是,如果我有一个电机传感器ISR和一个按钮按下ISR,它们发送不同的信息进行更新,这可以在一个队列上完成吗?

当然。当每个ISR向队列发送消息时,在消息中放入标识发送消息的ISR的内容。然后,当接收方读取队列时,它可以根据标识符决定要采取的操作

ISR1() {
  char msg[4];
  msg[0] = '1';                 // Identify the queue
  get_3_ISR1_data_bytes(msg+1); // Get the data
  q_send(msg);
}

ISR2() {
  char msg[4];
  msg[0] = '2';                 // Identify the queue
  get_3_ISR2_data_bytes(msg+1); // Get the data
  q_send(msg);
}

handler() {
  char *msg;
  q_rcv(msg);
  switch (msg[0]) {
  case '1':
    // Do ISR1 stuff
    break;
  case '2':
    // Do ISR2 stuff
    break;
  default:
    // Something unpleasant has happened
  }
}

如果整个
char
太贵,您可以只设置一位(设置为
0
1
)来识别ISR。

多么明显!我应该意识到这一点。我知道这是怎么回事;然而,我尽量远离状态机。我想在这种情况下,它工作得很好。非常感谢。只有在你做了几次之后,这才是显而易见的。:-)不过,它不是一台状态机;您只是使用其中一个字节作为标志。有关状态机的示例,请参见。