3

我正在使用 uVision Keil 4.71.0.0 IDE 为 Cortex-M0 控制器编写工业代码。我们的代码应该遵守 MISRA 规则,并定期通过 QA-C 进行检查。

我的问题是,某些特定于控制器的功能,如等__wfi()__current_sp()似乎没有在任何地方定义,并且 QA-C 抱怨它们:

340:                __wfi();
                       ^
Msg(5:3335) No function declaration.
Implicit declaration inserted: 'extern int __wfi();'.
CC Coding Rule 6 <next>

在Keil中右击函数名,选择“Go to definition”确认该函数没有定义:

Source Browser: '__wfi' - undefined Definition/Reference!

Keil 是否提供带有此类函数原型的官方头文件?在我们的项目代码中对此类原型进行硬编码或创建 QA-C 异常将需要一个我希望避免的正式审查过程。

4

3 回答 3

2

这些被称为编译器内在函数,我不确定是否需要声明它们。它们基本上是对编译器提供的语言的扩展。

于 2015-05-22T08:25:41.587 回答
2

我不相信这些是常规函数,而是生成的二进制文件中的非标准内置函数被汇编代码替换。看到这个。

这里需要考虑 3 条 MISRA 规则,它们不一定相互协调:

  • 所有代码必须遵循 ISO C。
  • 所有函数都必须有原型。
  • 所有对汇编语言的使用都必须封装并记录在案。

我要做的是将所有这些“函数调用”移动到一个单独的文件中,并记录该文件包含程序中所有内联汇编的调用。您可能需要这样的文件来满足有关内联汇编的其他 MISRA 规则。声明这些函数用于封装汇编程序。然后将其从您的静态代码分析中排除,除非静态分析器支持给定的汇编程序和/或“ARM 内在函数”。

如果您这样做,我认为您将 100% 符合 MISRA,而无需提出偏差。只需声明 ARM 内部函数是您封装内联汇编的方式。

于 2015-05-22T08:26:07.887 回答
0

如前所述,它来自编译器。我认为您的源代码中没有它们。也许你找到了 Keil 或 ARM 编译器指南中写的东西,这对你有帮助(我已经没有安装 KEIl,我自己看看)。

可以使用特殊的编译器命令来定义此函数(IAR 编译器有类似的东西)。

如果这一切都不起作用,您可以在 QA-C(不知道)中创建一个例外以忽略此函数,因为它来自编译器或为 QA-C 指定一个虚拟函数。

找到这个

http://www.keil.com/support/man/docs/armccref/armccref_CJADIFCI.htm

于 2015-05-22T09:05:16.177 回答