[STM32F4] 关于内联内嵌汇编 __attribute__( ( always_inline ) ) __STATIC_INLINE v...

[复制链接]
3454|4
 楼主| fancy_xp 发表于 2015-2-19 22:53 | 显示全部楼层 |阅读模式
在MDK编译环境里遇到一些让我疑惑的问题,我想用更加简洁语句来开关中断,于是定义了下面语句:

#define cpu_int_dis() __asm { CPSID I}
//#define cpu_int_en() __asm { CPSIE I}
使用时,开了优化后,发现 CPSID 指令安放的位置被优化得乱七八糟。
再搜索了自带的内核头文件后发现这个内联函数可以用:
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)

{
  __ASM volatile ("cpsie i" : : : "memory");
}
在我的应用程序里调用__enable_irq();后,运行很好,与优化无关,不会变化位置。
于是我依样画葫芦:
__attribute__( ( always_inline ) ) static inline void __enable_irq1()  {__asm  volatile ("cpsie i");}
编译后发现还是位置被优化得乱七八糟,这是为什么?两者有什么区别吗? 这是第一个问题。

我继续试验,我把库文件的这个函数名修改为__enable_irq1,仅仅加了1个“1”,然后编译,发现编译不通过,我有弄不懂了,为什么?这是第2个问题
编译出现的错误提示:warning:  #223-D: function "__enable_irq1" declared implicitly
Error: L6218E: Undefined symbol __enable_irq1 (referred from u_mem.o).
Not enough information to list image symbols.

另外,__enable_irq(void) 是在core_cmFunc.h文件中定义的,我用的是STM32F407的开发板。
恳请请各位达人解答,先谢了!
ghost2 发表于 2015-2-21 12:18 来自手机 | 显示全部楼层
函数名未声明
 楼主| fancy_xp 发表于 2015-2-22 10:43 | 显示全部楼层
这个是放在头文件里的, 程序是包含了头文件core_cmFunc.h的,还要如何声明呢?
李富贵 发表于 2015-2-23 18:05 | 显示全部楼层
gcc的语法你放到mdk里面编译,你真是个甜菜。
搞IT的 发表于 2015-2-28 19:11 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

86

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部