使用直接寄存器寻址时出现PC-Lint错误

时间:2012-02-27 14:23:36

标签: c embedded cpu-registers lint pc-lint

我有一个现有的C代码(第三方来源,我无法改变它),PC-Lint(版本9.0)不会接受。代码在嵌入式环境中运行,使用Green Hills Compiler。

有没有人知道如何配置PC-Lint接受代码定义? 我只附加了struct中第一个成员的错误消息。

以下是头文件中的定义:

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 ';'

3 个答案:

答案 0 :(得分:5)

摘自PC-lint FAQ

  
      
  1. 如何告诉lint不要抱怨我的编译器标题?

         

    Lint使用“library”标题的标签来指定那些标题   程序员无法控制的程序(如编译器头)。默认情况下   所有#includes来自外部目录,或包含在&lt; &gt; ,是   被认为是“图书馆”。这可以通过使用+libclass进行修改   选项,并使用+/-libdir+/-libh选项进一步微调   然后,您可以使用-wlib-elib-elibsym选项来控制这些选项   从库头发出的消息。编译器选项文件已分发   PC-lint通常包含-wlib(1)选项,用于限制lint输出   库标题仅限于错误(禁止显示警告和信息性消息)。

  2.   

我猜,这应该符合您的需求。如果没有,那么重现你的警告的最小例子会很好;上面的内容让我感到厌烦,因为PINSEL0的#define 之后用作结构中的标识符。

答案 1 :(得分:2)

如果编译#define PINSEL0 ...函数时Port_Init()宏定义处于活动状态,我无法理解您是如何得到编译器错误的。似乎必须有一些东西(#ifdef或其他什么)在编译期间禁用PINSEL0宏 - 如果你使用LPC_PINCON_TypeDef结构来实现它是没有必要的(并且是有害的)访问寄存器。

您需要确保在运行lint步骤时设置相同的控制选项/宏/任何设置。

您能否显示实际的LPC23.h文件(或在某处指向网络)?我发现的类似文件(http://www.keil.com/dd/docs/arm/philips/lpc23xx.h)仅使用“直接宏”技术,并且不提供LPC_PINCON_TypeDef结构成员访问技术。

答案 2 :(得分:2)

我认为LPC_PINCON_TypeDef和宏PINSEL0来自或来自不同的情况。我希望你被允许改变其中一个,因为定义是立即冲突的。 如果我假设代码本身编译正确,那么两个定义永远不会在一个翻译单元中同时使用,并且PC Lint可能/可能使用不正确的设置。

我认为您可能没有将编译器的隐式宏定义呈现给Lint。至少必须定义__ghs__宏,使用选项-d__ghs__。并查看手册以获取更多选项。

您可能需要使用-vf选项检查确切的文件及其包含顺序(或者为了完整性,您可以使用-vaif检查Lint用于查找包含文件的搜索位置);但要小心,输出非常大,并且可以轻松地滚动窗口甚至缓冲区。最好将输出传输到文件中,然后再检查它。

虽然我对指向自己的网站犹豫不决,但如果你愿意,请查看我的PDF "How to wield PC Lint",你会发现从零开始的简单步骤,以及使用PC Lint正确地修改你的代码要设置的选项。

如果一切都没有帮助,你必须详细说明你正在使用的设置以及编译器和PC Lint的选项。