2012-04-06 56 views
1

我在Code Composer Studio中使用MISRA C 2004標準。在外設初始化期間,我總是會遇到按位操作的錯誤。如何刪除固件中按位操作的MISRA C錯誤/警告?

在編譯器.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文件,我想消除這些警告。

回答

1

在猜測,你的char是8位和int是(至少)16這意味着的所有unsigned char值可以表示爲(簽名)int秒。那反過來呢就是說在你的表達REG2 |= 0x01;的意思下,你的unsigned char就會升級到int,然後OR進行操作,那麼結果就是把這個退回到unsigned char

如果我沒有記錯的話,改變你常到unsigned char應防止:

REG2 |= (unsigned char)0x01; 

或:

unsigned char one = (unsigned char)0x01; 

REG2 |= one; 
+0

它工作的人..非常感謝! – Chaithra 2012-04-06 13:00:04

+0

如果你不想違反6.3的MISRA C 2004規則,使用uint8_t。REG2 | =(uint8_t)0x01; – 2014-10-07 20:46:39

1

您是否嘗試過:

REG2 |= 0x01U; 

+0

尋找正確答案給我... – Andrew 2012-10-24 19:08:47