HC12變量定義_第1頁(yè)
HC12變量定義_第2頁(yè)
HC12變量定義_第3頁(yè)
HC12變量定義_第4頁(yè)
HC12變量定義_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 .全局變量和局部變量全局變量為整個(gè)程序而定義,在整個(gè)程序運(yùn)行期間, 它們占用固定的 RAM資源。在C語(yǔ)言中,在所有函數(shù)外部聲明的變量都認(rèn)為具有全局作用域,這些聲明通常置于源文件的頂部。全局”實(shí)際上僅僅意味著標(biāo)識(shí)符從聲明點(diǎn)到文件末尾的范圍內(nèi)是可訪(fǎng)問(wèn)的,當(dāng)程序包含多個(gè)源文件時(shí),則在一個(gè)文件中定義的全局變量在其他文件引用時(shí),需要使用extern關(guān)鍵字聲明。在引用文件內(nèi)部,標(biāo)識(shí)符的作用域是由 extern聲明的位置確定的。 如果該聲明是全局的, 那 么該標(biāo)識(shí)符對(duì)于文件是全局的;如果該聲明是放在塊內(nèi)的,則它對(duì)于那個(gè)塊就是局部的。局部變量為某個(gè)函數(shù)或子程序而定義,只在函數(shù)運(yùn)行時(shí), 從堆??臻g中分配存儲(chǔ)

2、空間;函數(shù)運(yùn)行結(jié)束,所占用堆??臻g釋放。2 .變量修飾符變量定義有三個(gè)修飾符值得注意,雖然它們與標(biāo)準(zhǔn)C是相同的,但是在嵌入式 C語(yǔ)言中又有不同的含義。 volatile大多數(shù)編譯器對(duì)源程序編譯時(shí)做優(yōu)化操作,其中一種優(yōu)化方法是基于這種假設(shè):除非明確地把某值寫(xiě)到內(nèi)存,否則內(nèi)存中的值不會(huì)改變。所以如果源程序中頻繁使用某個(gè)內(nèi)存,編譯器會(huì)把這個(gè)內(nèi)存放到 CPU寄存器或高速緩存中,提高代碼運(yùn)行速度。在嵌入式系統(tǒng)中,這種 優(yōu)化會(huì)影響程序的正確執(zhí)行,典型的情況是:硬件外設(shè)寄存器的值隨時(shí)都在變化,并且這種變化是不需要在寫(xiě)寄存器程序來(lái)改變。內(nèi)存變量在主程序中沒(méi)有顯示改變,但在中斷服務(wù)程序被改變,如果編譯器在主程序

3、中將內(nèi)存以寄存器來(lái)取代,中斷服務(wù)程序?qū)ψ兞康母淖兙筒荒軅鬟f到主程序中。對(duì)于這兩種情況做變量聲明時(shí),需要加前綴volatile ,告訴編譯器不要對(duì)這些變量做優(yōu)化操作。例如: volatile char device_status(2) static在子函數(shù)中用static聲明的變量是局部變量,局部的范圍可能是一個(gè)文件、函數(shù)、過(guò)程中, 在局部的范圍內(nèi),變量可以調(diào)用,變量值可以共享。下面給出了一個(gè)子函數(shù)中使用的局部變 量的用法。void MyFunction (void)static char myVar = 0; / 用 static 聲明的局部變量myVar = myVar + 1;void m

4、ain (void)MyFunction();/ 調(diào)用之前 myVar = 0 ,調(diào)用之后 myVar = 1MyFunction();/ 調(diào)用之前 myVar = 1 ,調(diào)用之后 myVar = 2(3) const修飾符const可以用在任何變量之前,用于聲明變量值不會(huì)被改變,即 只讀的”。這提供了 一種保護(hù)性編程,編譯器會(huì)將任何想修改這種變量的行為看成是違犯語(yǔ)法的行為。const聲明的變量必須包含一個(gè)初值,不允許在以后的使用中修改它的值。宏定義常量和const有一些相似之處,但 const還聲明了數(shù)據(jù)類(lèi)型,編譯器對(duì)它們的處理也有所不同,如:#define TYPEA 10 /*字符” T

