標(biāo)題: 忽略系統(tǒng)的前提下,單片機(jī)新手如何提高程序的執(zhí)行效率 [打印本頁(yè)]
作者: yuyechenai 時(shí)間: 2022-8-5 09:11
標(biāo)題: 忽略系統(tǒng)的前提下,單片機(jī)新手如何提高程序的執(zhí)行效率
在忽略系統(tǒng)的前提下,如何使自己寫(xiě)到代碼更美觀,運(yùn)行效率更高。是一個(gè)初級(jí)開(kāi)發(fā)人員的追求。
追求代碼美觀和代碼可讀性,我們要學(xué)會(huì)善于用結(jié)構(gòu)體和指針,結(jié)構(gòu)體能有效的幫助我們表達(dá)復(fù)雜的變量關(guān)系和復(fù)雜的變量定義,當(dāng)你習(xí)慣用time1、time2、time3……定義變量名的時(shí)候,推薦你可以思考一下用結(jié)構(gòu)體,是否滿(mǎn)足你的需求。
本次話(huà)題主要講的是提高代碼的執(zhí)行效率,那么如何才能使代碼執(zhí)行效率更高了,最簡(jiǎn)單粗暴的方式就是減少延時(shí)函數(shù)的調(diào)用。減少函數(shù)調(diào)用后,相對(duì)程序執(zhí)行效率就會(huì)高一些。
那么還有其它更好的方式嗎?當(dāng)然有了,比如有段代碼需0.1s執(zhí)行一次,我們就讓0.1秒執(zhí)行一次,如果代碼需要0.5秒執(zhí)行一次就讓他0.5秒執(zhí)行一次,這樣單片機(jī)就能更好的執(zhí)行其它代碼了,如果代碼按照你設(shè)想時(shí)間運(yùn)行,并且你們沒(méi)有使用延時(shí)函數(shù)。你的代碼執(zhí)行效率會(huì)提升很多。
話(huà)不多說(shuō)直接上思路和代碼。首先跟著我來(lái)了解一個(gè)結(jié)構(gòu)體。
typedef struct
{
unsigned short int time; // 定義一個(gè)時(shí)間變量,它用來(lái)判斷何時(shí)進(jìn)入函數(shù),目的是減少代延時(shí)函數(shù)調(diào)用(8位單片機(jī)只能,定義8位數(shù)據(jù),16或32數(shù)據(jù)會(huì)因中斷打擾導(dǎo)致數(shù)據(jù)賦值出錯(cuò)。)
unsigned char label; // label用來(lái)記代碼執(zhí)行到那個(gè)階段了,
unsigned char value ; // 用來(lái)記錄,你想要的值,或者其它什么概念的東西。當(dāng)然你可以刪除
} AP_APP;
定義一個(gè)指示燈結(jié)構(gòu)體變量,
AP_APP AP_LED ; 我想他看上去很簡(jiǎn)單對(duì)吧。
在while(1)循環(huán)體中定義指示燈函數(shù)
VoidFun_Led(void)
{
if(AP_LED.time==0 )
{
AP_LED.time = 250 ; // AP_LED.time標(biāo)記什么時(shí)間進(jìn)入當(dāng)函數(shù),類(lèi)似延時(shí)函數(shù),中斷中需要對(duì)--AP_LED.time處理。
IO_LED = ~ LO_LED;//這個(gè)只是端口取反后再次輸出。
}
}
這就是一個(gè)指示燈函數(shù),看上去是不是比較簡(jiǎn)單。
我們?cè)賮?lái)假設(shè)一個(gè)中斷,是每2ms進(jìn)入一次,中斷里面我們這樣寫(xiě)
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; // 我們每過(guò)2ms,減去一個(gè)值,一直到變量
//等于0。等于0后再進(jìn)入Fun_Led內(nèi)部函數(shù)執(zhí)相關(guān)代碼
}
}
當(dāng)前的程序沒(méi)有使用延時(shí)函數(shù),能很好的控制LED的亮滅時(shí)間,提高我們代碼執(zhí)行效率?瓷先ヒ脖容^簡(jiǎn)單。
我們很明確的知道程序不使用延時(shí)函數(shù),我們的其他代碼執(zhí)行效率就會(huì)提高,
我起初定義了一個(gè)結(jié)構(gòu)體,其中有個(gè)AP_LED. label,AP_LED. label我在這里表示程序運(yùn)行到哪里了,或者簡(jiǎn)單說(shuō)狀態(tài)機(jī)。
還是led控制,例如我想控制LED亮?xí)r間和滅的時(shí)間不同,我們可以調(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)的間隔時(shí)間
break;
case 2 :
AP_LED.Label =3;
IO_LED = 0;
AP_LED.time = 100 ; //進(jìn)入下一次LED狀態(tài)的間隔時(shí)間
break;
Case 3:
AP_LED.Label =4;
IO_LED = 1;
AP_LED.time = 150 ; // 進(jìn)入下一次LED狀態(tài)的間隔時(shí)間
break;
case 4:
AP_LED.Label =1;
IO_LED = 0;
AP_LED.time = 200 ; //進(jìn)入下一次LED狀態(tài)的間隔時(shí)間
break;
default: //剛開(kāi)機(jī)或者其它情況進(jìn)入當(dāng)前信息
AP_LED.Label =1;
AP_LED.time = 250 ; // AP_LED.time標(biāo)記什么時(shí)間進(jìn)入當(dāng)函數(shù)。
break;
}
}
}
當(dāng)我們遇到一個(gè)復(fù)雜的代碼,并且每個(gè)動(dòng)作執(zhí)行時(shí)間不定長(zhǎng)度的時(shí)候,當(dāng)前的結(jié)構(gòu)形式更為簡(jiǎn)單一些,更方便我們理解。
關(guān)于AP_LED. Value我也很少用,但是不表示我不用,當(dāng)上一個(gè)代碼中在嵌套一個(gè)switch (AP_LED. Value),或者在其它函數(shù)中獲取,讀取或者標(biāo)記一些狀態(tài),傳遞一些消息都會(huì)用上。這個(gè)我就不多說(shuō)了,你喜歡就看看移植一下,理解了就是最適合你的。
如果有人喜歡 我下次講解我的按鍵代碼
作者: Hephaestus 時(shí)間: 2022-8-5 22:27
switch/case那部分寫(xiě)的太啰嗦了,簡(jiǎn)單的查表就行。樓主的水平還達(dá)不到傳道受業(yè)解惑的程度。
作者: 名字不是重點(diǎn) 時(shí)間: 2022-8-6 17:41
switch (AP_LED. Label)這段這么有規(guī)律,可以?xún)?yōu)化掉!
作者: 名字不是重點(diǎn) 時(shí)間: 2022-8-6 17:43
續(xù)上貼:
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 時(shí)間: 2022-8-7 14:55
我一直不明白,為什么很多人都要提高單片機(jī)的運(yùn)行效率?有什么意義呢?
這總得看場(chǎng)合的吧,如果一個(gè)程序要做的東西并不多,提高效率的意義何在?
這一堆代碼,讓我感覺(jué)原本應(yīng)該可以很簡(jiǎn)單的東西,看起來(lái)好恐怖
作者: yzwzfyz 時(shí)間: 2022-8-7 22:35
學(xué)會(huì)匯編語(yǔ)言,就知道如何做效率高了。
作者: TTQ001 時(shí)間: 2022-8-7 23:59
對(duì)于一個(gè)單片機(jī)程序員的初學(xué)者來(lái)說(shuō),最重要的是讓每一行代碼都正確,因?yàn)閷?duì)于一個(gè)沒(méi)有經(jīng)驗(yàn)的程序員來(lái)說(shuō),調(diào)試代碼是一個(gè)挑戰(zhàn)。
作者: yuyechenai 時(shí)間: 2022-8-8 08:28
怎么說(shuō)了,你們都是對(duì)的,只是當(dāng)前你們沒(méi)有遇到,對(duì)應(yīng)代碼需求, 理解就行
作者: coody_sz 時(shí)間: 2022-8-8 17:43
程序架構(gòu)要合理,程序中不要用軟件延時(shí)。
作者: 青草麥田 時(shí)間: 2022-8-13 11:32
用定時(shí)器代替延時(shí)就能提升效率了
作者: 天ノ憶 時(shí)間: 2022-8-17 10:34
需要提高執(zhí)行效率,只有在比較精細(xì)的項(xiàng)目中才會(huì)考慮,有可能讓新手接手這種項(xiàng)目的公司,我覺(jué)得項(xiàng)目經(jīng)理心可能很大
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |