2012-04-06 13 views
1

Ich verwende MISRA C 2004 Standards in Code Composer Studio. Ich bekomme immer Fehler in Bezug auf bitweise Operationen während der Initialisierung der Peripheriegeräte.Wie entfernt man MISRA C Fehler/Warnungen bei bitweisen Operationen in der Firmware?

In der Compiler-H-Datei ist die Definition wie folgt.

#define SFR_8BIT(addr) extern volatile unsigned char addr 

SFR_8BIT(REG1); 

#define REG2 REG1 

Jetzt in meinem Code, wenn ich

REG2 |= 0x01; 

Der MISRA C diese Fehler herausspringen wird:

  1. Bit-Operatoren gilt nicht für die Operanden angewendet werden, deren zugrunde liegende Typ ist signiert - # 1393-D (MISRA-C: 2004 10.1/R)

  2. Der Wert eines Ausdrucks vom Integer-Typ darf nicht implizit in einen anderen zugrunde liegenden Typ konvertiert werden, wenn es sich nicht um eine Konvertierung in einen Integer-Typ mit der gleichen Signedness handelt.

Ich will nicht den Compiler .h-Datei ändern, und ich möchte diese Warnungen beseitigen.

Antwort

1

Bei einer Vermutung, Ihre char 8 Bits und int ist (mindestens) 16, dass alle Werte von unsigned char bedeutet kann dargestellt werden als (signiert) int s. Das wiederum bedeutet in Ihrem Ausdruck REG2 |= 0x01;, Ihre unsigned char wird auf int befördert, dann die OR Operation durchgeführt, dann das Ergebnis dieser zurückgeworfen auf unsigned char.

Wenn ich mich nicht irre, sollte Ihre Konstante zu einem unsigned char Wechsel verhindern, dass:

REG2 |= (unsigned char)0x01; 

oder:

unsigned char one = (unsigned char)0x01; 

REG2 |= one; 
+0

Es arbeitete Mann .. Vielen Dank! – Chaithra

+0

Verwenden Sie uint8_t, wenn Sie keine Verletzung mit 6.3 Regel von MISRA C 2004 wollen. REG2 | = (uint8_t) 0x01; –

1

Haben Sie versucht:

REG2 |= 0x01U; 

?

+0

Sieht die richtige Antwort auf mich ... – Andrew