關於51微控制器C程式設計 return語句的使用ZZ
阿新 • • 發佈:2019-01-30
關於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方式改為方式二,則可以保留引數、區域性變數,返回正確的值,保證程式邏輯正確。
案例:
函式寫法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方式改為方式二,則可以保留引數、區域性變數,返回正確的值,保證程式邏輯正確。