C Keil中定义的_wfi()等特定于皮质的函数在哪里?

C Keil中定义的_wfi()等特定于皮质的函数在哪里?,c,keil,function-prototypes,misra,C,Keil,Function Prototypes,Misra,我正在使用uVision Keil 4.71.0.0 IDE编写Cortex-M0控制器的工业代码。我们的代码应该遵守MISRA规则,并定期与QA-C进行检查 我的问题是一些特定于控制器的函数,如\uuuwfi(),\uuuu current\u sp()等,似乎没有在任何地方定义,QA-C对此表示不满: 340: __wfi(); ^ Msg(5:3335) No function declaration. Impli

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

我的问题是一些特定于控制器的函数,如
\uuuwfi()
\uuuu current\u sp()
等,似乎没有在任何地方定义,QA-C对此表示不满:

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

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

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

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

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

  • 所有代码必须遵循ISO C
  • 所有函数都必须有原型
  • 汇编语言的所有使用都必须封装和记录
我要做的是将所有这些“函数调用”移动到一个单独的文件和文档中,该文件包含程序中内联程序集的所有调用。您可能需要这样一个文件来说明有关内联汇编的其他MISRA规则。声明这些函数用于封装汇编程序。然后将其从静态代码分析中排除,除非静态分析器支持给定的汇编程序和/或“ARM intrinsic”


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

如编译器所述。我想你的资料里没有。 也许你会在Keil或ARM编译器指南中找到一些帮助你的东西(我还没有安装Keil,自己看看)

可以使用一个特殊的编译器命令(IAR编译器有类似这样的命令)来定义此函数

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

这是什么


显然,它们不需要声明,因为我们的代码可以编译并正常工作。我所寻找的是一种方式,以符合MISRA规则的方式呈现它们。例如,使用
sqrt()
函数代替
\uu sqrt()
内在函数可以解决我的问题。其他内部函数是否存在类似的包装函数?我不这样认为,不。数学函数的情况很特殊,因为例如
sqrt()
是标准库的一部分,标准库实现者(=Keil,在您的例子中)当然可以选择在实现中使用其编译器的内部函数。对于“关闭中断”没有类似的情况,标准库不支持这样做。好的,谢谢你澄清了问题的技术方面。我接受了@Lundin的回答,因为这个问题更多地与MISRA一致性有关。将这些函数移到单独的文件中不是一个选项,因为这需要修改许多文件,然后对修改后的文件进行代码审查。如果有一个可靠来源的链接,说明此类功能可能会偏离MISRA-C,那将是很有帮助的。也许我会查阅Keil文档。@DmitryGrigoryev可信来源:MISRA-C:2004规则2.1或MISRA-C:2012指令4.3。不用说,您可能无法对该文件运行静态分析,因为它不是用C编写的。也许可以说这些“内部函数”就是封装。无论如何,您需要记录他们的工作。使用单独文件的好处是,源代码注释可以作为您的文档。@DmitryGrigoryev更大的问题是编译器对这些名称使用双下划线,这在C.7.1.3中被明确禁止:
所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。
。如果编译器使用双下划线命名,那么它就不符合C标准。我认为每个编译器都使用双下划线命名(例如GCC
\uuuu builtin\uxxx()
),所以我不认为有问题。C标准正是出于这个原因保留了它们,这样编译器就可以自由地定义它们,而不用担心破坏别人的C代码。@DmitryGrigoryev Nope。“保留供任何使用”是指除C标准本身外,任何人不得使用此类标识符。这与“为实现保留”不同,后者意味着编译器可以使用它,但程序员不能使用。GCC不遵循标准也不能成为另一个编译器不符合标准的借口。
Source Browser: '__wfi' - undefined Definition/Reference!