c - STM32 HAL C标准

标签 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'

最佳答案

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。

关于c - STM32 HAL C标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47814533/

相关文章:

c - 在 write api () 中传递结构变量名称

gcc - 将 RVCT 库与 GCC 链接

C 编程 : Try to compile main class on terminal but it return me ./mainT

arm - 基于 ARM Cortex M3 的 MCU 的示例代码?

ssl - 如何在 tls 中使用 STM32 lwip/mqtt api?

microcontroller - 使用STM F401RE Nucleo计算温度传感器的正确公式?

c - 这个 for 循环中发生了什么

c - 在微芯片的 c++/c 中解析 nmea csv

可以使用 C 中的宏从各种结构构建预编译时间的任意字节数组吗?

c++ - 关于 linux 中的动态缩放,程序在时钟周期中的意外执行时间