为什么这些嵌入式c代码的安排如此不同?

hfi*_*ter 3 c embedded interrupt

背景

我正在使用基于8052的微控制器.我有一个LCD和编码器轮连接起来.用户可以通过旋转和按压编码器轮来浏览LCD上显示的菜单.

编码器轮的旋转是基于中断的.

编码器轮的旋转方向(encoder_turn)设置在编码器中断内.

update_lcd()在一个循环里面打电话.

新的响应代码

void update_lcd()                           
{

        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                break;
        }
 }

void next_screen()
{
    if(current_test_screen < screen5)
    {
        current_test_screen++;
    }

    draw_current_test_screen(); 
}

void draw_current_test_screen()
{
    switch(current_test_screen)
    {
        case screen1:
            draw_screen1();
            break;
        case screen2:
            draw_screen2();
            break;
        case screen3:
            draw_screen3();
            break;
        case screen4:
            draw_screen4();
            break;
        case screen5:
            draw_screen5();
            break;      
        default:
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

旧的反应迟钝的代码

void update_lcd()                           
{

        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                break;
        }

        switch(current_test_screen)
        {
            case screen1:
                draw_screen1();
                break;
            case screen2:
                draw_screen2();
                break;
            case screen3:
                draw_screen3();
                break;
            case screen4:
                draw_screen4();
                break;
            case screen5:
               draw_screen5();
               break;       
            default:
               break;
       }


 }

void next_screen()
{
    if(current_test_screen < screen5)
    {
        current_test_screen++;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

为什么一个响应而另一个完全没用?

当我说响应时,我指的是当我旋转编码器时,屏幕变化是响应的.这两种方法都"有效",但从使用的角度来看,这是不可接受的.

Mar*_*ers 9

除了一个非常微妙的区别之外,这两段代码几乎是等价的.

如果您尝试重构旧代码以使其看起来更像您的新代码,您会发现旧代码会进行一次额外的函数调用.仔细看看差异:

void update_lcd()                           
{
        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                draw_current_test_screen();   // <--- your new code omits this call
                break;
        }
 }
Run Code Online (Sandbox Code Playgroud)

尝试使用新代码并添加该行,看看是否会导致无响应问题.