2011-07-20 10 views
5

FMSSposób odczytywania wykresu FSM

Jak wykonać ten schemat i przetłumaczyć go na przydatny program. Nie jestem pewien, jak odczytać ten schemat. Jeśli ktoś mógłby mnie przepuścić, może pokazać przykład kodu i jego związek z diagramem, to świetnie.

Dzięki!

Odpowiedz

9

Kręgi z tekstem wewnątrz są stanami. Tekst opisuje stan.

Przerywana strzałka wskazuje stan początkowy.

Strzałki wychodzące określają, gdzie ten stan może się zmienić. Obok strzałki jest tekst podzielony przez linię na część górną i część dolną. Dolna część to akcje, które powinny się odbywać po wykonaniu przejścia ze strzałką. Górna część to warunki. Gdy są prawdziwe - to przejście jest wykonywane (a więc i niższa część).

Symbol Lambda oznacza, że ​​nie należy nic robić, z wyjątkiem zmiany bieżącego stanu, gdy nastąpi przejście.

Tak niższe części mają grubość odpowiadającą twoim funkcjom. Górne części to punkty, w których powinieneś czekać na warunki - odpytywanie lub asynchronizacja w oczekiwaniu na oczekujące pakiety we/wy, cokolwiek.

Oto niektóre pseudo-kod podobny do C (pisałem to właśnie tu, więc nie ponoszą działa lub nawet kompiluje):

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; 
     } 
    } 
} 

Należy również wziąć pod uwagę, że odbieranie i wysyłanie funkcje może być blokowany, więc kod if (rdt_rcv(rcvpkt)) whatever; jest technicznie niepoprawny, ponieważ nie sprawdza się dla rdt_send, dopóki nie zwróci kontroli. Tak więc FSM komunikuje tylko logiczny przepływ, nie techniczne aspekty tego, jak powinno być zorganizowane, zarządzanie wątkami itp. A mój kod nie pokazuje tych aspektów również dlatego, że może być przyzwoicie skomplikowany w zależności od twoich potrzeb i ponieważ nie dałeś wystarczająco dużo szczegółów dokonywanie świadomych rad na ten rodzaj rzeczy :)

My tylko przypuszczenie, że masz jakąś bi-skierowany strumień (na wejściu i wyjściu, odpowiednio), a warunki będzie jak if (there_is_ready_for_consuming_packet_in_the_input_queue) continue; i if (data_was_put_to_outgoing_stream_successfully) ...;

+0

Hmmm ok . To pomaga. Zobaczę, co wymyślę. Naprawdę staram się zaimplementować RDT 3.0. – Matt

+0

Wcześniej zaimplementowałem kilka protokołów sieci niskiego poziomu, ale niestety nie jestem zaznajomiony z RDT. Mogę więc podzielić się z Wami ogólnymi informacjami na temat FSM. Cóż, udostępniony już :) –

Powiązane problemy