2012-02-27 41 views
3

我有一個現有的C代碼(第三方來源,我無法更改它),這將不會被PC-Lint(版本9.0)接受。代碼在嵌入式環境中運行,使用Green Hills Compiler。使用直接寄存器尋址時出現PC-Lint錯誤

有沒有人知道如何配置PC-Lint接受代碼定義? 我只附加了結構中第一個成員的錯誤消息。

下面是從頭文件中的定義:

typedef struct 
{ 
    uint32_t PINSEL0; // see ERROR message from PCLint, line 153 in LPC23.h 
    uint32_t PINSEL1; 
    uint32_t PINSEL2; 
} LPC_PINCON_TypeDef; 


#define LPC_PINCON_BASE   (0xE002C000) 
#define LPC_PINCON    ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE) 

#define PINSEL_BASE_ADDR 0xE002C000 
#define PINSEL0  (*(volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00)) 


/**************************/ 

/* function in c-file */ 

void Port_Init() 
{ 

    LPC_PINCON->PINSEL0 &= ~(3 << 4); //p0.2 

    LPC_PINCON->PINSEL0 |= (1 << 4); // 

    LPC_PINCON->PINSEL0 &= ~(3 << 6); //p0.3 

    LPC_PINCON->PINSEL0 |= (1 << 6); // 

    // etc................ 
} 

/*******************************************/ 

    // ERRORS from PC-Lint  
    // **********ERROR MESSAGES************** 

    #... (volatile unsigned long *)(PINSEL_BASE_ADDR + 0x00)) 
    uint32_t PINSEL0; 
    LPC23.h 153 Error 10: Expecting identifier 

    #... BASE_ADDR + 0x00)) 
    uint32_t PINSEL0; 
    LPC23.h 153 Error 102: Illegal parameter specification 

    #... BASE_ADDR + 0x00)) 
    uint32_t PINSEL0; 
    LPC23.h 153 Error 10: Expecting ';' 
+0

爲什麼你根本不使用lint,什麼時候你不想改變代碼?它不是一個編譯器,而是一個分析器。 – Matthias 2012-02-27 14:58:24

+1

SW-項目由第三方代碼(我不想更改)和自己編寫的代碼組成。如果有可能,我只想爲我自己的書面代碼提供lint錯誤。 – user1235613 2012-02-27 16:04:42

回答

5

PC-lint FAQ的摘錄:

  • 如何判斷棉絨不抱怨關於我的編譯器標頭?

    Lint使用「庫」標頭的標籤來指定程序員無法控制(例如編譯器標頭)的 上的那些標頭。默認 所有#包含在一個外國目錄中,或包含在<>之內,都是 被視爲「庫」。這可以通過使用+libclass 選項進行修改,並通過+/-libdir+/-libh選項進一步進行微調。
    然後,您可以使用-wlib,-elib-elibsym選項來控制從庫頭中發出的那些消息。使用PC-lint分發的編譯器選項文件 通常包含一個-wlib(1)選項,該選項將lint輸出從 庫頭限制爲僅限錯誤(抑制警告和參考消息)。

  • 我想,這應該符合您的需求。如果不是的話,一個重現你的警告的最小例子會很好;上面的東西謎語,因爲PINSEL0的#define是之後它用作結構中的標識符。

    2

    如果在Port_Init()函數編譯的#define PINSEL0 ...宏定義是積極的,我不明白你是如何沒有得到編譯錯誤。看起來在編譯過程中必須有一些東西(#ifdef或其他)會禁用PINSEL0宏 - 如果您使用LPC_PINCON_TypeDef結構來訪問寄存器,則不需要(也是有害的)。

    您需要確保相同的控制選項/宏/無論您在運行lint步驟時設置了什麼。

    您可以顯示實際的LPC23.h文件(或指向某個地方的網站)嗎?我發現的一個類似的文件(http://www.keil.com/dd/docs/arm/philips/lpc23xx.h)只使用'直接宏'技術,並沒有提供結構成員訪問技術LPC_PINCON_TypeDef

    2

    我假設LPC_PINCON_TypeDef和宏PINSEL0來自或爲不同的情況。我希望你可以改變這個或那個,因爲這些定義直接衝突。 如果我假定代碼本身編譯正確,那麼在一個翻譯單元中從不會同時使用這兩個定義,並且PC Lint可能/可能使用不正確的設置。

    我想你可能沒有提出編譯器的隱式宏定義給Lint。至少必須定義__ghs__宏,使用選項-d__ghs__。並檢查手冊以獲取更多選項。

    您可能想使用選項-vf檢查確切的文件及其包含順序(或者爲了完整性,您可以使用-vaif來檢查Lint用於查找包含文件的搜索位置);但要小心,輸出非常大,並且很容易滾動窗口甚至是緩衝區。可能最好將輸出結果輸入到文件中,然後再進行檢查。儘管我毫不猶豫地指向我自己的網站,但如果你願意,看看我的PDF "How to wield PC Lint",你會發現從零到正確使用PC Lint編寫代碼的簡單步驟,以及所有選項被設置。

    如果一切都沒有幫助,你必須詳細說明你正在使用的設置以及編譯器和PC Lint的選項。

    相關問題