STM32 HAL C标准

3

我有些困惑...

我正在进行一个嵌入式项目,使用了STM32 HAL库,该库使用stm32f072rb CMSIS头文件。

HAL声称在此处严格符合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.

我认为严格的 ANSI-C 指的是 C89,因此我在我的 Makefile 中添加了这些 gcc 标志。
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'

你可能需要包含生成编译器错误的代码,否则就无法回答这个问题。 - Lundin
这是一个空白项目,只包含STM32 HAL和CMSIS的空main()函数。我没有任何编写的代码。问题可能出在HAL或我的理解上。第一个出现错误的文件是cmsis_gcc.h,它只是由STM32提供的头文件,有1374行代码... :( - Tedi
3个回答

5

error: unknown type name 'inline' 是指添加于C99标准的一项功能。

我怀疑问题出在他们的文档上写着“ANSI-C”。 “ANSI-C”是一个垃圾术语,大多数情况下确实是指C89。自1990年以来,ANSI已经与C标准毫无关系,所以在1990年之后仍然谈论“ANSI-C”的人就是困惑了,请参见有关C、C99、ANSI C和GNU C之间的区别

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

但是, MISRA-C:2004明确不允许C99功能,因此这很可疑。包含inline的代码肯定不符合MISRA-C:2004标准。需要使用MISRA-C:2012才能支持C99。


是的,使用c99完全没有问题。为了使HAL编译,必须在Makefile中包含CMSIS。我有一种感觉,ST声称他们的HAL库是c89,但CMSIS是c99。我有一种感觉这是营销策略。如果HAL依赖于不符合ANSI C标准的代码,我的意思是c89,那么HAL就不应该被声称为ANSI C。 - Tedi
@Tedi 我相信CMSIS不是由ST编写的,而是由ARM编写的,但我也不确定它是否符合ISO C和MISRA-C标准。 - Lundin
ARM提供了一个模板,而合作伙伴ST则创建特定的CMSIS头文件。我正在调查这个问题。 - Tedi
CMSIS声称符合ANSI C 兼容性,但符合Misra 2012标准。而且,编译器不喜欢的第一个文件是由ARM编写的...其他一些文件是由ST编写的。非常感谢你们所有人的帮助。我将降低我的标准并用C99编程。 - Tedi
CMSIS中可疑的部分在版本5文档中通过这句话得到了解释。 “符合MISRA 2012标准(但不声称符合MISRA标准)。MISRA规则违反将被记录。” - Tedi

1
为了进一步澄清,所涉及的文件,大多类似于core_cm.h(取决于您使用的MCU),具有有条件的代码。在您特定的情况下,它卡在类似于“STATIC INLINE ...”的东西上,并且STATIC和INLINE根据您使用的编译器有不同的条件定义。 GCC将为有条件代码提供正确的定义(GNUC),但如前所述,您需要指定C99用于inline关键字。
FYI,//注释也是C99,而不是C89 / C90。

1

引用自维基百科

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

因此,“ANSI C”并没有明确定义,没有说明使用的是哪个特定版本的C标准。

由于它显然使用了inline,所以至少是C99,请尝试一下。对我有效...


谢谢您。我选择了 @Lundin 的答案,但是您的答案也很好。我还给了您一个赞。在C99中它可以工作。 - Tedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接