首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阅读FSM图表

如何阅读FSM图表
EN

Stack Overflow用户
提问于 2011-07-21 06:38:42
回答 1查看 4.5K关注 0票数 5

如何将此图转换为可用的程序?我真的不知道如何阅读这个图表。如果有人可以给我介绍一下,也许可以展示一个代码的例子,以及它与图表的关系,那就太好了。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-21 06:42:37

内部有文本的圆圈是状态。文本描述了状态是什么。

虚线箭头指向起始状态。

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

Lambda符号意味着当转换发生时,除了改变当前状态外,你不应该做任何事情。

所以下面的部分有对应于你的函数的粗略部分。上面的部分是您应该等待条件的点-轮询或异步等待挂起的I/O数据包,无论是什么。

下面是一些类似于C的伪代码(我只是在这里写的,所以不要假设它可以工作,甚至不能编译):

代码语言:javascript
复制
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) ...;

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6769376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档