2012-04-26 7 views
3

私はTIからボードをプログラミングしていますが、どういうわけか、タスクのメッセージキューに2つの異なるISRポストを持たせたいと思います。その部分は正常に動作します。しかし、受信側では、タスクが待ち行列上にペンディングし、ISRが投稿されたデータに基づいて異なる操作を実行するインテリジェントな方法がありますか?RTOS - キュー内の別のデータで保留中

基本的には、自分のモーターの情報を表示するLCDアップデートタスクがあります。しかし、私はモータセンサーISRとボタンのプレスISRが異なる情報を送信する場合、これは1つのキューで行うことができますか?

答えて

3

確かに。各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があまりにも高価である場合は、ISRを識別するために(0または1に)ただ1つのビットを設定することができます。

+0

わかりやすい!私はそれを認識していたはずです。私はこれがどのように機能するかを見ることができます。しかし、私は州の機械から離れようとします。この場合はうまくいくと思います。ありがとうございました! – Ci3

+1

あなたがそれを数回やった後でしかわかりません。 :-)それはステートマシンではありません。バイトの1つをフラグとして使用しているだけです。ステートマシンの例については、http://stackoverflow.com/a/256011/29157を参照してください。 –

+0

ああ、大変ありがとうございました! – Ci3

関連する問題