在 XC16 编译器的手册中,它说如下:
如果内联函数被声明为静态并且函数定义在函数的所有使用之前,编译器只会消除内联函数。
在 foo.c 的顶部我声明
static inline void nop_10_times(void);
然后在 ISR 的定义中定义为:
void _CNInterrupt(void)
{
nop_10_times();
// rest of function
}
然后,作为测试,我将定义放在nop_10_times
文件的底部。
static inline void nop_10_times(void)
{
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
__builtin_nop();
}
当我编译我的项目并查看程序集时,似乎编译器实际上能够完全删除程序集中的函数,并且只将内联代码留在 ISR 中调用它的位置。
有谁知道它是如何做到这一点的?根据手册中的定义,它表示如果“函数定义在函数的所有使用之前”,它将消除内联函数。