Как убрать ошибки / предупреждения MISRA C о побитовых операциях в прошивке?

Я использую стандарты MISRA C 2004 в Code Composer Studio. Я всегда получаю ошибки в отношении побитовых операций во время инициализации периферийных устройств.

В файле .h компилятора определение выглядит следующим образом.

#define SFR_8BIT(addr)  extern volatile unsigned char addr

SFR_8BIT(REG1);

#define REG2  REG1

Теперь в моем коде, если я использую

REG2 |= 0x01;

MISRA C выдает следующие ошибки:

  1. Поразрядные операторы не должны применяться к операндам, базовый тип которых подписан - # 1393-D (MISRA-C: 2004 10.1 / R)

  2. Значение выражения целочисленного типа не должно неявно преобразовываться в другой базовый тип, если оно не является преобразованием в целочисленный тип той же подписи.

Я не хочу изменять файл .h компилятора и хочу устранить эти предупреждения.


person Chaithra    schedule 06.04.2012    source источник


Ответы (2)


Предположительно, ваш char равен 8 битам, а int (как минимум) 16. Это означает, что все значения unsigned char могут быть представлены как (подписанные) ints. Это, в свою очередь, означает, что в вашем выражении REG2 |= 0x01; ваш unsigned char будет повышен до int, затем будет выполнена операция OR, а затем результат этого приведения обратно к unsigned char.

Если я не ошибаюсь, изменение вашей константы на unsigned char должно предотвратить это:

REG2 |= (unsigned char)0x01;

or:

unsigned char one = (unsigned char)0x01;

REG2 |= one;
person Jerry Coffin    schedule 06.04.2012
comment
Используйте uint8_t, если вы не хотите нарушать правила 6.3 MISRA C 2004. REG2 | = (uint8_t) 0x01; - person no_name; 08.10.2014

Ты пытался:

REG2 |= 0x01U;

?

person Mircea Ionica    schedule 06.04.2012