3

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

有没有人知道如何配置 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 ';'
4

3 回答 3

5

摘自PC-lint 常见问题解答

  1. 如何告诉 lint 不要抱怨我的编译器头文件?

    Lint 使用“库”标头的标签来指定程序员无法控制的那些标头(例如编译器标头)。默认情况下,来自外部目录或包含在< >中的所有#include都被视为“库”。这可以通过使用选项进行修改,并使用和+libclass 选项进一步微调 。 然后,您可以使用,和选项来控制那些从库头发出的消息。与 PC-lint 一起分发的编译器选项文件通常包含一个选项,该选项将来自库头的 lint 输出限制为仅错误(抑制警告和信息性消息)。+/-libdir+/-libh
    -wlib-elib-elibsym-wlib(1)

我想,这应该符合您的需求。如果没有,重现您的警告的最小示例会很好;上面的东西让我很困惑,因为 PINSEL0 的#define 是它用作结构中的标识符之后。

于 2012-02-27T16:29:18.977 回答
2

我假设LPC_PINCON_TypeDefPINSEL0来自或针对不同的情况。我希望您可以更改其中一个,因为定义立即发生冲突。如果我假设代码本身编译正确,那么这两个定义永远不会在一个翻译单元中同时使用,并且 PC Lint 可能/可能使用不正确的设置。

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

您可能希望使用该选项检查确切的文件及其包含顺序-vf(或者为了完整性,您可以使用-vaif检查 Lint 用于定位包含文件的搜索位置);但要小心,输出非常大,并且很容易滚动出窗口甚至缓冲区。最好将输出通过管道传输到文件中,然后再进行检查。

尽管我不愿指向我自己的网站,但如果您愿意,请查看我的 PDF “如何使用 PC Lint”,您会发现从零到使用 PC Lint 正确 linting 您的代码的简单步骤,所有要设置的选项。

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

于 2012-02-29T06:13:00.747 回答
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结构成员访问技术。

于 2012-02-28T20:11:24.823 回答