Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
STM32 HAL C标准_C_Gcc_Stm32_C89_Hal - Fatal编程技术网

STM32 HAL C标准

STM32 HAL C标准,c,gcc,stm32,c89,hal,C,Gcc,Stm32,C89,Hal,我有点困惑 我有一个嵌入式项目,它使用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 full

我有点困惑

我有一个嵌入式项目,它使用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,所以我将这些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'
引述:

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

所以“ANSIC”似乎并没有很好的定义,也并没有说使用的是哪一个特定版本的C标准


因为它显然使用了
内联
,所以它必须至少是C99,所以请尝试一下。它对我有效…

错误:未知类型名称“inline”
指向与C99一起添加的功能

我怀疑问题在于他们的文档上写着“ANSI-C”。“ANSI-C”是一个垃圾术语,大多数时候确实指的是C89。自1990年以来,ANSI不再与C标准有任何关系,因此那些在1990年后一直谈论“ANSI-C”的人只是感到困惑,请参见

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


然而,MISRA-C:2004明确不允许C99特性,因此这是可疑的。包含内联的代码绝对不符合MISRA-C:2004。对于C99支持,需要MISRA-C:2012。

为了进一步澄清,所讨论的文件,主要类似于core_cm.h(取决于您使用的MCU),具有有条件的代码。在你的特殊情况下,它会被类似于

静态内联

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


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

您可能希望包含生成编译器错误的代码,否则无法回答此问题。它是一个带有空main()函数的空白项目,只包含STM32 HAL和CMSIS。我没有写任何代码。问题不是在HAL中,就是在我的理解中。第一个有错误的文件是cmsis_gcc.h,它只是STM32提供的头文件,是1374行代码…:(是的,c99可以正常工作。为了让HAL编译CMSIS,必须将其包含在Makefile中。我感觉ST声称他们的HAL库是c89,但CMSIS是c99。我感觉这是一个营销技巧。如果HAL依赖的代码不是ANSI C,我的意思是c89,那么HAL不应该被称为ANSI C。@Tedi相信CMSIS不是由ST编写的,而是由ARM编写的吗?我也不确定它是否符合ISO C和MISRA-C。ARM提供了一个模板,合作伙伴,即ST创建特定的CMSIS头文件。我正在调查这个。CMSIS声称是ANSI C,但符合MISRA 2012。而且编译器不喜欢的第一个文件也是由ARM编写的……有些人ST的其他文件。非常感谢您的帮助。我将降低C99中的标准和程序。关于CMSIS的可疑部分由版本5文档中的这句话解释。
符合MISRA 2012(但不要求符合MISRA).MISRA违反规则的行为已记录在案
谢谢。我选择了@Lundin的答案,但你的答案也很好。不过我给了你一个肯定的箭头。使用C99它可以工作。