Programma intero in CASO

3

Inizierò col dire che questo potrebbe non essere il posto giusto per pubblicarlo.

Quindi ... Sto lavorando in Embedded Development, usando C.

C'è qualche vantaggio o svantaggio nel fare quanto segue:

while (1)
{
   i++;
   switch (i)
   {
      case 1:
         x_get_inputs();
         break;
      case 2:
         x_react();
         break;
      case 3:
         x_set_outputs();
         i = 0;
         break;
      default:
         break;
    }
}

Piuttosto che un elenco standard di chiamate di funzione?

Penso che sia simile a un Round Robin RTOS ?

La mia logica è che il tempo di ciclo del programma sarà più breve, e come tale dovrebbe essere più efficiente?

    
posta Joshpbarron 14.06.2014 - 02:13
fonte

1 risposta

5

Supposto che la variabile i sia inizializzata a 0 all'inizio, il tuo codice è solo una versione offuscata di

while(1)
{
    x_get_inputs();
    x_react();
    x_set_outputs();
}

(e mi ci sono voluti alcuni minuti per capire che il tuo codice ha davvero questa semantica e nessun% emulato nascostogoto). Questo è più breve e mostra esplicitamente cosa sta succedendo qui. La tua versione originale è difficile da capire, difficile da mantenere, e immagino che non ti porti nemmeno alcun vantaggio a livello di assemblaggio o di prestazioni. Quindi, per questo caso, consiglierei contro di esso.

D'altro canto, quando questo viene realmente chiamato in un contesto in cui i può avere un valore arbitrario da 0 a 2, il costrutto ha più senso (anche se penso che ci dovrebbe essere almeno una guardia di sicurezza intorno a questo impedendomi di entrare in > 2, che finirebbe in un ciclo infinito senza chiamare più nessuna delle tre funzioni.

Tuttavia, IMHO il costrutto è ancora eccessivamente complicato anche per quel caso. Ecco una versione più breve, che fa lo stesso:

while (1)
{
   switch (i)
   {
      case 0:
         x_get_inputs();
      case 1:
         x_react();
      case 2:
         x_set_outputs();
      default:
         i = 0;
    }
}

Puoi renderlo ancora più pulito sostituendo il numero intero i con un enum (con nomi ben scelti) e cambia il nome di i in qualcosa come "firstOperation". Inoltre, si dovrebbe aggiungere una sorta di salvaguardia per il caso di i > 2 pure. Lascio questo come "un esercizio per il lettore".

    
risposta data 14.06.2014 - 11:02
fonte

Leggi altre domande sui tag