5、YPEA在編譯時(shí)用 10來(lái)代替*/const unsigned int typeA=10; /*typeA 是一個(gè)無(wú)符號(hào)整型數(shù)值為10*/當(dāng)在一個(gè)指針聲明中使用const關(guān)鍵字時(shí),其意義有所不同,如:const int *p; /*P是一個(gè)可修改的指針,指向一個(gè)只讀的int值*/int *const p=&i;/*P 是一個(gè)只讀的指針,指向一個(gè)可修改的int彳1*/const int * const p=&i; /*P 是一個(gè)只讀的指針,指向一個(gè)只讀的int值*/在嵌入式系統(tǒng)編程時(shí),const修飾的變量應(yīng)該把它看成一種常量,常量值存儲(chǔ)在 ROM中。5.4.2 變量存儲(chǔ)空間分配嵌

6、入式內(nèi)部數(shù)據(jù)存儲(chǔ)器 RAM只有幾百字節(jié),如果通過(guò)擴(kuò)展外部存儲(chǔ)器RAM來(lái)提高數(shù)據(jù)存儲(chǔ)量必將會(huì)增加了硬件成本,使系統(tǒng)更加的復(fù)雜,訪(fǎng)問(wèn)外部存儲(chǔ)器比訪(fǎng)問(wèn)內(nèi)部存儲(chǔ)器所需的 代碼也要長(zhǎng)得多。有效地使用片內(nèi)存儲(chǔ)器、 提高存儲(chǔ)器空間的利用率對(duì)開(kāi)發(fā)者來(lái)說(shuō)十分關(guān)鍵。內(nèi)部處理器、內(nèi)部堆棧、壓縮棧、所有程序變量和所有包含進(jìn)來(lái)的庫(kù)函數(shù)都將使用數(shù)量有限 的內(nèi)部數(shù)據(jù)存儲(chǔ)器 RAM。因?yàn)镃語(yǔ)言采用了存儲(chǔ)器的覆蓋技術(shù),可以在程序進(jìn)行連接時(shí), 它將那些已經(jīng)被其它程序段釋放了的存儲(chǔ)器空間重新定義給另一個(gè)程序段的變量使用,當(dāng)這個(gè)程序運(yùn)行結(jié)束時(shí)再將這些存儲(chǔ)器釋放以供其它程序段使用。全局變量的作用范圍是整個(gè)程序,因此不能被釋放;靜態(tài)變量

7、由于在函數(shù)的調(diào)用中也不能被釋放;只有局部變量中的動(dòng)態(tài)變量可以被釋放。因此在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)該盡量的使用局部變量,提高內(nèi)部數(shù)據(jù)存儲(chǔ)器的使用率。在C語(yǔ)言中程序中間結(jié)果及參數(shù)傳遞是通過(guò)內(nèi)部的寄存器來(lái)完成的,要是內(nèi)部的存儲(chǔ)器不夠,將會(huì)給你的程序帶來(lái)許多莫名其妙的錯(cuò)誤。例如在進(jìn)行程序設(shè)計(jì)時(shí)語(yǔ)句不應(yīng)太長(zhǎng),一條長(zhǎng)語(yǔ)句可以分成多條語(yǔ)句,這樣可以減少中間變量。若語(yǔ)句太長(zhǎng)可能造成臨時(shí)寄存器不夠用,導(dǎo)致計(jì)算出錯(cuò)。下面的示例給出了 08C中對(duì)于變量的一些詳細(xì)的使用信息。例: 08C中對(duì)于變量的存儲(chǔ)空 間的使用,在 MT_IDE For Freescale HC08 環(huán)境中輸入如下程序: unsigned char p

