在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的开发板。
恳请请各位达人解答,先谢了! |