999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C高效程序設計的技巧

2009-04-29 00:00:00柴守立,高
電腦知識與技術 2009年32期

摘要:該文從基于8051核的MCU結構特征出發,結合C語言自身特點,給出若干高效C程序設計的技巧。實踐證明,在C程序設計中依據8051的功能特性對源代碼進行優化,能大幅度提高最終程序的執行效率。

關鍵詞:MCU;結構特征;程序設計;技巧

中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2009)32-8943-03

Efficient C Language Programming Skills

CHAI Shou-li1, GAO Liang2

(1.Shandong Yingcai University of Computer Science, Ji'nan 250104, China; 2.Anhui University of Computer Science, Hefei 230039, China)

Abstract: This paper from the 8051 core MCU based on structural features, combined features of C language itself is given a number of highly efficient C programming skills. Practice has proved that, in the C program design features based on 8051 to optimize the source code, can greatly improve the efficiency of the final implementation of the procedures.

Key words: MCU; structural features; programming; skills

C語言憑借自身的結構化設計思想和對底層的數據的強大處理能力逐漸成為嵌入式開發的主流語言。雖然目前大部分C集成開發工具都具有優化能力,而且優化的結果有時比使用匯編語言編寫的程序效果還好,然而,這些優化工作大部分是針對程序和算法本身的優化,而針對MCU體系結構的進行的優化很少或者幾乎沒有,本文就是針對這個問題,給出幾種解決方法。

1 巧妙地利用寄存器變量

使用寄存器變量可以提升程序運行的速度,節約程序運行的時間,因為CPU對寄存器的尋址時間是最短的,可以在一個機器周期內完成。

假設有語句for(i=0;i<10;i++);對變量i的位置的不同申明將會得到不同的結果。

在keil c中作如下定義

unsigned char i;編譯產生的匯編語言如下:

CLR A

MOV R7,A

LOOP:INC R7

CJNER7,#0x0A,LOOP

unsigned char idata i;編譯產生的匯編語言如下:

CLR A

MOVR0,#0x08

MOV @R0,A

LOOP:MOV RO,#0x08

INC @R0

MOVA,@RO

CJNEA,#0x0A,LOOP

unsigned char xdata i;編譯產生的匯編語言如下:

CLRA

MOVDPTR,#0x0000

MOVX@DPTR,A

LOOP:MOV DPTR,#0x0000

MOVXA,@DPTR

INC A

MOVX@DPTR,A

MOVXA,@DPTR

CJNEA,#0x0A,LOOP

通用寄存器可用于傳送和暫存數據,也可參與算術邏輯運算,并保存運算結果。通過上述分析,可以看見,當編譯器將變量i作為寄存器(R7)變量處理的時候,產生的目標代碼最小,且可以在一個機器周期內尋址。程序員必須熟悉每個寄存器的一般用途和特殊用途,只有這樣,才能在程序中做到正確、合理地使用它們。

但是,由于基于8051核的MCU資源有限,寄存器顯得極其寶貴,所以,寄存器變量通常被定義為局部頻繁使用的操作,如上例,在一個子函數中操作完了即可被銷毀,或者系統頻繁使用的全局變量,對其他情況要盡量避免使用。讀者在使用的時候可以仔細查閱編譯器說明手冊。

2 利用移位實現快速乘除操作

大部分MCU都選配一個輔助處理器,該處理器主要完成對數據進行邏輯與、或、非、循環、移位等基本操作,人們將之稱為布爾處理功能。巧妙的利用移位寄存器可以實現快速的乘除運算。設有如下代碼:

unsigned char mul,div,x,y;//申明變量

mul = x*3;//x乘以3賦值給mul

div = y/3;//y除以3賦值給div

匯編產生的目標代碼為:

MOV A,0x0A

MOVB,#0x03

MULAB

MOV0x80,A

MOVA,0x0B

MOVB,#0x03

DIV AB

MOV0x09,A

如果將上述程序語句改成等價效果的語句:

mul = x<<1;//x乘以2賦值給mul

div = y>>1;//y除以2賦值給div

MOVA,0x0A

ADDA,ACC

MOV0x08,A

MOVA,0x0B

CLRC

RRCA

MOV0x09,A

可以看出,使用移位操作產生的目標代碼明顯優于使用乘除產生的目標代碼,而且MUL和DIV指令的周期比ADD指令周期長。

如果將上述方法變通一下,對于日常生活中的十進制計算方法遷移到二進制計算方法,利用計算百分比的閥值,利用假設需要計算統計的結果百分比大于80%,可以計算出新的統計閥值為80×128/100≈102。這樣就可以用移位元算代替乘除運算。

3 巧妙利用51核的位尋址功能

嵌入式系統是嵌入在一個大系統中執行著特殊任務的專用計算機系統,所以大部分MCU都具有特殊的指令處理能力,8051CPU可以對部分特殊功能寄存器和字節地址20H~2FH進行位尋址。

如有下述代碼,程序中需要經常對變量x的最低位和次低位的值進行01判斷,可以寫代碼如下:

unsignedchar bdata x,y;

y = x 0x01;//獲知最低位情況

x = x>>1;

y = x 0x01;//獲知次低位情況

匯編產生的結果如下:

MOV A,0x20

JZJ1

MOVR7,#0x01

SJMPJ2

J1:MOVR7,#0x00

J2:MOV0x21,R7

MOVA,0x20

CLRC

RRCA

MOV0x20,A

JZJ3

MOVR7,0x01

SJMPJ4

J3:MOVR7,#0x00

J4:MOV0x21,R7

如果采用位操作則上述代碼只要寫成,該段代碼由于采用了位尋址,所以在程序中任何其他位置,如果在變量x發生改變的情況下,再次獲知最低位和次低位01情況,就不需要再次執行上述程序的計算工作,直接使用即可。

unsigned char bdatax;

bit y0,y1;

sbitr0 = x^0;

sbitr1 = x^1;

y0 = r0;

y1 = r1;

匯編產生的目標代碼:

MOVC,0x20.0

MOV0x21.0,C

MOVC,0x20.1

MOV0X21.1,C

4 結束語

本文結合基于8051核的MCU的內部結構特征,給出了若干C高效編程的技巧,本文的思想也可以應用到其他類型的MCU中去。筆者利用上述方法對一個1000多行C源代碼進行優化,編程產生的結果將原5K多的目標代碼降低為不足3K的目標代碼,幾乎減低了一半。

參考文獻:

[1] LinDen P V D. C程序設計奧秘[M].昆明:云南科技出版社,1998.

[2] Kamal R. 嵌入式系統體系結構、編程與設計[M].北京:清華大學出版社,2000.

主站蜘蛛池模板: 亚洲av片在线免费观看| 无码aaa视频| 国产亚洲欧美日本一二三本道| 亚洲an第二区国产精品| 草草线在成年免费视频2| 日韩一区精品视频一区二区| 手机在线国产精品| 呦视频在线一区二区三区| 中文字幕av一区二区三区欲色| 久草热视频在线| 午夜福利网址| 成人毛片在线播放| 国产女人在线观看| 精品福利视频导航| 亚洲AV无码久久天堂| 亚洲欧洲综合| 日韩成人在线网站| 人妻丰满熟妇αv无码| 曰AV在线无码| 午夜精品久久久久久久无码软件| 中国黄色一级视频| 国产在线精彩视频二区| 久久久噜噜噜久久中文字幕色伊伊| 国产乱子伦手机在线| 国产亚洲一区二区三区在线| 国产人前露出系列视频| 成年人免费国产视频| 精品国产99久久| 欧美在线一二区| 波多野结衣一区二区三区88| 国产综合欧美| 91外围女在线观看| 色婷婷色丁香| 日日碰狠狠添天天爽| 亚洲av成人无码网站在线观看| 国产欧美日韩综合在线第一| a级毛片一区二区免费视频| 97青青青国产在线播放| 亚洲日韩国产精品无码专区| 国产精品成人AⅤ在线一二三四| 欧美一级高清片欧美国产欧美| 亚洲国产精品一区二区第一页免| 亚洲国产欧美目韩成人综合| 国产毛片不卡| 午夜a级毛片| 国产www网站| 亚洲黄色高清| 久久五月天国产自| 亚洲人成网站18禁动漫无码| 国产成人你懂的在线观看| 激情無極限的亚洲一区免费| 亚洲人精品亚洲人成在线| 四虎亚洲国产成人久久精品| 亚洲国产精品不卡在线| 一区二区三区四区精品视频| 色有码无码视频| 91免费在线看| 精品伊人久久大香线蕉网站| www.av男人.com| 国产精品网址在线观看你懂的| 精品在线免费播放| 永久免费AⅤ无码网站在线观看| 亚洲熟女中文字幕男人总站| 欧美黄网站免费观看| 欧美日韩一区二区在线免费观看| av一区二区无码在线| 亚洲欧美成人综合| 天堂成人av| 免费看黄片一区二区三区| 日本免费一级视频| 99资源在线| 四虎永久免费地址| 欧美一区二区三区国产精品 | 精品久久人人爽人人玩人人妻| 午夜三级在线| 在线观看国产精品一区| 国产男女免费完整版视频| 亚洲成a人片在线观看88| 国产va在线观看免费| 欧美国产在线看| 91在线丝袜| 欧美精品不卡|