8、ubVar0; / 全局變量/*主函數(shù)*/ void main() (unsigned int tmpVar1; / 局部變量static unsigned int staticVar2; / 靜態(tài)變量const static unsigned int constVar3=0x11; / 靜態(tài)常量tmpVar1=0x22;staticVar2=0x33;pubVar0=0x44;編譯后的列表文件:_main:tmpVarl -> X+08037 A7 FE aiS #-28039 95 tSXFILE: main.c(0001) unsigned char pubVar0; / 全局變量

9、聲明(0002) /*主函數(shù)*/(0003) void main()(0004)803A 4F clrA803B F7 stA 0,X803C A6 22 ldA #34803E E7 01 stA 1,X(0005) unsigned int tmpVar1;(0006) static unsigned int staticVar2;(0007) const static unsigned int constVar3=0x11;(0008) tmpVar1=0x22;(0009) staticVar2=0x33;8040 4F clrA8041 C7 0041 stA _r0+18044 A

10、6 33 ldA #518046 C7 0042 stA _r0+2(0010) pubVar0=0x44;FILE: <library>8049 A6 44 ldA #68804B C7 0043 stA _pubV ar0804E A7 02 aiS #28050 81 rts說(shuō)明:tmpVar1是一個(gè)無(wú)符號(hào)整型的局部變量,編譯后的列表文件中,在 main函數(shù)的開(kāi)始處, 將堆棧指針減2,預(yù)留了 2個(gè)字節(jié)的空間用于存放tmpVar1的值,如果 main函數(shù)有更多的局部變量,會(huì)開(kāi)辟更多的堆??臻g。執(zhí)行語(yǔ)句“tmpVar1=0x22時(shí),將十六進(jìn)數(shù) 22(十進(jìn)制數(shù)34)放到堆??臻g,高

11、字節(jié)0存放在堆棧指針處,低字節(jié)34存放在堆棧指針加1處。語(yǔ)句"const static unsigned int constVar3=0x11;在執(zhí)行時(shí)并不生成具體的執(zhí)行代碼,只是將 常量0x11放到S19代碼中,并且通常放在S19代碼的最前面。本程序生成的S19代碼的第一行S12384094CD8054427066F00AF0120F545265803B 其中加陰影的“ 001僦是上述語(yǔ)句所產(chǎn)生的。staticVar2是一個(gè)靜態(tài)局部變量,雖然是局部變量,但子程序結(jié)束后,其值仍然保留。所 以也需要分配固定的存儲(chǔ)空間。在08C中,這些變量存放在 “Vreg段變量空間的后面,所以語(yǔ)句&q

12、uot;staticVar2=0x33在執(zhí)行時(shí),高字節(jié)放在_r0+1的位置(r0位于Vreg段),低字節(jié)放在_r0+2 處。staticVar2是一個(gè)字節(jié)型的局部變量,編譯后分配了固定的存儲(chǔ)空間。對(duì)于這些加了修飾 符的變量的使用方法在不同編譯器中存儲(chǔ)空間的分配有所差別,使用者只需要像上面一樣編寫(xiě)小的程序段進(jìn)行編譯,然后查看列表文件(.1st)、映象文件(.mp)及代碼文件(.s19)等,就可以弄清楚使用方法,理解編譯器這些問(wèn)題對(duì)于軟硬件編程是一件很重要的事情?;谇度胧降?8C語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言雖然在語(yǔ)法上區(qū)別不大,但要結(jié)合嵌入式的系統(tǒng)資源,用 C語(yǔ)言 開(kāi)發(fā)符合實(shí)際工程需要的嵌入式軟件系統(tǒng),對(duì)編

13、程者來(lái)說(shuō)是一件很難的事情。本節(jié)根據(jù)我們的開(kāi)發(fā)經(jīng)驗(yàn)講述一些 08C的編程技巧。5.4.3 數(shù)據(jù)類(lèi)型的選用嵌入式C語(yǔ)言編程不同于一般 C語(yǔ)言編程的一個(gè)顯著特點(diǎn),就是要和程序存儲(chǔ)器資源結(jié)合 起來(lái),雖然其提供的數(shù)據(jù)類(lèi)型十分豐富,但是只有bit和char等數(shù)據(jù)類(lèi)型是機(jī)器語(yǔ)言直接支持的數(shù)據(jù)類(lèi)型,用此類(lèi)數(shù)據(jù)類(lèi)型的語(yǔ)句所生成的代碼較短;而其它的數(shù)據(jù)類(lèi)型如整型、浮點(diǎn)型等數(shù)據(jù)要有一定的內(nèi)部程序或內(nèi)部函數(shù)的支持,相對(duì)來(lái)說(shuō)用該類(lèi)數(shù)據(jù)類(lèi)型的語(yǔ)句生成的代碼要長(zhǎng)。有些 C語(yǔ)言程序表面上看起來(lái)十分的簡(jiǎn)單,但在實(shí)際編譯時(shí),生成的代碼卻相當(dāng) 長(zhǎng)。因此我們要按照實(shí)際需要,盡量選用占用存儲(chǔ)空間少的數(shù)據(jù)類(lèi)型,可以大大的減少所生成的代碼

14、長(zhǎng)度。例如在 08C中用不同的數(shù)據(jù)類(lèi)型定義i時(shí),語(yǔ)句:for(i=0;i<10;i+);經(jīng)編譯后生成的代碼長(zhǎng)度如表 5-4所示。去5-4不同致福類(lèi)空占用存儲(chǔ)舒字節(jié)數(shù)和代碼長(zhǎng)度對(duì)此數(shù)據(jù)類(lèi)型unfiigned chaifchaiunsiugied intintunsigned tonglangfloat字節(jié)數(shù)i122dd代招長(zhǎng)度12194343134134503通過(guò)表5-3我們知道,不同的數(shù)據(jù)類(lèi)型所生成的機(jī)器代碼長(zhǎng)度相差很大,相同類(lèi)型的數(shù)據(jù)類(lèi)型有無(wú)符號(hào)對(duì)機(jī)器代碼長(zhǎng)度也有影響。在程序編譯時(shí)生成機(jī)器代碼長(zhǎng)的數(shù)據(jù)類(lèi)型的優(yōu)先級(jí)越高,不同的數(shù)據(jù)類(lèi)型在進(jìn)行程序運(yùn)算時(shí)要轉(zhuǎn)化為高優(yōu)先級(jí)的數(shù)據(jù)類(lèi)型,相應(yīng)的代碼

15、長(zhǎng)度也會(huì)增長(zhǎng)。因此我們應(yīng)盡可能地使用bit, char等機(jī)器語(yǔ)言直接支持的數(shù)據(jù)類(lèi)型,無(wú)符號(hào)數(shù)的變量應(yīng)聲明為無(wú)符號(hào)數(shù),盡可能地減少程序中使用的數(shù)據(jù)類(lèi)型的種類(lèi)。5.4.4 位操作的其他實(shí)現(xiàn)方法1 .用共用體和位域?qū)崿F(xiàn)位操作綜合共用體和位域等多種數(shù)據(jù)類(lèi)型,可以實(shí)現(xiàn)很直觀的位操作方法。下面以A 口的數(shù)據(jù)寄存器位操作方法來(lái)說(shuō)明。定義/A 口數(shù)據(jù)寄存器及位定義typedef union unsigned char Byte;struct int PTA_0 :1; /* Port A數(shù)據(jù)Bit 0 */int PTA_1 :1; /* Port A數(shù)據(jù)Bit 1 */int PTA_2 :1; /* Po

16、rt A數(shù)據(jù)Bit 2 */int PTA_3 :1; /* Port A數(shù)據(jù)Bit 3 */int PTA_4 :1; /* Port A數(shù)據(jù)Bit 4 */int PTA_5 :1; /* Port A數(shù)據(jù)Bit 5 */int PTA_6 :1; /* Port A數(shù)據(jù)Bit 6 */int PTA_7 :1; /* Port A數(shù)據(jù)Bit 7 */ Bits;PTASTR;# define _PTA (*(volatile PTASTR *)0x00) #define PTA _PTA.Byte# define PTA0 _PTA.Bits.PTA_0# define PTA1 _PT

