求助,gcc报警告“always_inline function might not be inlinable”
用gcc编译一个Cortex-M3芯片的程序,,结果报警告如下:
cmsis/inc/cmsis_gcc.h:58:57: warning: always_inline function might not be inlinable [-Wattributes]
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
cmsis_gcc.h是ARM官方的CMSIS中的头文件,,其中__enable_irq定义如下:
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
{
__ASM volatile ("cpsie i" : : : "memory");
}
感觉__enable_irq内容很简单,,编译成内联函数应该完全没问题啊,,不知道为什么会报这个警告
cmsis_gcc.h中几十个内联函数全部都报这个警告,,工程里大多数文件都会间接包含这个文件,,所以一编译全是这个警告信息,,很崩溃{:mad:}
不是写着always嘛,应该是不管怎样,只要有inline都会报 你看下__STATIC_INLINE定义是否正确,__attribute__( ( always_inline ) )必须和inline一起用 Zphoenix 发表于 2019-1-14 09:29
你看下__STATIC_INLINE定义是否正确,__attribute__( ( always_inline ) )必须和inline一起用 ...
不是这个问题,,我把__STATIC_INLINE替换成static inline后没解决,,报错如下:
../../lib/cmsis/inc/cmsis_gcc.h:58:55: warning: always_inline function might not be inlinable [-Wattributes]
__attribute__( ( always_inline ) ) static inline void __enable_irq(void)
^
aammoo 发表于 2019-1-14 08:42
不是写着always嘛,应该是不管怎样,只要有inline都会报
意思是,,只要在代码中使用了__attribute__( ( always_inline ) ),,GCC编译就会报这个警告
那岂不是只要用GCC编译Cortex-M内核单片机的程序就会报这个警告了??毕竟任何Cortex-M单片机都会使用CMSIS中的头文件啊,,, 问题解决了
cmsis_gcc.h 中__enable_irq()的定义如下:
__attribute__( ( always_inline ) ) static inline void __enable_irq(void)
{
__ASM volatile ("cpsie i" : : : "memory");
}
我用 gcc -E 生成了.c 文件的预处理文件,,在预处理文件中__enalbe_irq()的定义变成了
# 58 "../../lib/cmsis/inc/cmsis_gcc.h"
# 58 "../../lib/cmsis/inc/cmsis_gcc.h"
__attribute__( ( always_inline ) ) static void __enable_irq(void)
{
__asm volatile ("cpsie i" : : : "memory");
}
原来的“ static inline ”变成了“ static ”,,inline 没了,,
我就想可能代码某处把 inline 给宏定义了,,所以搜索了下,,果然,在 portmacro.h 中有一行:
#define inline
把这行注释掉问题就解决了
这个文件是厂家的 SDK 里面的,,不知道为什么要这么定义,, 谢谢经验分享,我参考这个,也解决了{:lol:}
页:
[1]