如何阅读 FSM 图

2024-01-02

我如何获取该图并将其转换为可用的程序。

我不太确定如何阅读该图。

引导我完成它,也许会展示一个代码示例以及它与图表的关系。


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

虚线箭头指向起始状态。

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

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; and if (data_was_put_to_outgoing_stream_successfully) ...;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阅读 FSM 图 的相关文章

  • 使用 C# 中的异步套接字在任何给定时间将消息发送回客户端列​​表

    我已经设置了一个异步服务器 它通过连接 接收消息并将消息发送回连接客户端来完美工作 服务器本身是一个游戏世界服务器 MMORPG 风格 当用户将其位置发送到其所在位置时 我需要使用 PlayerPositionNotice 将其推送给所有客
  • 不调用bind()的情况下监听()

    我尝试了以下方法 int sockfd socket listen sockfd 10 accept sockfd 没有一个调用失败 并且程序开始阻塞 就像我调用了bind 一样 在这种情况下会发生什么 由于没有本地地址或端口 是否永远无法
  • 哪个进程拥有给定的端口(Linux 内核)?

    我正在为 Linux 编写一个简单的应用程序层防火墙 目前没什么特别的 只是我需要的东西 由于 iptables 的所有者模块不够 我决定使用 libnetfilter queue 来实现 在我的防火墙 C C 应用程序 中的某个时刻 我需
  • 使用 Read::read_to_string 从 TcpStream 读取会挂起,直到远程端关闭连接

    我正在尝试实施Haskell IRC 机器人教程 https wiki haskell org Roll your own IRC bot在 Rust 中 我在阅读连接后服务器发送给我的内容时遇到一些困难 似乎发生的情况是 我连接并从服务器
  • 是否可以在不使用 WMI 的情况下获取网络适配器的 PnPDeviceId?

    我一直在尝试使用 p invoke setupapi 调用获取给定网络适配器的 PnPDeviceId 但没有成功 我不情愿地决定使用 WMI 如下所示 public static string GetPnpDeviceId string
  • 如何从服务器中的客户端池中识别客户端 - 设计

    好的 我正在使用一个客户端 服务器库 服务器可以接受来自客户端的多个连接 每次调用 Accept 时 如果成功 客户端套接字的句柄就会被推送到映射 并以假定的唯一 ID 作为键 这样当服务器稍后想要向特定客户端发送消息时 它就会使用该 ID
  • 两个或多个 Android 设备之间的 WiFi 聊天

    我想开发一个聊天应用程序 使用 wifi 网络在两个或多个 Android 设备之间聊天 该应用程序应该能够相互发送或接收字符串 我有在pc和android之间使用蓝牙网络的经验 任何人都可以给我任何建议或正确的方向 提前致谢 您可以在两个
  • 西格网络速度

    这个库对于获取 cpu ram 和其他人员来说非常棒 但是 我不知道如何获得网络速度 这意味着 在一段时间内发送和接收了多少数据 有办法给我这些数据吗 这可能是我正在寻找的东西吗 Tcp stat sigar getTcp stat get
  • accept() 创建一个新套接字是什么意思?

    我的问题基于以下理解 套接字由 ip port 定义 服务器和客户端都有自己的套接字 Socket连接由五组server ip server port client ip client port protocol定义 套接字描述符是标识套接
  • 如何将参数传递给 `transitions` 库中的 on_enter 回调?

    我想用过渡 https pypi org project transitions 并且需要一个我在文档中找不到的相当琐碎的功能 并且想知道它是否已实现 我想定义一个on enter在某些状态上回调 但将参数传递给该回调 至少知道我是从哪个状
  • 使用pluginaweek的state_machine,我可以在事件期间引用activerecord对象吗?

    我正在尝试实现一个 挂起 事件 将对象转换为 挂起状态 但我需要能够 取消暂停 并返回到之前的状态 我向模型添加了 previous state 字段 但我看不到如何在事件块内访问它 这是我试图实现的基本逻辑 event suspend d
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用netfilter队列修改数据包?

    我目前正在尝试在用户空间中使用带有 libnetfilter queue 的代码来修改在 iptables 的 NFQUEUE 目标中排队的数据包 但是我不知道如何去做 我已将其设置为使用 NFQNL COPY PACKET 复制数据包 如
  • 互联网 RFC 数据包图中预期的位(不是字节)顺序是哪个

    我正在我的家庭有线网络上解析 ICMPv6 数据报 但在特定 RFC 中找不到对位排序约定的明确提及 多字节字段是网络顺序的 但是字节内的位又如何呢 机器是按字节寻址的 但网络硬件对位进行序列化 在图表中 8 位字段 左侧 的一位最终位于无
  • 什么是 SO_SNDBUF 和 SO_RCVBUF

    你能解释一下到底是什么吗SO SNDBUF and SO RCVBUF选项 好的 出于某种原因 操作系统缓冲传出 传入数据 但我想澄清这个主题 他们的角色 通 常 是什么 它们是每个套接字的缓冲区吗 传输层的缓冲区 例如 TCP 缓冲区 和
  • 您使用什么来通过其自定义协议来测试(功能/负载/压力)您的网络服务?

    我最近创建了一个回合制游戏服务器 可以接受数十万个并发客户端连接 长话短说 Linux 上的 epoll 通信基于简单 定制 基于线路的协议 该服务器允许客户端连接 寻找游戏比赛中的其他玩家 玩所述游戏 发送动作 聊天消息等 并在游戏结束时
  • 如何使用机器学习从数据序列计算状态图?

    通用配方 我有一个由一系列点组成的数据集 每个点有 12 个特征 我有兴趣检测此数据中的事件 在训练数据中我知道事件发生的时刻 当事件发生时 我可以在事件发生之前的点序列中看到可观察到的模式 该形态由大约 300 个连续点形成 我感兴趣的是
  • 哪些浏览器支持 HTML5 WebSocket API?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我将开发一个在浏览器中运行的即时消息应用程序 哪些浏览器支持WebSocket API
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • 如何模拟非确定性有限换能器?

    只需跟踪自动机所处的状态以及它在输入字符串中的位置 就可以在输入字符串上轻松模拟非确定性自动机 但是 如何模拟非确定性传感器 当然 传感器可以将输入符号转换为输出符号 并给出字符串作为输出 而不仅仅是布尔值 这似乎更复杂 因为我们需要以某种

