2011-07-20 14 views
5

FMSFSMダイアグラムの読み方

この図をどのように使用して、使用可能なプログラムに変換しますか?私はこの図をどのように読むべきかわからない。誰かが私を通り抜けることができたら、コードの例とそれがダイアグラムにどのように関係しているかを見てみましょう。

ありがとうございます!

答えて

9

テキストが入った円は状態です。テキストは、状態が何であるかを示します。

破線矢印は開始状態を示します。

発信矢印は、この状態が変わる可能性のある場所を決定します。矢印の横には、上半分と下半分に分けたテキストがあります。下の部分は、矢印の遷移が実行されるときに実行されるアクションです。上部は条件です。それらが真実であるとき、この遷移が実行されます(そしてその下の部分)。

ラムダ記号は、トランジション時に現在の状態を変更する以外は何もしないでください。

したがって、下の部分はお使いの機能に対応する粗い部分です。また、上部は、ポーリングや非同期の待機中のI/Oパケットの待機など、条件を待つべきポイントです。ここで

は、いくつかの擬似コードは、C(私はここにそれを書いたので、それが動作するかさえコンパイル負いません)に似ています。

enum State { WaitFor0Call, WaitForAck0, WaitForCall1, WaitForAck1 } 

int main() { 
    State state = WaitFor0Call; 
    while (1) { 
     switch (state) { 
     case WaitFor0Call: 
      if (rdt_rcv(rcvpkt)) continue; 
      if (rdt_send(data)) { 
       state = WaitForAck0; 
       sndpkt = make_pkt(0, data, checksum); 
       udt_send(sndpkt); 
       start_timer(); 
      } 
      break; 
     case WaitForAck0: 
      // ...similar code... 
      break; 
     case WaitForCall1: 
      // ...similar code... 
      break; 
     case WaitForAck1: 
      // ...similar code... 
      break; 
     } 
    } 
} 

あなたはまた、受信を考慮に入れると、機能を送信する必要がありますブロックしている可能性がありますので、コードif (rdt_rcv(rcvpkt)) whatever;は、コントロールを返すまでrdt_sendをチェックしないため、技術的に間違っています。だから、FSMは論理的な流れだけを伝達するのであって、どのように組織化すべきか、スレッド管理などの技術的な側面ではない。そして、私のコードは、あなたの必要に応じて、また十分な詳細を与えなかったので、物事のこれらの並べ替え:)

上の情報に基づいたアドバイスをするためには、私の唯一の推測では、双方向指向ストリームのいくつかの並べ替えを持っているだろうということです(入力と出力用にそれぞれ)と条件がif (there_is_ready_for_consuming_packet_in_the_input_queue) continue;if (data_was_put_to_outgoing_stream_successfully) ...;

+0

うーんOKのようになります。それは役に立ちます。私は何が出てくるのか見てみましょう。私は本当にRDT 3.0を実装しようとしています。 – Matt

+0

私はいくつかの低レベルのネットワークプロトコルを実装しましたが、残念ながら私はRDTに慣れていません。だから私はFSMに関する一般的な情報しか共有できませんでした。まあ、既に共有:) –