程序優(yōu)化佳文.docx

程序優(yōu)化佳文.docx

ID:59142096

大?。?1.79 KB

頁數(shù):14頁

時(shí)間:2020-09-11

程序優(yōu)化佳文.docx_第1頁
程序優(yōu)化佳文.docx_第2頁
程序優(yōu)化佳文.docx_第3頁
程序優(yōu)化佳文.docx_第4頁
程序優(yōu)化佳文.docx_第5頁
資源描述:

《程序優(yōu)化佳文.docx》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、程序優(yōu)化?由于單片機(jī)的性能同電腦的性能是天淵之別的,無論從空間資源上、內(nèi)存資源、工作頻率,都是無法?與之比較的。PC機(jī)編程基本上不用考慮空間的占用、內(nèi)存的占用的問題,最終目的就是實(shí)現(xiàn)功能就可以了。?對(duì)于單片機(jī)來說就截然不同了,一般的單片機(jī)的Flash和Ram的資源是以KB來衡量的,可想而知,單片?機(jī)的資源是少得可憐,為此我們必須想法設(shè)法榨盡其所有資源,將它的性能發(fā)揮到最佳,程序設(shè)計(jì)時(shí)必須?遵循以下幾點(diǎn)進(jìn)行優(yōu)化:?1.使用盡量小的數(shù)據(jù)類型?能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變?

2、量就不要用長(zhǎng)整型(longint),能不使用浮點(diǎn)型(float)變量就不要使用浮點(diǎn)型變量。當(dāng)然,在定義變?量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C編譯器并不報(bào)錯(cuò),但程序運(yùn)行結(jié)果卻錯(cuò)了,?而且這樣的錯(cuò)誤很難發(fā)現(xiàn)。?2.使用自加、自減指令?通常使用自加、自減指令和復(fù)合賦值表達(dá)式(如a-=1及a+=1等)都能夠生成高質(zhì)量的?程序代碼,編譯器通常都能夠生成inc和dec之類的指令,而使用a=a+1或a=a-1之類?的指令,有很多C編譯器都會(huì)生成二到三個(gè)字節(jié)的指令。?3.減少運(yùn)算的強(qiáng)度?可以使用運(yùn)算量小但功能相同的表達(dá)式替換原來復(fù)雜

3、的的表達(dá)式。?(1)求余運(yùn)算?N=N%8可以改為N=N&7?說明:位操作只需一個(gè)指令周期即可完成,而大部分的C編譯器的“%”運(yùn)算均是調(diào)用子程序來完成,代碼長(zhǎng)、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來代替。?(2)平方運(yùn)算?N=Pow(3,2)可以改為N=3*3?說明:在有內(nèi)置硬件乘法器的單片機(jī)中(如51系列),乘法運(yùn)算比求平方運(yùn)算快得多,因?yàn)楦↑c(diǎn)數(shù)?的求平方是通過調(diào)用子程序來實(shí)現(xiàn)的,乘法運(yùn)算的子程序比平方運(yùn)算的子程序代碼短,執(zhí)行速度快。?(3)用位移代替乘法除法?N=M*8可以改為N=M<<3?N=M/8可以改為

4、N=M>>3?說明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移?的代碼,而乘以其它的整數(shù)或除以任何數(shù),均調(diào)用乘除法子程序。用移位的方法得到代碼比調(diào)用乘除法子?程序生成的代碼效率高。實(shí)際上,只要是乘以或除以一個(gè)整數(shù),均可以用移位的方法得到結(jié)果。如N=M*9?可以改為N=(M<<3)+M;?(4)自加自減的區(qū)別?例如我們平時(shí)使用的延時(shí)函數(shù)都是通過采用自加的方式來實(shí)現(xiàn)。?voidDelayNms(UINT16t)?{?UINT16i,j;?for(i=0;i

5、++)?}?可以改為?voidDelayNms(UINT16t)?{?UINT16i,j;?for(i=t;i>=0;i--)?for(j=1000;i>=0;j--)?}?說明:兩個(gè)函數(shù)的延時(shí)效果相似,但幾乎所有的C編譯對(duì)后一種函數(shù)生成的代碼均比前一種代碼少1~3?個(gè)字節(jié),因?yàn)閹缀跛械腗CU均有為0轉(zhuǎn)移的指令,采用后一種方式能夠生成這類指令。?4.while與do...while的區(qū)別?voidDelayNus(UINT16t)?{?while(t--)?{?NOP();?}?}?可以改為?voidDelayNus(UINT16t)

6、?{?do?{?NOP();?}while(--t)?}?說明:使用do…while循環(huán)編譯后生成的代碼的長(zhǎng)度短于while循環(huán)。?5.register關(guān)鍵字?voidUARTPrintfString(INT8*str)?{?while(*str&&str)?{?UARTSendByte(*str++)?}?}?可以改為?voidUARTPrintfString(INT8*str)?{?registerINT8*pstr=str;?while(*pstr&&pstr)?{?UARTSendByte(*pstr++)?}?}?說明:在聲明

7、局部變量的時(shí)候可以使用register關(guān)鍵字。這就使得編譯器把變量放入一個(gè)多用途的寄存?器中,而不是在堆棧中,合理使用這種方法可以提高執(zhí)行速度。函數(shù)調(diào)用越是頻繁,越是可能提高代碼的?速度,注意register關(guān)鍵字只是建議編譯器而已。?6.volatile關(guān)鍵字?volatile總是與優(yōu)化有關(guān),編譯器有一種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、在?哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化,進(jìn)一步可以死代碼消除。一般來?說,volatile關(guān)鍵字只用在以下三種情況:?a)中斷服務(wù)函數(shù)中修改的供其它程序檢測(cè)的

8、變量需要加volatileb)多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile?c)存儲(chǔ)器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌?duì)它的讀寫都可能由不同意義總之,volatile關(guān)鍵字是

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。