我在PIC32 MCU C代码中使用与编译器相关的汇编语言函数asm()。只要在C代码中使用asm("reset")函数,我的代码就可以编译并正常工作。当检查MISRA合规性时,我得到以下MISRA错误:
函数'asm'未声明,假定返回int〔MISRA 2012规则17.3,强制〕asm("重置");
asm("reset");
如何解决此汇编语言函数的此MISRA错误?我也尝试创建函数宏来使用它,但仍然出现错误。
函数'asm'未声明,假定返回int〔MISRA 2012规则17.3,强制〕asm_RESET(无效);
#define ASM_RESET(void) asm("reset")
ASM_RESET(void);
看起来PC Lint没有将asm
识别为关键字。它将其视为一个没有原型的函数。您可以尝试将+rw(asm)
添加到选项中。
另一方面,这篇论坛文章建议,合法的方法是在只包括汇编的独立文件中定义reset
函数,并向C文件展示它的原型
重置.c:
void reset(void) {
asm("reset");
}
test.c:
#include "reset.h"
...
reset();
asm
是关键字的编译器扩展,而不是函数。由于编译器特定,它不会被静态分析工具自动识别,而且编译器的内联汇编语法是"类函数"的,因此它应用了函数原型规则。
您需要使用描述编译器实现定义行为的配置文件或命令行选项正确配置PC Lint。这可能包括很多选项,但在这种情况下,您应该使用:
-dasm()=
这将导致分析器忽略具有类似语法asm(...)
的函数的内联汇编代码
或者,您可以在静态分析期间忽略内联汇编程序语法,方法是有条件地定义一个隐藏所有此类指令的宏:
#if defined _lint
#define asm( asmstr )
#endif
然而,这将隐藏检查器的其他偏差,例如关于内嵌部件的封装和隔离的规则。因此,您不应该使用与C代码行混合的宏或内联程序集,而应该定义一个包装函数:
void reset(void)
{
asm("reset");
}
将上面定义的reset()
函数放在一个单独的翻译单元中,并简单地从分析中省略该源代码,就好像它是库代码一样。