在忽略系統(tǒng)的前提下,如何使自己寫到代碼更美觀,運行效率更高。是一個初級開發(fā)人員的追求。 追求代碼美觀和代碼可讀性,我們要學(xué)會善于用結(jié)構(gòu)體和指針,結(jié)構(gòu)體能有效的幫助我們表達(dá)復(fù)雜的變量關(guān)系和復(fù)雜的變量定義,當(dāng)你習(xí)慣用time1、time2、time3……定義變量名的時候,推薦你可以思考一下用結(jié)構(gòu)體,是否滿足你的需求。 本次話題主要講的是提高代碼的執(zhí)行效率,那么如何才能使代碼執(zhí)行效率更高了,最簡單粗暴的方式就是減少延時函數(shù)的調(diào)用。減少函數(shù)調(diào)用后,相對程序執(zhí)行效率就會高一些。 那么還有其它更好的方式嗎?當(dāng)然有了,比如有段代碼需0.1s執(zhí)行一次,我們就讓0.1秒執(zhí)行一次,如果代碼需要0.5秒執(zhí)行一次就讓他0.5秒執(zhí)行一次,這樣單片機就能更好的執(zhí)行其它代碼了,如果代碼按照你設(shè)想時間運行,并且你們沒有使用延時函數(shù)。你的代碼執(zhí)行效率會提升很多。
話不多說直接上思路和代碼。首先跟著我來了解一個結(jié)構(gòu)體。 typedef struct { unsigned short int time; // 定義一個時間變量,它用來判斷何時進(jìn)入函數(shù),目的是減少代延時函數(shù)調(diào)用(8位單片機只能,定義8位數(shù)據(jù),16或32數(shù)據(jù)會因中斷打擾導(dǎo)致數(shù)據(jù)賦值出錯。) unsigned char label; // label用來記代碼執(zhí)行到那個階段了, unsigned char value ; // 用來記錄,你想要的值,或者其它什么概念的東西。當(dāng)然你可以刪除 } AP_APP;
定義一個指示燈結(jié)構(gòu)體變量, AP_APP AP_LED ; 我想他看上去很簡單對吧。 在while(1)循環(huán)體中定義指示燈函數(shù) VoidFun_Led(void) { if(AP_LED.time==0 ) { AP_LED.time = 250 ; // AP_LED.time標(biāo)記什么時間進(jìn)入當(dāng)函數(shù),類似延時函數(shù),中斷中需要對--AP_LED.time處理。 IO_LED = ~ LO_LED;//這個只是端口取反后再次輸出。 } } 這就是一個指示燈函數(shù),看上去是不是比較簡單。 我們再來假設(shè)一個中斷,是每2ms進(jìn)入一次,中斷里面我們這樣寫 Void 中斷服務(wù)函數(shù)(void) //每2ms進(jìn)入一次 { if(AP_LED.time != 0xFFFF ) // AP_LED.time 不等0xFFFF。我們進(jìn)入函數(shù) { //等于0xFFFF 你可以設(shè)想先一下出現(xiàn)什么情況。 if(AP_LED.time) --AP_LED.time; // 我們每過2ms,減去一個值,一直到變量 //等于0。等于0后再進(jìn)入Fun_Led內(nèi)部函數(shù)執(zhí)相關(guān)代碼 } } 當(dāng)前的程序沒有使用延時函數(shù),能很好的控制LED的亮滅時間,提高我們代碼執(zhí)行效率。看上去也比較簡單。 我們很明確的知道程序不使用延時函數(shù),我們的其他代碼執(zhí)行效率就會提高,
我起初定義了一個結(jié)構(gòu)體,其中有個AP_LED. label,AP_LED. label我在這里表示程序運行到哪里了,或者簡單說狀態(tài)機。 還是led控制,例如我想控制LED亮?xí)r間和滅的時間不同,我們可以調(diào)整程序如下 VoidFun_Led(void) { if(AP_LED.time==0 ) { switch (AP_LED. Label) { Case 1 : AP_LED.Label =2; IO_LED = 1; AP_LED.time = 50 ; // 進(jìn)入下一次LED狀態(tài)的間隔時間 break; case 2 : AP_LED.Label =3; IO_LED = 0; AP_LED.time = 100 ; //進(jìn)入下一次LED狀態(tài)的間隔時間 break; Case 3: AP_LED.Label =4; IO_LED = 1; AP_LED.time = 150 ; // 進(jìn)入下一次LED狀態(tài)的間隔時間 break; case 4: AP_LED.Label =1; IO_LED = 0; AP_LED.time = 200 ; //進(jìn)入下一次LED狀態(tài)的間隔時間 break; default: //剛開機或者其它情況進(jìn)入當(dāng)前信息 AP_LED.Label =1; AP_LED.time = 250 ; // AP_LED.time標(biāo)記什么時間進(jìn)入當(dāng)函數(shù)。 break; } } } 當(dāng)我們遇到一個復(fù)雜的代碼,并且每個動作執(zhí)行時間不定長度的時候,當(dāng)前的結(jié)構(gòu)形式更為簡單一些,更方便我們理解。 關(guān)于AP_LED. Value我也很少用,但是不表示我不用,當(dāng)上一個代碼中在嵌套一個switch (AP_LED. Value),或者在其它函數(shù)中獲取,讀取或者標(biāo)記一些狀態(tài),傳遞一些消息都會用上。這個我就不多說了,你喜歡就看看移植一下,理解了就是最適合你的。
如果有人喜歡 我下次講解我的按鍵代碼
|