2015-05-15 9 views
12

An infinite loop with an empty body has undefined behaviour in C++11. Non so se lo fa anche in C, quindi diciamo che sto scrivendo firmware embedded in C++ 11 (lo so, improbabile, ma sopportato da me).Qual è il mio approccio migliore per determinare il comportamento del compilatore per cicli infiniti vuoti?

Se il mio main sono stati semplicemente una:

while (true) {} 

e il resto delle funzionalità del dispositivo sono state gestite da interrupt, quello che gli approcci possono che prendere al fine di scoprire se la mia applicazione rende questo circuito sicuro e significativo? Ricordando che, secondo lo standard, un'implementazione è libera di fare ciò che vuole in questo caso, inclusa la rimozione completa del ciclo.

Supponiamo che non sia chiaramente indicato nella documentazione di implementazione, come non l'ho mai visto.

Oppure questa è una causa persa e dovrei risolvere una soluzione?

volatile unsigned int dummy = 0; 

while (true) { 
    // Make the loop well-defined... 
    dummy++; 

    // ...with a trivial operation that'll hardly ever even happen 
    sleep(42*86400); 
} 

riconosco che sviluppatori embedded storicamente non danno molta attenzione a questo genere di cose, invece assumendo una più "piedi per terra", approccio "senso comune" dal loro compilatore. Ma preferisco codificare rigorosamente gli standard, per evitare sorprese il più possibile.

+1

Strano tutte le richieste anche :) –

+0

@StraightLine: Di tanto in tanto;) Se questo –

+8

è più che una domanda teorica, la tua CPU incorporata ha quasi certamente l'istruzione di interrompere l'operazione fino a quando un'interruzione non viene a mancare. Ciò farebbe risparmiare un po 'di carica della batteria (e, da quello che raccolgo, renderà il tuo loop ben definito). – zneak

risposta

2

Come considerare l'output in linguaggio assembly dal compilatore?

g++ -std=c++0x x.cpp -S 

uscite:

.L2: 
     jmp  .L2 

e

clang++-3.5 -S -std=c++11 x.cpp 

uscite:

.LBB0_1:        # =>This Inner Loop Header: Depth=1 
     jmp  .LBB0_1 
+1

Guardare all'assemblaggio generato in una determinata esecuzione di build non fornisce realmente le informazioni necessarie. Bene, a meno che tu non invii solo quel binario esatto risultante. :) –

+0

Alcuni potrebbero presumere che "firmware incorporato" implichi un'immagine binaria esatta. –

+1

Abbastanza buono. E, francamente, probabilmente la risposta giusta. :) –

Problemi correlati