在嵌入式C通用延時驅(qū)動編程中,免不了要用到軟件延時。這一般通過循環(huán)語句實(shí)現(xiàn)。通過控制循環(huán)語句的循環(huán)次數(shù),便可獲得多種不同的延時時間。為了便于使用和提高程序代碼的復(fù)用率,一般又將循環(huán)語句封裝成一個帶參數(shù)的函數(shù),稱為延時函數(shù)。如:
void wait(unsigned int n)
{
unsigned int i;
for(i=0;i
}
延時函數(shù)的參數(shù)(形參,如上例中的變量 n ),即為控制循環(huán)語句循環(huán)次數(shù)的變量。這樣,在需要軟件延時的時候,只需要調(diào)用延時函數(shù),并將實(shí)際參數(shù)(實(shí)參,即n的實(shí)際值)代入形參,便可獲得與該實(shí)際參數(shù)對應(yīng)的延時時間。
這便是經(jīng)典的軟件延時的實(shí)現(xiàn)方法,非常簡單。
但細(xì)心的讀者會發(fā)現(xiàn):延時函數(shù)的參數(shù)(比如上面的 n ),表征的是循環(huán)語句的“循環(huán)次數(shù)”,而不是“實(shí)際的延時時間”。一般來說,假令循環(huán)語句每循環(huán)一次的時間為 b(注意,單位是“步”,即一個時鐘周期,下同),函數(shù)調(diào)用、傳值和返回所需的固有時間為 a ,那么,給定參數(shù) n 時,調(diào)用一次延時函數(shù)實(shí)際實(shí)現(xiàn)的延時時間應(yīng)為 t = a + b*n , ——而不是 n !
這就意味著,當(dāng)需要的延時時間為 t 時,應(yīng)當(dāng)傳入的實(shí)參為 n = (t-a)/b,而不是 t 。這樣,為了獲得比較準(zhǔn)確的延時,每次調(diào)用函數(shù)之前,都要手工計算實(shí)際參數(shù),很不方便;其次,當(dāng)需要改變晶振頻率的時候,程序中所有的延時參數(shù)都要重新計算,這顯然不利于程序的移植。
為了解決這兩個問題,提高嵌入式C通用延時驅(qū)動程序的可移植性,可以利用宏定義的方式,對延時函數(shù)進(jìn)行參數(shù)預(yù)修正。例如,對上面給出的wait延時函數(shù),可以使用下面的宏定義:
#define delay(n) wait( ( (n) - a ) / b )
這樣,調(diào)用 delay(t) 就意味著調(diào)用 wait( (t-a)/b ) ,從而得到時間為t的延時,實(shí)現(xiàn)了參數(shù)與延時時間的同步,使用起來更加方便。
為了進(jìn)一步提高可移植性,使軟件延時能夠適應(yīng)不同的晶振頻率,應(yīng)當(dāng)順著上面的思路選擇尋找更優(yōu)方案。那么,應(yīng)當(dāng)怎樣做呢?其實(shí)方法很簡單。假設(shè)調(diào)用某個延時函數(shù) wait_step(n) 可以獲得 n 步的延時,又設(shè)工作頻率為 f1,即每步的運(yùn)行時間為 T=1/f1,則實(shí)際獲得的延時時間為 t= n*T=n/f1。當(dāng)工作頻率變?yōu)?f2=C*f1 時,程序運(yùn)行速度快了C倍,為了仍然獲得時間為t的延時,程序運(yùn)行的步數(shù)應(yīng)當(dāng)是原來的C倍,即要調(diào)用wait_step(n*C)。這樣,我們就可以定義下面的宏,來完成(n*C)的運(yùn)算:
#define C 4
#define delay_t(n) wait_step( n*C )
第一行一般寫在文件開頭,當(dāng)修改晶振頻率時,只需修改這一處就行了,不必在程序中對各個 wait_step(n)的參數(shù)一一修改,大為方便。
按照上面介紹的方法,可以編寫出準(zhǔn)確、易用、通用的延時驅(qū)動。
下面給出一個完整的延時驅(qū)動程序。這是筆者早期編寫的版本,最近重新整理過。編繹器是ICC AVR V7.13A,運(yùn)行環(huán)境是AVR系列的所有芯片。使用的語句有三個:
微秒級延時:delay_us(n); 延時n微秒
毫秒級延時:delay_ms(n); 延時n毫秒
秒級延時: delay_s(n); 延時n秒 (最大65秒)
以上就是嵌入式C通用延時驅(qū)動的編寫方法了,希望能對編程人員有一定的幫助,如有更多技術(shù)問題,可以電話聯(lián)系我們,直接獲取幫助,期待您的來電!
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5091文章
19176瀏覽量
307169 -
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93927 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62905
發(fā)布評論請先 登錄
相關(guān)推薦
評論