我正在使用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例外将需要一个我想避免的正式审查过程。
答案 0 :(得分:2)
这些被称为compiler intrinsics,我不确定是否需要声明它们。它们基本上是编译器提供的语言的扩展。
答案 1 :(得分:2)
我不相信那些是常规函数,而是生成二进制文件的非标准内置函数被汇编代码替换。 Word 2013
这里要考虑3条MISRA规则,它们不一定要相互协调:
我要做的是移动所有这些&#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