17、A.Bits.PTA_1# define PTA2 _PTA.Bits.PTA_2# define PTA3 _PTA.Bits.PTA_3# define PTA4 _PTA.Bits.PTA_4# define PTA5 _PTA.Bits.PTA_5# define PTA6 _PTA.Bits.PTA_6# define PTA7 _PTA.Bits.PTA_7 (2)使用對(duì)A 口整個(gè)口的使用,則直接對(duì) PTA賦值。如:PTA = 0xFF;對(duì)A 口的某一位的使用,則直接對(duì)PTAx賦值。如:PTA4 = 1;很顯然這樣定義了以后,操作很方便,程序的可讀性也很好。 但這種方法08C編譯器

18、編譯后的效率比第1種方法要差。如上面用到的PTA4 = 1編譯后的代碼為:8089 B6 00 IdA 0x00 808B AA 10 orA #16808D B7 00 stA 0x00本來(lái)用1條位操作指令來(lái)實(shí)現(xiàn)的操作,現(xiàn)在用了3條指令,在執(zhí)行效率和存儲(chǔ)空間上都比較差,對(duì)于接口編程時(shí)對(duì)時(shí)序要求很高的時(shí)候要特別注意這個(gè)問(wèn)題。2.用宏定義+按位與、按位或運(yùn)算”的方法實(shí)現(xiàn)位操作在5.2.2節(jié)所講述的位操作方法效率高,但程序的易讀性不強(qiáng)。在有些情況下,將 5.2.2節(jié)的 位操作語(yǔ)句再來(lái)例如:串行模塊 (SCI)的控制寄存器2(SCC2)的第5位控制接收中斷的開(kāi)放 (=1時(shí))和禁止(=0時(shí)),此時(shí)可以