随机推荐

  • Scala:在路径相关上下文中重用路径相关类型产生的泛型

    简而言之 以下内容无法编译 原因如下 我怎样才能使其工作 trait Simulator type CM T def useCM v CM case class CMH S lt Simulator T cm S CM T class Si
  • 查找不平衡的大括号和圆括号

    海湾合作委员会4 6 0 GNU Emacs 23 2 1 我有一些 C 代码 在某些时候我一定犯了一个打字错误 现在我留下了不平衡的花括号或括号 我有大约 2000 行代码 我只是想知道有什么技术可以找到它们吗 Emacs 有一些很好的功
  • 我应该使用 ON DELETE CASCADE、 :dependent => :destroy 还是两者都使用?

    在 Rails 应用程序中 我在 MySQL 中有外键约束 我将它们全部手动设置 与我的迁移分开 我想弄清楚我是否应该使用 ActiveRecord dependent gt destroy选项 例如 在我的架构中我有表 users log
  • 如何在 python 中检索按钮的行和列信息并使用它来更改其设置

    我正在创建一个游戏并尝试用 python 和 tkinter 制作它 我已经用基于单词的 python 完成了它 并希望将其图形化 我创建了一个用作网格的按钮网格 这些按钮当前带有字母 O 以显示空白区域 然而 我想要的是显示海盗所在位置的
  • 使用 DataFrame.lookup 获取列名称是字符串子集的行

    假设有一个如下所示的简单数据框 data grades Feb 10 20 30 40 50 grades Jan 5 10 15 20 25 grades April 1 2 3 4 5 months Feb April Jan Feb
  • 如何使用具有深度限制的 jQuery find() ?

    我需要使用 jquery 的 find 选择器来获取所有具有 field container 类的 div 问题是我无法深入 DOM 树 这是我的简化 HTML 结构 div div div class field container sp
  • JTable 中的多行选择

    我有一个 JTable 其中一列是不可编辑的文本 第二列是一个显示布尔值的复选框 现在我想要的是 当用户选择多行并取消选中其中任何一行时选中复选框 则选择下的所有复选框都应取消选中 反之亦然 使用 Hovercraft 的示例和 camic
  • 简单插入适用于 phpmyadmin 但不适用于 php

    我正在尝试使用 mysql query 插入此查询 INSERT INTO um group rights um group id cms usecase id um right id VALUES 2 1 1 INSERT INTO um
  • MySQL / MariaDB:如何查找基于时间的数据的差距?

    记录器系统每 5 秒保存一行数据 秒 0 5 10 15 55 时间类似于23 00 07不可能 有时 记录器由于通信错误而无法保存 并且表中只是缺少行 我需要检测这些间隙 我想读取间隙之前的最后一行和间隙之后的第一行 这些是演示数据 cr
  • 来自升序序列的连续子列表

    given xs 1 2 3 4 6 7 9 10 11 我的目标是回来 1 2 3 4 6 7 9 10 11 我想我可以这样做 groupBy x y gt succ x y xs 但这会返回 1 2 3 4 6 7 9 10 11 进
  • 哪个 .NET 版本适用于 C# 5 异步功能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户必须在计算机上安装哪个版本的 N
  • python属性前后带有下划线有什么区别[重复]

    这个问题在这里已经有答案了 我想知道Python中这些有什么区别 self var1 self var1 self var1 self var1 作为起点 您可能会发现这句话很有帮助PEP 8 Python 代码风格指南 http www
  • 在编写 Spring Resource Bundle 时是否有单一规则来处理单引号?

    春天的ResourceBundleMessageSource uses MessageFormat用于替换占位符 0 内部消息 MessageFormat要求单引号 使用两个单引号 see 消息格式 Javadoc http docs or
  • 从文本块中删除停用词

    我正在处理一个文本块 步骤之一是删除停用词 Textblob 是不可变的 因此我将其转换为列表来完成这项工作 blob tb tekst lista word for word in blob words if word not in st
  • 可以同时延长2个课程吗?

    我有这些课程 public class myClassPage System Web UI Page public myClassPage public class myClassControl System Web UI UserCont
  • 碰撞检测和碰撞响应

    我一直在尝试使用 androids Opengl 来表示一些移动 旋转的对象 现在我想让他们碰撞并做出现实的反应 通过研究这个问题 我可以找到许多资源 这些资源建议我如何确定两个 3D 形状是否在当前帧中发生碰撞 或者它们是否会在下一帧中发
  • 有效合并大镶木地板文件

    我正在使用 parquet tools 来合并 parquet 文件 但 parquet tools 似乎需要与合并文件一样大的内存 我们是否有其他方法或 parquet tools 中的可配置选项来更有效地使用内存 因为我在 hadoop
  • 如何在android中的textview中缩进文本?

    我试图通过制作单独的段落来使文本更容易阅读 我尝试在字符串资源中的文本之前添加空格 但它不起作用 我想知道是否可以向文本视图或字符串资源本身添加属性 谢谢罗布 您可以使用 t 表示制表符 n 表示换行符 它肯定有效 并将此属性写入 xml
  • 无法使用 var 和 foreach 将 void 分配给隐式类型局部变量

    我正在尝试列出表单中的所有按钮名称以使用代码列出 var v new List
  • 如何阅读 FSM 图

    我如何获取该图并将其转换为可用的程序 我不太确定如何阅读该图 引导我完成它 也许会展示一个代码示例以及它与图表的关系 里面有文字的圆圈是州 文本描述了状态是什么 虚线箭头指向起始状态 传出箭头确定此状态可以更改的位置 箭头旁边是被线分为上半