2011-07-20 32 views
5

FMS如何讀取FSM圖

如何將此圖表轉換爲可用程序。我不確定如何閱讀這個圖表。如果有人能夠引導我走,可能會展示一個代碼示例以及它如何與圖表相關,那很棒。

謝謝!

回答

9

裏面帶有文本的圓圈是狀態。文本描述了狀態。

虛線箭頭指向起始狀態。

傳出的箭頭決定了狀態可能改變的地方。箭頭旁邊是文字,分爲上半部分和下半部分。下半部分是執行箭頭轉換時應該發生的操作。上半部分是條件。當它們是真實的時候 - 這個轉換被執行(和更低的部分)。

Lambda符號意味着除非在轉換髮生時更改當前狀態,否則不應該執行任何操作。

所以較低的零件有粗糙對應於您的功能。上面的部分是你應該等待的條件 - 輪詢或異步等待懸而未決的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的一般信息。那麼,已經分享:) –