標題: 忽略系統的前提下,單片機新手如何提高程序的執行效率 [打印本頁]
作者: yuyechenai 時間: 2022-8-5 09:11
標題: 忽略系統的前提下,單片機新手如何提高程序的執行效率
在忽略系統的前提下,如何使自己寫到代碼更美觀,運行效率更高。是一個初級開發人員的追求。
追求代碼美觀和代碼可讀性,我們要學會善于用結構體和指針,結構體能有效的幫助我們表達復雜的變量關系和復雜的變量定義,當你習慣用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),或者在其它函數中獲取,讀取或者標記一些狀態,傳遞一些消息都會用上。這個我就不多說了,你喜歡就看看移植一下,理解了就是最適合你的。
如果有人喜歡 我下次講解我的按鍵代碼
作者: Hephaestus 時間: 2022-8-5 22:27
switch/case那部分寫的太啰嗦了,簡單的查表就行。樓主的水平還達不到傳道受業解惑的程度。
作者: 名字不是重點 時間: 2022-8-6 17:41
switch (AP_LED. Label)這段這么有規律,可以優化掉!
作者: 名字不是重點 時間: 2022-8-6 17:43
續上貼:
IO_LED = AP_LED.Label % 2;
AP_LED.time = AP_LED.Label *50;
AP_LED.Label ++;
AP_LED.Label = AP_LED.Label % 5;
作者: Y_G_G 時間: 2022-8-7 14:55
我一直不明白,為什么很多人都要提高單片機的運行效率?有什么意義呢?
這總得看場合的吧,如果一個程序要做的東西并不多,提高效率的意義何在?
這一堆代碼,讓我感覺原本應該可以很簡單的東西,看起來好恐怖
作者: yzwzfyz 時間: 2022-8-7 22:35
學會匯編語言,就知道如何做效率高了。
作者: TTQ001 時間: 2022-8-7 23:59
對于一個單片機程序員的初學者來說,最重要的是讓每一行代碼都正確,因為對于一個沒有經驗的程序員來說,調試代碼是一個挑戰。
作者: yuyechenai 時間: 2022-8-8 08:28
怎么說了,你們都是對的,只是當前你們沒有遇到,對應代碼需求, 理解就行
作者: coody_sz 時間: 2022-8-8 17:43
程序架構要合理,程序中不要用軟件延時。
作者: 青草麥田 時間: 2022-8-13 11:32
用定時器代替延時就能提升效率了
作者: 天ノ憶 時間: 2022-8-17 10:34
需要提高執行效率,只有在比較精細的項目中才會考慮,有可能讓新手接手這種項目的公司,我覺得項目經理心可能很大
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |