Keil 中定义的 __wfi() 等特定于 Cortex 的函数在哪里?

Where are Cortex-specific functions like __wfi() defined in Keil?

我正在使用 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 异常将需要正式的审查过程,我希望避免这种情况。

这些称为 compiler intrinsics,我不确定是否需要声明它们。它们基本上是编译器提供的语言的扩展。

我不认为这些是常规函数,而是生成的二进制文件中的非标准内置函数被汇编代码替换了。 See this.

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

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

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

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

如前所述,它来自编译器。我不认为你有它们的来源。 也许你在 Keil 或 ARM Compiler Guideline 中找到了一些对你有帮助的东西(我还没有安装 KEIl,自己看看)。

也许可以使用特殊的编译器命令(IAR 编译器有类似的命令)获得此函数的定义。

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

找到这个

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