找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2224|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

忽略系統(tǒng)的前提下,單片機新手如何提高程序的執(zhí)行效率

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:136119 發(fā)表于 2022-8-5 09:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在忽略系統(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),傳遞一些消息都會用上。這個我就不多說了,你喜歡就看看移植一下,理解了就是最適合你的。

如果有人喜歡 我下次講解我的按鍵代碼

http://www.torrancerestoration.com/bbs/dpj-215832-1.html  5樓,這也是一個不錯的代碼,最起碼我是這樣理解的。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2022-8-5 22:27 | 只看該作者
switch/case那部分寫的太啰嗦了,簡單的查表就行。樓主的水平還達(dá)不到傳道受業(yè)解惑的程度。
回復(fù)

使用道具 舉報

板凳
ID:824490 發(fā)表于 2022-8-6 17:41 | 只看該作者
switch (AP_LED. Label)這段這么有規(guī)律,可以優(yōu)化掉!
回復(fù)

使用道具 舉報

地板
ID:824490 發(fā)表于 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;
回復(fù)

使用道具 舉報

5#
ID:401564 發(fā)表于 2022-8-7 14:55 | 只看該作者
我一直不明白,為什么很多人都要提高單片機的運行效率?有什么意義呢?
這總得看場合的吧,如果一個程序要做的東西并不多,提高效率的意義何在?
這一堆代碼,讓我感覺原本應(yīng)該可以很簡單的東西,看起來好恐怖
回復(fù)

使用道具 舉報

6#
ID:123289 發(fā)表于 2022-8-7 22:35 | 只看該作者
學(xué)會匯編語言,就知道如何做效率高了。
回復(fù)

使用道具 舉報

7#
ID:420836 發(fā)表于 2022-8-7 23:59 | 只看該作者
對于一個單片機程序員的初學(xué)者來說,最重要的是讓每一行代碼都正確,因為對于一個沒有經(jīng)驗的程序員來說,調(diào)試代碼是一個挑戰(zhàn)。
回復(fù)

使用道具 舉報

8#
ID:136119 發(fā)表于 2022-8-8 08:28 | 只看該作者
怎么說了,你們都是對的,只是當(dāng)前你們沒有遇到,對應(yīng)代碼需求, 理解就行
回復(fù)

使用道具 舉報

9#
ID:1034262 發(fā)表于 2022-8-8 17:43 | 只看該作者
程序架構(gòu)要合理,程序中不要用軟件延時。
回復(fù)

使用道具 舉報

10#
ID:811253 發(fā)表于 2022-8-13 11:32 | 只看該作者
用定時器代替延時就能提升效率了
回復(fù)

使用道具 舉報

11#
ID:139866 發(fā)表于 2022-8-17 10:34 | 只看該作者
需要提高執(zhí)行效率,只有在比較精細(xì)的項目中才會考慮,有可能讓新手接手這種項目的公司,我覺得項目經(jīng)理心可能很大
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表