2012-05-02 24 views
3

背景爲什麼嵌入式c代碼的這些安排表現如此不同?

我正在和基於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; 
    } 
} 

老不響應代碼

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++; 
    } 
} 

問題

爲什麼是一個敏感和其他完全沒用?

當我說響應我指的事實,當我旋轉編碼器畫面切換響應。兩種方法都「有效」,但從使用角度來看,這是不可接受的。

+1

請顯示'encoder_turn'的定義。另外,這是從哪裏來的? –

+2

向我們展示您的主循環。 –

+0

@EdS。 (true){update_lcd();}因爲基本上它是 – hfitzwater

回答

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; 
     } 
} 

嘗試採取新代碼並添加該行,看看它是否會導致無響應問題。

+0

哇......沒錯。我認爲這會比這更重要。 – hfitzwater

+0

當編碼器未轉動時,它正在抽出該函數調用 – hfitzwater

0

只是一個猜測,但我懷疑:既然你改變的唯一事情是函數嵌套,encoder_turn可能正在通過優化緩存。您需要將encoder_turn標記爲易失性,因爲中斷可能會發生並隨時更改其值。

+0

hmm ... encoder_turn已經被標記爲volatile – hfitzwater

相關問題