【问题标题】:RTOS - pending on different data in a queueRTOS - 等待队列中的不同数据
【发布时间】:2012-05-06 18:43:48
【问题描述】:

我正在对 TI 的电路板进行编程,并且我希望能够以某种方式将两个不同的 ISR 发布到任务的消息队列中。那部分工作正常。但是,在接收端,是否有任何智能方式让任务挂在其队列上并根据 ISR 发布的数据对数据执行不同的操作?

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

【问题讨论】:

    标签: embedded message-queue rtos isr


    【解决方案1】:

    当然。当每个 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 太贵,您可以只设置一个位(01)来识别 ISR。

    【讨论】:

    • 多么明显!我应该意识到这一点。我可以看到这是如何工作的;但是,我尽量远离状态机。我想在这种情况下它运作良好。谢谢!
    • 这只有在你做了几次之后才明显。 :-) 不过,它不是状态机;您只是使用其中一个字节作为标志。有关状态机的示例,请参阅 stackoverflow.com/a/256011/29157
    猜你喜欢
    • 2020-05-04
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2023-03-09
    • 1970-01-01
    • 2011-10-31
    • 2015-04-14
    相关资源
    最近更新 更多