Псевдокод для доступа приемника к беспроводной среде в конечный автомат - PullRequest
0 голосов
/ 14 декабря 2011

Этот псевдокод предназначен для приемника, который пытается получить доступ к беспроводной среде при отправке и получении данных от датчиков.

  1. набор pc = 0.01
  2. отправить пакет опроса
  3. Если ни один датчик не отвечает на опросный пакет, установите pc = min (pc + 0.01, 1.0)
  4. Если пакет данных успешно получен от одного из датчиков, оставьте pc на текущем значении
  5. Если имеется столкновение между двумя или более датчиками, как указано в поврежденном пакете данных, установите pc = pc / 2
  6. Повторите шаг 2

Я прочитал ссылку по Как прочитать схему FSM , и она действительно помогла мне с сенсорной частью. Но я все еще не понимаю, как преобразовать указанный псевдокод в FSM.

Кто-нибудь может предложить ссылку или электронную книгу, которая дает четкое объяснение о преобразовании псевдокода в FSM?

1 Ответ

0 голосов
/ 14 декабря 2011

Я не уверен, что вы действительно ищете здесь; кодировать это просто было бы довольно просто, и эта проблема не выглядит так, как будто она заслуживает полномасштабного подхода с использованием таблицы 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) в свою собственную функцию, и возможно, все детали обработки пакета из разъема датчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...