当我从main()调用包含无限循环的C函数时,它会在执行该函数之前在堆栈上推送一些寄存器。由于函数包含无限循环,因此永远不会弹出这些寄存器。
这是一个例子,
void My_Func (void)
{
int flag_1 = 1;
while(1)
{
if(counter > 5 && flag_1)
{
flag_1 = 0;
}
else if(counter > 550 && flag_1)
{
flag_1 = 0;
}
}
}
int main(void)
{
My_Func();
return 0;
}
此处计数器是一个全局变量。
当我调用My_Func()时,它会在执行函数之前推送R4,R5,R6。反汇编看起来像这样,
0x080004BC B470 PUSH {r4-r6}
然后功能执行开始。但由于函数内部存在无限循环,寄存器永远不会弹出。
有没有办法在执行函数之前阻止KEIL IDE推送寄存器,而不修改函数定义?
答案 0 :(得分:5)
您可以在函数声明中使用__attribute__((noreturn))
来通知编译器该函数不会返回。根据{{3}},此属性被描述为:
9.41 __ attribute __((noreturn))函数属性 通知编译器函数不返回。然后,编译器可以通过删除从未到过的代码来执行优化。
用法 使用此属性可以降低调用永不返回的函数的成本,例如exit()。 最佳做法是始终使用while(1);.
终止非返回函数
这应该可以防止编译器生成将寄存器R4推送到R6的函数序言代码。