搜索
bottom↓
回复: 6
打印 上一主题 下一主题

求助,gcc报警告“always_inline function might not be inlinable”

[复制链接]

出0入25汤圆

跳转到指定楼层
1
发表于 2019-1-13 23:44:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

用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中几十个内联函数全部都报这个警告,,工程里大多数文件都会间接包含这个文件,,所以一编译全是这个警告信息,,很崩溃

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入90汤圆

2
发表于 2019-1-14 08:42:29 来自手机 | 只看该作者
不是写着always嘛,应该是不管怎样,只要有inline都会报

出0入0汤圆

3
发表于 2019-1-14 09:29:40 | 只看该作者
你看下__STATIC_INLINE定义是否正确,__attribute__( ( always_inline ) )必须和inline一起用

出0入25汤圆

4
 楼主| 发表于 2019-1-14 09:44:12 | 只看该作者
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)
                                                       ^

出0入25汤圆

5
 楼主| 发表于 2019-1-14 09:52:45 | 只看该作者
aammoo 发表于 2019-1-14 08:42
不是写着always嘛,应该是不管怎样,只要有inline都会报


意思是,,只要在代码中使用了__attribute__( ( always_inline ) ),,GCC编译就会报这个警告

那岂不是只要用GCC编译Cortex-M内核单片机的程序就会报这个警告了??毕竟任何Cortex-M单片机都会使用CMSIS中的头文件啊,,,

出0入25汤圆

6
 楼主| 发表于 2019-1-14 13:08:58 | 只看该作者
问题解决了

cmsis_gcc.h 中__enable_irq()的定义如下:
  1. __attribute__( ( always_inline ) ) static inline void __enable_irq(void)
  2. {
  3.         __ASM volatile ("cpsie i" : : : "memory");
  4. }
复制代码


我用 gcc -E 生成了.c 文件的预处理文件,,在预处理文件中__enalbe_irq()的定义变成了
# 58 "../../lib/cmsis/inc/cmsis_gcc.h"
  1. # 58 "../../lib/cmsis/inc/cmsis_gcc.h"
  2. __attribute__( ( always_inline ) ) static void __enable_irq(void)
  3. {
  4.         __asm volatile ("cpsie i" : : : "memory");
  5. }
复制代码


原来的“ static inline ”变成了“ static ”,,inline 没了,,

我就想可能代码某处把 inline 给宏定义了,,所以搜索了下,,果然,在 portmacro.h 中有一行:
#define inline

把这行注释掉问题就解决了

这个文件是厂家的 SDK 里面的,,不知道为什么要这么定义,,

出90入0汤圆

7
发表于 2019-4-5 18:26:50 | 只看该作者
谢谢经验分享,我参考这个,也解决了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表