停止Keil uvision在函数调用上推送寄存器

Muz*_*ain 3 c assembly keil

当我从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在执行函数之前推送寄存器,而不修改函数定义?

Mic*_*tch 5

您可以使用__attribute__((noreturn))函数声明来通知编译器函数不会返回.根据Arm Keil文档,此属性描述为:

9.41 __attribute __((noreturn)) function属性通知编译器函数不返回.然后,编译器可以通过删除从未到达的代码来执行优化.

用法 使用此属性可以降低调用永不返回的函数的开销,例如exit().最佳实践是始终使用while(1);终止非返回函数.

这应该防止编译器生成推送寄存器R4到R6的函数序言代码.