如何删除固件中按位操作的MISRA C错误/警告?

时间:2012-04-06 04:20:59

标签: c compiler-construction misra

我在Code Composer Studio中使用MISRA C 2004标准。在外设初始化期间,我总是会遇到按位操作的错误。

在编译器.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.   
  3. 如果整数类型表达式的值不是转换为相同签名的整数类型,则不应将其隐式转换为不同的基础类型。

  4.   

我不想更改编译器.h文件,我想根除这些警告。

2 个答案:

答案 0 :(得分:1)

猜测一下,char为8位,int为(至少)16。这意味着unsigned char的所有值都可以表示为(已签名){{1} }秒。反过来,这意味着在您的表达式int中,您的REG2 |= 0x01;将被提升为unsigned char,然后执行int操作,然后将该结果返回给OR

如果我没有弄错,将常量更改为unsigned char可以防止:

unsigned char

或:

REG2 |= (unsigned char)0x01;

答案 1 :(得分:1)

你试过了吗?

REG2 |= 0x01U;