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

时间:2017-12-02 11:26:51

标签: 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;
}

此处计数器是一个全局变量。

当我调用My_Func()时,它会在执行函数之前推送R4,R5,R6。反汇编看起来像这样,

0x080004BC B470      PUSH     {r4-r6}

然后功能执行开始。但由于函数内部存在无限循环,寄存器永远不会弹出。

有没有办法在执行函数之前阻止KEIL IDE推送寄存器,而不修改函数定义?

1 个答案:

答案 0 :(得分:5)

您可以在函数声明中使用__attribute__((noreturn))来通知编译器该函数不会返回。根据{{​​3}},此属性被描述为:

  

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

     

用法   使用此属性可以降低调用永不返回的函数的成本,例如exit()。   最佳做法是始终使用while(1);.

终止非返回函数

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