STM32 HAL C标准

时间:2017-12-14 13:29:07

标签: c gcc stm32 c89 hal

我有点困惑......

我有一个使用STM32 HAL库的嵌入式项目,后者又使用stm32f072rb CMSIS头文件。

HAL声称here 严格ANSI-C

The source code of drivers is developed in Strict ANSI-C, which makes it
independent from the development tools. It is checked with CodeSonarTM static
analysis tool. It is fully documented and is MISRA-C 2004 compliant.

我相信Strict ANSI-C意味着C89所以我将这些gcc标志添加到我的Makefile中。

CFLAGS =            -std=c89\
                    -pedantic-errors

但是当我这样做时会发出很多错误和警告。如果我删除这些标志,它就会编译。

我对此非常困惑。我缺少什么或者他们的文档是错的吗?

以下是一些启用了标志的gcc编译器错误...它们不断重复多个STM32 HAL文件。

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
error: unknown type name 'inline'
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NVIC_GetPriority'

3 个答案:

答案 0 :(得分:5)

error: unknown type name 'inline'指向使用C99添加的功能。

我怀疑问题在于他们的文档是" ANSI-C"。 " ANSI-C"这是一个垃圾术语,确实大部分时间都是指C89。自1990年以来,ANSI不再与C标准无关,所以那些一直在谈论" ANSI-C"在1990年之后简直困惑,请参阅What is the difference between C, C99, ANSI C and GNU C?

您的编译器选项对于严格的C89 / C90代码是正确的。尝试使用-std=c99 -pedantic-errors进行编译。

然而,MISRA-C:2004明确不允许C99功能,所以这很可疑。包含inline的代码绝对不符合MISRA-C:2004标准。对于C99支持,需要MISRA-C:2012。

答案 1 :(得分:1)

引用Wikipedia

  

ANSI C,ISO C和标准C是指美国国家标准协会(ANSI)和国际标准化组织(ISO)发布的C编程语言的连续标准。

所以似乎“ANSI C”没有明确定义,并没有说正在使用特定版本的C标准。

由于它明显使用inline,因此必须至少为C99,所以试试吧。它对我有用......

答案 2 :(得分:0)

为进一步澄清,所讨论的文件(大部分类似于core_cm.h之类的文件(取决于您所使用的MCU))具有条件代码。在您的特定情况下,它令人窒息

静态内联...

根据您使用的编译器,有条件地将

和STATIC以及INLINE定义为不同的事物。 GCC将为条件代码提供正确的定义( GNUC ),但是如上所述,您需要为inline关键字指定C99。

仅供参考,//注释也是C99,而不是C89 / C90。