19、定義 兩個(gè)宏:#define EnableSCIReInt() SCC2|= (1<<5) 令 SCC2.5=1,開(kāi)放 SCI 接收中斷 #define DisableSCIReInt() SCC2&=(1<<5) / 令 SCC2.5=0,禁止 SCI 接收中斷這樣在程序中開(kāi)放串行接收中斷就用如下語(yǔ)句:EnableSCIReInt();5.4.5算法設(shè)計(jì)問(wèn)題嵌入式C語(yǔ)言和標(biāo)準(zhǔn)C語(yǔ)言存在著很大差別,在計(jì)算機(jī)上進(jìn)行C語(yǔ)言程序設(shè)計(jì)時(shí)可以不必考慮程序代碼的長(zhǎng)短,只需考慮程序功能實(shí)現(xiàn),但是在嵌入式上進(jìn)行C語(yǔ)言程序設(shè)計(jì)就必須考慮系統(tǒng)的硬件資源。有時(shí)并不是程序的算法越簡(jiǎn)單、

20、長(zhǎng)度越短越好,因?yàn)橛幸恍┧惴ㄒ{(diào)用一些內(nèi)部的子程序和函數(shù),生成的機(jī)器代碼可能非常長(zhǎng)。不同的算法對(duì)程序代碼長(zhǎng)度影響十分大,因此在進(jìn)行程序設(shè)計(jì)時(shí),就盡量采用程序生成代碼短的算法,在不影響程序功能實(shí)現(xiàn)的情況下可以采用一些優(yōu)化算法。在嵌入式C語(yǔ)言編譯成機(jī)器代碼時(shí),不同的運(yùn)算生成的機(jī)器代碼的長(zhǎng)度相差很大,盡可能 地減少程序中對(duì)某種數(shù)據(jù)類(lèi)型的運(yùn)算種類(lèi),越復(fù)雜的數(shù)據(jù)類(lèi)型效果越明顯。在進(jìn)行數(shù)據(jù)計(jì)算時(shí),在一定的精度范圍內(nèi),可以用一些近似的計(jì)算來(lái)完成一些運(yùn)算,既不損失精度又能減少大量的代碼。比如:用邏輯 AND/&取模比MOD/%操作更有效。在用熱敏電阻測(cè)量溫度時(shí),可根據(jù)熱敏電阻一溫度特性公式來(lái)求值。數(shù)學(xué)

21、表達(dá)式表示為:RT=RT0e(B(1/T-1/T0) 其中:RT-T C時(shí)的阻值RT0-T0 C (基準(zhǔn)溫度)時(shí)的阻值B-熱敏電阻特性參數(shù)如果直接按照公式計(jì)算RT時(shí)程序結(jié)構(gòu)簡(jiǎn)單,算法復(fù)雜度不高,但是程序?qū)⒄{(diào)用<math.h>文件中的對(duì)數(shù)函數(shù),在編譯成機(jī)器碼時(shí)函數(shù)有1K多字節(jié),對(duì)于一般只有幾K字節(jié)的嵌入式系統(tǒng)來(lái)說(shuō),這是十分不合適的??紤]到系統(tǒng)資源問(wèn)題可以用一種替代方法一查表法來(lái)實(shí)現(xiàn)算法。只要給出一定溫度范圍內(nèi)不同溫度值對(duì)應(yīng)熱敏電阻的電阻值,然后建立表格,只要按照系統(tǒng)求出的阻值,進(jìn)行查表、插值,就可以求出相應(yīng)的溫度值。這種算法相比前面的公式法的算法復(fù)雜,C語(yǔ)言程序代碼也長(zhǎng),但在編譯成機(jī)器碼時(shí),代碼長(zhǎng)度卻很短,只有一、二

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論