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