2011-07-20 92 views
5

FMSCách đọc sơ đồ FSM

Làm cách nào để lấy biểu đồ này và dịch nó thành chương trình có thể sử dụng được. Tôi không thực sự chắc chắn làm thế nào để đọc sơ đồ này. Nếu ai đó có thể chỉ cần đi bộ qua tôi, có thể hiển thị một ví dụ về mã và làm thế nào nó liên quan đến sơ đồ, đó là tuyệt vời.

Cảm ơn!

Trả lời

9

Vòng kết nối có văn bản bên trong là các trạng thái. Văn bản mô tả trạng thái là gì.

Mũi tên bị gạch ngang trỏ đến trạng thái bắt đầu.

Mũi tên gửi xác định nơi trạng thái này có thể thay đổi. Bên cạnh mũi tên là văn bản chia cho dòng thành phần trên và phần dưới. Phần dưới là các hành động sẽ diễn ra khi quá trình chuyển đổi mũi tên được thực hiện. Phần trên là điều kiện. Khi chúng đúng - quá trình chuyển đổi này được thực thi (và phần dưới).

Biểu tượng Lambda có nghĩa là bạn không nên làm gì ngoài việc thay đổi trạng thái hiện tại khi quá trình chuyển đổi diễn ra.

Vì vậy, các phần dưới có độ tương ứng thô với các chức năng của bạn. Và phần trên là những điểm mà bạn nên chờ đợi điều kiện - bỏ phiếu hoặc không đồng bộ chờ các gói I/O đang chờ xử lý, bất cứ điều gì.

Dưới đây là một số pseudo-code tương tự như C (Tôi đã viết nó chỉ ở đây nên đừng cho rằng nó hoạt động hoặc thậm chí biên dịch):

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; 
     } 
    } 
} 

Bạn cũng nên đưa vào tài khoản mà nhận và gửi các chức năng có thể chặn, vì vậy mã if (rdt_rcv(rcvpkt)) whatever; về mặt kỹ thuật không chính xác vì bạn không kiểm tra rdt_send cho đến khi nó trả về kiểm soát. Vì vậy, FSM chỉ giao tiếp logic, không phải các khía cạnh kỹ thuật về cách thức tổ chức, quản lý chuỗi v.v. Và mã của tôi không hiển thị các khía cạnh này cũng bởi vì nó có thể phức tạp một cách phức tạp tùy theo nhu cầu của bạn và vì bạn không cung cấp đủ chi tiết để làm cho lời khuyên thông tin bằng các loại vật :)

đoán duy nhất của tôi là bạn sẽ có một số loại dòng bi-đạo (đối với đầu vào và đầu ra tương ứng) và các điều kiện sẽ như thế nào if (there_is_ready_for_consuming_packet_in_the_input_queue) continue;if (data_was_put_to_outgoing_stream_successfully) ...;

+0

Hmmm ok . Những sự giúp đỡ đó. Tôi sẽ xem những gì tôi có thể nghĩ ra. Tôi thực sự chỉ đang cố triển khai RDT 3.0. – Matt

+0

Tôi đã triển khai một số giao thức mạng cấp thấp trước đây nhưng tiếc là tôi không quen với RDT. Vì vậy, tôi chỉ có thể chia sẻ với bạn thông tin chung về FSM. Vâng, đã chia sẻ rồi :) –