1. 程式人生 > >關於51微控制器C程式設計 return語句的使用ZZ

關於51微控制器C程式設計 return語句的使用ZZ

關於51微控制器C程式設計 return語句的使用
案例:


函式寫法1:


    u8 is_timeout(tick start_time, tick interval)


{
    return (get_diff_tick(get_tick(), start_time) > interval);


}


函式寫法2:
    u8 is_timeout(tick start_time, tick interval)


{


   u8 status;






   status = get_diff_tick(get_tick(), start_time) > interval);


   return status;


}


函式呼叫方式:


     if (is_timeout(start_time, 1000))


{


      do_something();


}






問題:在有中斷應用的平臺上,使用函式寫法1可能會造成if語句判斷不正確。明明不到1000ms時間,卻進入了do_something()。






分析:在51平臺,預設情況下函式的呼叫、中斷的切換,並不會將被打斷函式的引數、區域性變數壓入棧,而是儲存在固定儲存區中。如果在執行return之前恰好需要去執行中斷,則51的引數和區域性變數值是可以被儲存在固定儲存區的,而中間資料(如return方式1中,需要返回的值)是不能被儲存的,當中斷返回後,無法正確獲得先前的中間資料,而直接將不定資料返回,造成程式邏輯出錯。而我們將return方式改為方式二,則可以保留引數、區域性變數,返回正確的值,保證程式邏輯正確。