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

时间:2019-01-14 22:52:25

标签: c embedded misra

我在PIC32 MCU C代码中使用了与编译器相关的汇编语言函数asm()。仅在我的C代码中使用asm(“ reset”)函数就可以编译我的代码,并且可以正常工作。检查MISRA合规性时,出现以下MISRA错误:

  

未声明函数'asm',假定返回int [MISRA 2012 Rule 17.3,强制性] asm(“ reset”);

asm("reset");

如何解决此汇编语言功能的MISRA错误?我还尝试创建函数宏以使用它,但仍然出现错误。

  

未声明函数“ asm”,假定返回int [MISRA 2012 Rule 17.3,强制性] ASM_RESET(void);

#define ASM_RESET(void) asm("reset")
ASM_RESET(void);

2 个答案:

答案 0 :(得分:1)

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

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

reset.c:

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

test.c:

#include "reset.h"

...
reset();

答案 1 :(得分:0)

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

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

-dasm()=  

这将导致分析器忽略具有类似函数语法asm(...)的内联汇编代码

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

#if defined _lint
    #define asm( asmstr )
#endif

但是,这将隐藏检查器的其他偏差,例如有关封装和在线装配隔离的规则。因此,您不应将宏或内联汇编与C代码行混合使用,而应定义包装函数:

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

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