資源描述:
《keil c51中變量使用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、引言8051內(nèi)核單片機(jī)是一種通用單片機(jī),在國(guó)內(nèi)占有較大的市場(chǎng)份額。在將C語(yǔ)言用于51內(nèi)核單片機(jī)的研究方面,Keil公司做得最為成功。由于51內(nèi)核單片機(jī)的存儲(chǔ)結(jié)構(gòu)的特殊性,KeilC51中變量的使用與標(biāo)準(zhǔn)C有所不同。正確地使用變量,有利于獲得高效的目標(biāo)代碼。下面詳細(xì)介紹KeilC51中變量的使用方法。1CPU存儲(chǔ)結(jié)構(gòu)與變量的關(guān)系變量都需要有存儲(chǔ)空間,存儲(chǔ)空間的不同使得變量使用時(shí)的工作效率也不同。標(biāo)準(zhǔn)C的典型運(yùn)行環(huán)境是8086(含IA-32系列)內(nèi)核,其存儲(chǔ)結(jié)構(gòu)是CPU內(nèi)部有寄存器,外部有存儲(chǔ)器,寄存器的訪問速度大大高于存儲(chǔ)
2、器的訪問速度。在標(biāo)準(zhǔn)C中,不加特別定義的變量是放在存儲(chǔ)器中的,使用register可以強(qiáng)制變量存儲(chǔ)在寄存器中,對(duì)于使用特別頻繁且數(shù)量不多的變量可以選用這種存儲(chǔ)模式,以獲得更高的工作效率。相比之下,51內(nèi)核單片機(jī)的存儲(chǔ)結(jié)構(gòu)則顯得有些怪異,它的存儲(chǔ)空間有3個(gè):程序存儲(chǔ)器空間(64KB含片內(nèi)、片外)、片外數(shù)據(jù)存儲(chǔ)器空間(64KB)、片內(nèi)數(shù)據(jù)存儲(chǔ)器及特殊功能寄存器空間。它沒有真正意義上的寄存器,它的寄存器其實(shí)是片內(nèi)數(shù)據(jù)存儲(chǔ)器(如R0~R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在KeilC51中使用變量就和標(biāo)準(zhǔn)C有很大
3、不同。2KeilC51變量分析KeilC51支持標(biāo)準(zhǔn)C原有的大多數(shù)變量類型,但為這些變量新增了多種存儲(chǔ)類型,也新增了一些標(biāo)準(zhǔn)C沒有的變量。2.1KeilC51新增的變量存儲(chǔ)類型KeilC51中定義變量的格式如下:[存儲(chǔ)種類]數(shù)據(jù)類型[存儲(chǔ)類型]變量名表;其中,[存儲(chǔ)類型]是標(biāo)準(zhǔn)C中沒有的,[存儲(chǔ)類型]共有6種,分別介紹如下:①data。將變量存儲(chǔ)在片內(nèi)可直接尋址的數(shù)據(jù)存儲(chǔ)器中。使用這種存儲(chǔ)模式,目標(biāo)代碼中對(duì)變量的訪問速度最快。②bdata。將變量存儲(chǔ)在片內(nèi)可位尋址的數(shù)據(jù)存儲(chǔ)器中。在目標(biāo)代碼中變量可以方便地進(jìn)行位處理,在不
4、進(jìn)行位處理時(shí)與data相同。③idata。將變量存儲(chǔ)在片內(nèi)間接尋址的數(shù)據(jù)存儲(chǔ)器中。在52內(nèi)核中,當(dāng)片內(nèi)直接尋址數(shù)據(jù)存儲(chǔ)器不夠用時(shí),可以使用128字節(jié)間接尋址數(shù)據(jù)存儲(chǔ)器,訪問速度一般較data要慢一些,但具有最大的片內(nèi)數(shù)據(jù)存儲(chǔ)器空間;在51內(nèi)核中因無(wú)單獨(dú)的間接尋址數(shù)據(jù)存儲(chǔ)器區(qū),idata與data無(wú)區(qū)別。④xdata。將變量存儲(chǔ)在片外數(shù)據(jù)存儲(chǔ)器中。目標(biāo)代碼中只能使用“MOVXA,@DPTR”和“MOVX@DPTR,A”指令訪問變量,訪問速度最慢,但存儲(chǔ)空間最大(64KB)。⑤pdata。將變量存儲(chǔ)在片外數(shù)據(jù)存儲(chǔ)器中的第一頁(yè)
5、(00H~FFH)中。目標(biāo)代碼中可以使用“MOVXA,@Ri”和“MOVX@Ri,A”指令訪問變量,訪問速度與xdata相同,存儲(chǔ)空間為256字節(jié)。⑥code。將變量存儲(chǔ)在程序存儲(chǔ)器中。目標(biāo)代碼中只能使用MOVC指令訪問變量,因變量存儲(chǔ)在程序存儲(chǔ)器中,具有非易失性且為只讀。2.2KeilC51新增的指針變量存儲(chǔ)類型KeilC51中的指針變量形式如下:數(shù)據(jù)類型[數(shù)據(jù)存儲(chǔ)類型]*[指針存儲(chǔ)類型]標(biāo)識(shí)符;其中,[數(shù)據(jù)存儲(chǔ)類型]和[指針存儲(chǔ)類型]都是標(biāo)準(zhǔn)C中沒有的。[數(shù)據(jù)存儲(chǔ)類型]定義數(shù)據(jù)(即尋址對(duì)象)存儲(chǔ)的空間,[指針存儲(chǔ)類型
6、]定義指針自身存儲(chǔ)的空間。若不使用[數(shù)據(jù)存儲(chǔ)類型],則指針為一般指針,占用3個(gè)字節(jié);若使用[數(shù)據(jù)存儲(chǔ)類型]則指針為基于存儲(chǔ)器的指針,占用1~2個(gè)字節(jié)。2.3KeilC51新增的變量類型bit:位變量。存儲(chǔ)在片內(nèi)數(shù)據(jù)存儲(chǔ)器的可位尋址字節(jié)(20H~2FH)的某個(gè)位上,這個(gè)變量在實(shí)時(shí)控制中具有很高的實(shí)用價(jià)值。sfr:特殊功能寄存器變量。存儲(chǔ)在片內(nèi)特殊功能寄存器中,用來(lái)對(duì)特殊功能寄存器進(jìn)行讀寫操作。sbit:特殊功能寄存器位變量。存儲(chǔ)在片內(nèi)特殊功能寄存器的可位尋址字節(jié)(地址可以被8整除者)的某個(gè)位上,用來(lái)對(duì)特殊功能寄存器的可位尋
7、址位進(jìn)行讀寫操作。sbitl6:16位特殊功能寄存器變量。存儲(chǔ)在片內(nèi)特殊功能寄存器的連續(xù)2個(gè)字節(jié)的低地址上,這個(gè)變量類型很少使用。以上這些KeilC51中新增的變量類型,不支持?jǐn)?shù)組和指針操作。(本文轉(zhuǎn)自電子工程世界:http://news.eeworld.com.cn/mcu/2011/0721/article_4672_1.html)3KeilC51中使用變量存儲(chǔ)模式的必要性在KeilC51中,變量的存儲(chǔ)模式是一個(gè)可選項(xiàng),如果不使用這個(gè)選項(xiàng),則KeilC51在編譯時(shí)自動(dòng)進(jìn)行優(yōu)選分配。但這種處理方法有以下缺點(diǎn):①系統(tǒng)不知
8、道各種變量的使用頻度,有可能對(duì)使用頻度高的變量使用了訪問速度慢的片外存儲(chǔ)方式,而對(duì)使用頻高的變量使用了片內(nèi)存儲(chǔ)方式,使得程序的運(yùn)行效率降低;②在使用指針尋址時(shí),由于不知道尋址對(duì)象的存儲(chǔ)方式,只好使用一般指針,在KeilC51中一般指針要多占用1~2個(gè)字節(jié),并且使用時(shí)還要對(duì)存儲(chǔ)方式進(jìn)行判斷,增加了尋址操作時(shí)間。如果能夠