TRUE sau FALSE
Care credeţi că pot fi valorile reale ale acestor două define-uri ?
Primul răspuns este normal TRUE=1 și FALSE=0. Asa am învăţat toţi că ar trebui să fie.
Prin urmare codul sursă va arăta cam aşa:
#include "stdio.h"
/*#define TRUE 0x01U */
const unsigned char TRUE =1;
/*#define FALSE 0x00U */
const unsigned char FALSE=0;
int main(void)
{
unsigned char i;
unsigned char flag = FALSE;
/* alte procesări aici */
/* se modifică flag-ul */
/* alte procesări aici */
if(flag == TRUE)
{
/* Temperatura componenta vitală este OK */
/* Afisare flag */
printf("%d",flag);
}
else
{
if(flag == FALSE)
{
/* Temperatura componenta vitală nu este OK */
/* Afisare flag */
printf("%d",flag);
}
}
return 1;
}
Execuția
Programul de mai sus va rula perfect ... într-o lume perfectă.
Dar să presupunem că valoare define-urilor se modifică involuntar în timpul funcţionării inversându-se valorile. Cum se poate întâmpla acest lucru ? Locaţia din FLASH unde este stocat define-ul este alterat din cauza unei defecţiuni este un posibil răspuns. Puţin probabil puteţi spune, dar există posibilitatea aceasta pentru că şi în componentele electronice se pot produce defecţiuni neaşteptate.
Imaginați-vă dacă acest cod rulează pe un ECU într-un avion plin cu pasageri şi că măsoară de exemplu temperatura unei componente vitale pentru siguranţa zborului ....
Ce va rezulta ?
Execuţia codului se va inversa !!!
Soluția
Şi mai departe vă las pe voi să vă imaginaţi continuarea. Se poate întâmpla orice ... Această componentă văzută ca stricată va alerta pilotul, care probabil va decide să aterizeze forţat de miri pe unde.
Cum s-ar putea preveni această situaţie ?
O posibilă rezolvare propusă de mine este:
#include "stdio.h"
/*#define TRUE 0xAAU in binar 1010 1010 */
const unsigned char TRUE = 0xAAU;
/*#define FALSE 0x55U in binar 0101 0101 */
const unsigned char FALSE = 0x55U;
int main(void)
{
unsigned char i;
unsigned char flag = FLASE;
/* alte procesări aici */
/* se modifică flag-ul */
/* alte procesări aici */
if(flag == TRUE)
{
/* Temperatura componenta vitală este OK */
/* Afisare flag */
printf("%d",flag);
}
else
{
if(flag == FALSE)
{
/* Temperatura componenta vitală nu este OK */
/* Afisare flag */
printf("%d",flag);
}
else
{
/* eroare grava de procesare */
/* iniţiază procedura de backup */
printf("%d",flag);
return -1;
}
}
return 1;
}
Opinia mea
Chiar dacă un bit din unul din define-uri se va modifica accidental, acest lucru va fi detectat de către codul sursă. Ideea de bază este că se poate întâmpla orice şi codul sursă trebuie să fie pregătit pentru orice situaţie neaşteptată. Acest stil de programare se numeşte "programare defensivă" şi este recomandată mai ales pentru componente de care depinde siguranţa oamenilor sau a unor componente greu de înlocuit. De exemplu pentru airbaguri, aeronautică, ECU-uri pentru spaţiul cosmic. În acest caz este foarte bine să aplicăm această gândirea excesiv de preventivă. Mai bine să fie copilul în siguranţă decât să cadă drobul de sare de pe dulap şi să omoare copilul. :) Prostia omenească de Ion CreangăPS: Am primit atenţionarea din partea unui coleg despre define-uri, care de fapt se înlocuiesc în momentul preprocesării ceea ce face exemplul meu aproape inutil, şi am schimbat cu nişte constante . Constatele sunt stocate in FLASH şi se pot altera, dar în acelaşi timp în timpul rularii se folosesc în mod direct.