-1

この疑似コードは、センサーからデータを送受信する際にワイヤレス メディアにアクセスしようとするシンク用です。

  1. 設定pc = 0.01
  2. ポーリング パケットを送信する
  3. ポーリング パケットに応答するセンサーがない場合は、pc = min (pc + 0.01, 1.0)
  4. センサーの 1 つからデータ パケットが正常に受信された場合は、pc現在の値のままにします。
  5. 破損したデータ パケットによって示されるように、2 つ以上のセンサー間で衝突が発生した場合は、pc = pc / 2
  6. 手順 2 を繰り返します

私はFSMダイアグラムの読み方のリンクを読みましたが、センサーの部分で本当に役に立ちました。しかし、上記の疑似コードを FSM に変換しようとすることについて、私はまだ混乱しています。

疑似コードを FSM に変換する方法を明確に説明しているリンクまたは電子ブックを提案できる人はいますか?

4

1 に答える 1

0

ここで何を探しているのかわかりません。これを単純にコーディングするのは非常に簡単ですが、この問題は本格的な FSM テーブル駆動型のアプローチに値するようには見えません。

C ライクな疑似コードを次に示します。

double pc = 0.01;
int sensorsfd;

void loop(void) {
    for (;;) {
        fd_set readfds, writefds, exceptfds;
        FD_ZERO(&readfds);
        FD_ZERO(&writefds);
        FD_ZERO(&exceptfds);
        FD_SET(sensorsfd, &readfds);

        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = 1; /* 0.001 seconds */

        int r;

        send_polling_packet();

        r = select(sensorsfd+1, &readfds, &writefds, &exceptfds, &tv);

        if (r == -1 && errno == EINTR) {
            continue;
        } else if (r == -1) {
            perror("select() failed");
            exit(1);
        } else if (r == 0) {
        /* timeout expired */
            pc = min (pc + 0.01, 1.0);
        } else if (r == 1) {
        /* sensorsfd won't block when reading it */
            packet_t p = read_packet(sensorsfd);
        /* should also handle _no packet_ if the sensors
           socket returns EOF */
            if (packet_corrupted(p)) {
                pc /= 2;
            } else {
                handle_packet(p);
            }
        } else {
            /* error in program logic */
        }
    }
}

私がこれを書いたばかりで、それをテストするメカニズムがないという意味での疑似コード。プログラムがこれよりもはるかに複雑になる場合は、おそらくすべてのselect(2)セットアップを独自の関数にカプセル化し、センサーのソケットからのパケットの処理のすべての詳細をカプセル化する必要があります。

于 2011-12-14T01:11:36.363 に答える