当我从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;
}
Run Code Online (Sandbox Code Playgroud)
这里的计数器是一个全局变量.
当我调用My_Func()时,它会在执行函数之前推送R4,R5,R6.反汇编看起来像这样,
0x080004BC B470 PUSH {r4-r6}
Run Code Online (Sandbox Code Playgroud)
然后功能执行开始.但由于函数内部存在无限循环,寄存器永远不会弹出.
有没有办法阻止KEIL IDE在执行函数之前推送寄存器,而不修改函数定义?
您可以使用__attribute__((noreturn))函数声明来通知编译器函数不会返回.根据Arm Keil文档,此属性描述为:
9.41 __attribute __((noreturn)) function属性通知编译器函数不返回.然后,编译器可以通过删除从未到达的代码来执行优化.
用法 使用此属性可以降低调用永不返回的函数的开销,例如exit().最佳实践是始终使用while(1);终止非返回函数.
这应该防止编译器生成推送寄存器R4到R6的函数序言代码.