【问题标题】:PC-Lint errors when using direct register addressing使用直接寄存器寻址时出现 PC-Lint 错误
【发布时间】:2012-03-17 00:26:47
【问题描述】:

我有一个现有的 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 ';'

【问题讨论】:

  • 你为什么要使用lint,你什么时候不愿意改变代码?它不是编译器,而是分析器。
  • SW 项目由第 3 方代码(我不想更改)和自己的书面代码组成。如果可能的话,我只想让我自己编写的代码出现 lint 错误。

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


【解决方案1】:

摘自PC-lint FAQ

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

    Lint 使用“库”标头的标签来指定这些标头 程序员无法控制的(例如编译器头文件)。默认 所有来自外部目录或包含在 中的 #include 都是 被认为是“图书馆”。这可以通过使用+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 结构成员访问技术。

    【讨论】:

      【解决方案3】:

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

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

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

      虽然我不愿指向我自己的网站,但如果您愿意,请查看我的 PDF "How to wield PC Lint",您会发现从零到使用 PC Lint 正确 linting 您的代码的简单步骤,以及所有选项设置。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        相关资源
        最近更新 更多