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

时间:2015-05-22 07:46:29

标签: c keil function-prototypes misra

我正在使用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中的函数名称并选择&#34;转到定义&#34;确认函数未定义:

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

Keil是否提供了具有此类功能原型的官方头文件?在我们的项目代码中硬编码这样的原型或创建QA-C例外将需要一个我想避免的正式审查过程。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

  • 所有代码必须遵循ISO C。
  • 所有功能必须有原型。
  • 必须对汇编语言的所有使用进行封装和记录。

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

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

答案 2 :(得分:0)

正如所写的那样,它来自编译器。我不认为你有他们的来源。 也许您在Keil或ARM编译器指南中找到了一些内容,它可以帮助您(我已经没有安装KEI,可以自己查看)。

可以使用特殊的编译器命令来获取此函数的定义(IAR编译器具有类似的内容)。

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

Founbd this

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