資源描述:
《重要的#pragma聲明》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、重要的#pragma聲明#pragma聲明是基于單片機開發(fā)的特點而對標準C語法的一個擴充。它對充分利用單片機內(nèi)各類有限的資源起到不可或缺的關(guān)鍵作用。下面簡單介紹幾個最常用的#pragma聲明。1#pragmaDATA_SEG定義變量所處的數(shù)據(jù)段。其語法型式為:#pragmaDATA_SEG<屬性>名稱數(shù)據(jù)段名稱可以自己任意命名,但習慣上有些約定的名稱,其作用分別為:DEFAULT-缺省的數(shù)據(jù)段,在08·系列單片機中的地址為0x100以上。一般的變量定義可以放在這一區(qū)域。MY_ZEROPAGE-·特指第0頁數(shù)據(jù)段,地址范圍0x00-0xff,但實際用戶可用的空間不到256字
2、節(jié),因為前面的一些地址空間已經(jīng)分配給了片內(nèi)寄存器。需要頻繁或快速存取的變量應該指定放在這一特殊區(qū)域,特別是位變量。數(shù)據(jù)段名稱必須和prm文件中的數(shù)據(jù)段配置說明相關(guān)連才能真正發(fā)揮其定位作用。如果你自己命名的數(shù)據(jù)段在prm文件中沒有特別說明,那此數(shù)據(jù)段的性質(zhì)等同于“DEFAULT”。數(shù)據(jù)段的“屬性”可以缺省,它主要的目的是告訴編譯器此段數(shù)據(jù)可適用的尋址模式。不同的尋址模式所花的指令數(shù)量和運行時間都不同。對于08系列單片機,關(guān)鍵的是第0頁數(shù)據(jù)段可以用8位地址進行直接快速尋址,故對應此數(shù)據(jù)段應盡量指明其屬性為“__SHORT_SEG”。對于一般數(shù)據(jù)段沒有屬性描述,其缺省是“__F
3、AR_SEG”,將用16位地址間接尋址。舉幾個數(shù)據(jù)段定義的例子加以進一步說明。#pragmaDATA_SEG__SHORT_SEGMY_ZEROPAGE//開始0頁數(shù)據(jù)定義volatilestruct{unsignedpowerOn:1;unsignedalarmOn:1;unsignedcommActive:1;unsignedsysError:1;}myFlag;volatilewordmsCounter;bytei,j,k;#pragmaDATA_SEGDEFAULT//開始普通數(shù)據(jù)段定義(結(jié)束0頁數(shù)據(jù)段)bytetmpBuff[16];2#pragmaCONST_
4、SEG定義一個常數(shù)數(shù)據(jù)段,必須和變量的const修飾關(guān)鍵詞配合使用。其語法型式為:#pragmaCONST_SEG名稱該數(shù)據(jù)段下定義的所有數(shù)據(jù)將被放置在程序只讀的ROM區(qū),也就是08系列單片機內(nèi)的Flash程序空間區(qū)。常數(shù)段名稱可以用戶自由定義,但一般都用“DEFAULT”,讓連接器按可用的ROM區(qū)域自由分配變量位置。舉例如下:#pragmaCONST_SEGDEFAULTconstbyteprjName[]=”Thisisademo”;FSL系列單片機開發(fā)及C語言編程簡介constwordversion=0x0301;#pragmaCONST_SEGDEFAULTwor
5、dversion=0x0301;//沒有const該變量將被放置在RAM區(qū)!#pragmaDATA_SEGDEFAULTconstwordversion=0x0301;//盡管有const但該變量將被放置在RAM區(qū)!3.3.3#pragmaINTO_ROM功能類似于“CONST_SEG”,和變量修飾詞“const”配合使用。但它只定義一個常數(shù)變量到ROM區(qū),且只作用于緊接著的下一行定義。例如:#pragmaINTO_ROMconstbyteprjName[]=”Thisisademo”;//變量將被放置在ROM區(qū)wordverData=0x0301;//變量將被放置在缺省
6、RAM區(qū)4#pragmaCODE_SEG用以定義程序段并賦以特定的段名,語法型式如下:#pragmaCODE_SEG<屬性>名稱一般的程序設(shè)計是無需對代碼段做特殊處理的。因為所有傳統(tǒng)的08系列單片機其程序空間都不超過64KB(16位尋址最大范圍)且在內(nèi)存地址中呈線性連續(xù)分布。對于項目中所有的代碼文件或庫文件,連接器會在最后按程序模塊出現(xiàn)的先后順序挨個自動安排所有程序函數(shù)在內(nèi)存中所處的實際位置,用戶不必太關(guān)心某一個函數(shù)的具體位置。但最新推出的幾款8位機程序?qū)⒊^64KB,這樣必須在內(nèi)存空間中以頁面型式映射到首64KB地址范圍,其對應的程序段屬性要特殊聲明。某些特殊的設(shè)計需要
7、將不同部分的程序分別定位到不同的地址空間,例如實現(xiàn)程序代碼下載自動更新。這樣的設(shè)計需要把負責應用程序下載更新的驅(qū)動代碼固定放置在一個保留區(qū)域內(nèi),而把一般的應用程序放置在另外一個區(qū)域以便在需要時整體擦除后更新。這時就需要用“CODE_SEG”來分別指明不同的程序段,但還必須配合prm文件對程序空間進行分配和指派。代碼段的屬性一般都用缺省的“__FAR_SEG”,表明所有的函數(shù)調(diào)用都是長調(diào)用(對應匯編指令為JSR)。但C08和S08系列單片機支持效率更高的函數(shù)短調(diào)用(對應匯編指令為BSR),如果你的某一個功能模塊含有多個相互調(diào)用的