
如何将此图转换为可用的程序?我真的不知道如何阅读这个图表。如果有人可以给我介绍一下,也许可以展示一个代码的例子,以及它与图表的关系,那就太好了。
谢谢!
发布于 2011-07-21 06:42:37
内部有文本的圆圈是状态。文本描述了状态是什么。
虚线箭头指向起始状态。
向外箭头确定此状态可能更改的位置。箭头旁边是正文,用线将正文分为上下两部分。下面的部分是在执行箭头转换时应该发生的操作。上面的部分是条件。当它们为真时-执行此转换(以及更低的部分)。
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) ...;
https://stackoverflow.com/questions/6769376
复制相似问题