【问题标题】:How to read a FSM diagram如何阅读 FSM 图
【发布时间】:2011-10-09 19:23:45
【问题描述】:

我如何获取此图表并将其转换为可用的程序。我不太确定如何阅读此图。如果有人可以指导我,也许可以展示一个代码示例以及它与图表的关系,那就太好了。

谢谢!

【问题讨论】:

    标签: network-programming packet state-machine


    【解决方案1】:

    里面有文字的圆圈是状态。文本描述状态是什么。

    虚线箭头指向起始状态。

    外向箭头确定此状态可能更改的位置。箭头旁边是被线分成上下两部分的文字。下半部分是执行箭头转换时应该发生的动作。上半部分是条件。当它们为真时 - 执行此转换(以及更低的部分)。

    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) ...;

    【讨论】:

    • 嗯好的。这有帮助。我会看看我能想出什么。我真的只是想实现 RDT 3.0。
    • 我之前实现过一些底层网络协议,可惜对RDT不熟悉。因此,我只能与您分享有关 FSM 的一般信息。好吧,已经分享了:)
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多