打印
[STM32F4]

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

[复制链接]
3053|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里面编译,你真是个甜菜。

使用特权

评论回复
5
搞IT的| | 2015-2-28 19:11 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

86

帖子

1

粉丝