我有一个现有的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 ';'
答案 0 :(得分:5)
摘自PC-lint FAQ:
- 醇>
如何告诉lint不要抱怨我的编译器标题?
Lint使用“library”标题的标签来指定那些标题 程序员无法控制的程序(如编译器头)。默认情况下 所有#includes来自外部目录,或包含在&lt; &gt; ,是 被认为是“图书馆”。这可以通过使用
+libclass
进行修改 选项,并使用+/-libdir
和+/-libh
选项进一步微调 然后,您可以使用-wlib
,-elib
和-elibsym
选项来控制这些选项 从库头发出的消息。编译器选项文件已分发 PC-lint通常包含-wlib(1)
选项,用于限制lint输出 库标题仅限于错误(禁止显示警告和信息性消息)。
我猜,这应该符合您的需求。如果没有,那么重现你的警告的最小例子会很好;上面的内容让我感到厌烦,因为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的选项。