STM32 HAL C标准

问题描述 投票:3回答:3

我有点困惑...

我有一个使用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'
c gcc stm32 c89 hal
3个回答
5
投票

error: unknown type name 'inline'指出了随C99添加的功能。

我怀疑问题是他们的文档说“ANSI-C”。 “ANSI-C”是一个垃圾术语,确实大部分时间都是指C89。从1990年开始,ANSI再与C标准无关,所以那些在1990年之后继续谈论“ANSI-C”的人只会感到困惑,请参阅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
投票

引用Wikipedia

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

所以似乎“ANSI C”没有明确定义,也没有说明使用了哪个特定版本的C标准。

因为它显然使用inline,它必须至少是C99,所以试试吧。这个对我有用 ...


0
投票

为了进一步澄清,有问题的文件,主要是像core_cm.h(取决于你使用的MCU),有条件代码。在你的特殊情况下,它会像。一样令人窒息

静态内联......

和STATIC,INLINE有条件地定义为不同的东西,具体取决于您使用的编译器。 GCC将为条件代码提供正确的定义(GNUC),但如上所述,您需要为内联关键字指定C99。

仅供参考,//评论也是C99,而不是C89 / C90。

© www.soinside.com 2019 - 2024. All rights reserved.