如何使用汇编语言内联函数解决MISRA C错误?

如何使用汇编语言内联函数解决MISRA C错误?,c,embedded,misra,C,Embedded,Misra,我在PIC32 MCU C代码中使用了与编译器相关的汇编语言函数asm()。我的代码经过编译,只需在我的C代码中使用asm(“重置”)函数即可正常工作。在检查MISRA合规性时,我发现以下MISRA错误: 函数“asm”未声明,假设返回int[MISRA 2012规则17.3,强制性]asm(“重置”) 如何解决此汇编语言函数的此MISRA错误?我还尝试创建函数宏来使用它,但仍然得到一个错误 函数“asm”未声明,假定返回int[MISRA 2012规则17.3,强制性]asm_重置(无效) P

我在PIC32 MCU C代码中使用了与编译器相关的汇编语言函数asm()。我的代码经过编译,只需在我的C代码中使用asm(“重置”)函数即可正常工作。在检查MISRA合规性时,我发现以下MISRA错误:

函数“asm”未声明,假设返回int[MISRA 2012规则17.3,强制性]asm(“重置”)

如何解决此汇编语言函数的此MISRA错误?我还尝试创建函数宏来使用它,但仍然得到一个错误

函数“asm”未声明,假定返回int[MISRA 2012规则17.3,强制性]asm_重置(无效)


PC Lint似乎没有将
asm
识别为关键字。它将其视为一个没有原型的函数。 您可以尝试将
+rw(asm)
添加到选项中

另一方面,建议合法的方法是在仅包含程序集的独立文件中定义
reset
函数,并向C文件显示其原型

c.重置:

void reset(void) {
   asm("reset");
}
测试c:

#include "reset.h"

...
reset();

asm
是编译器扩展关键字,而不是函数。由于特定于编译器,它不会被静态分析工具自动识别,并且编译器的内联汇编语法是“类似函数的”,因此它应用函数原型规则

您需要使用描述编译器的实现定义行为的配置文件或命令行选项正确配置PC Lint。这可能包括很多选项,但在这种情况下,您应该使用:

-dasm()=  
这将导致分析器忽略具有语法
asm(…)

或者,您可以通过有条件地定义隐藏所有此类指令的宏,在静态分析期间忽略内联汇编程序语法:

#if defined _lint
    #define asm( asmstr )
#endif
但是,这将隐藏与检查器的其他偏差,例如有关内嵌组件的封装和隔离的规则。因此,不应使用与C代码行混合的宏或内联程序集,而应定义包装函数:

void reset(void) 
{
   asm("reset");
}

然后将上面定义的
reset()
函数放在一个单独的翻译单元中,只需从分析中忽略该源代码,就好像它是库代码一样。

定义ASM\u reset(void)很奇怪,它是一个函数宏,只有一个参数,应该被移动到头文件中。我只需要重置选项,所以我硬编码到定义的宏中@Kmil您正在使用哪个检查工具?PC Lint utility@AShellyeI尝试过我在其中定义了新的asssm.h文件#define ASM()ASM(“reset”),并将该文件包含在使用此宏的test.c文件中,但仍然存在相同的错误@KamilI不认为将指令移动到其他文件会使其无法识别。它在你移动之前编译过吗?(假设忽略misra错误)通过这种方式解决misra错误,但不编译代码。它生成编译器错误:无法识别的操作码“reset”@AshellyYes如果我在代码中直接使用asm(“reset”),它将编译。@ashelly如果同一命令在一个文件中有效,但在另一个文件中无效,我怀疑你的makefile或build设置。这是正确的方法。将所有汇编代码移到单独的文件中,以便对其进行封装。它可以通过包装函数或宏来完成。不应检查这个单独的文件是否符合MISRA-C,因为它应该只包含内联汇编程序。很明显,这不符合MISRA规则,即所有代码都应该符合ISO C,因此您需要对此进行永久性的偏离。如果我以这种方式编写,即编译器和MISRA都没有显示任何代码,那么它是否有效error@Clifford@raj123我没有当前MISRA C标准的副本,而且我不知道你的工具在任何情况下应用的版本和覆盖范围,所以我不能告诉你。
#if defined _lint
    #define asm( asmstr )
#endif
void reset(void) 
{
   asm("reset");
}