51單片機C語言幾個數組定義的區別(精)_第1頁
51單片機C語言幾個數組定義的區別(精)_第2頁
免費預覽已結束,剩余6頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、51 單片機 C 語言幾個數組定義的區別這樣三個句子const uchar a12=.;char idata time4=.;uchar code table20=. ;const idata code 這三個是什么作用?句子是什么意思?const 表示本數組不可修改數組為常量數組code 表示本數組生成后是在 ROM 區中同樣不可修改idata 表示數組生成后在在 0 x000 xff 的 256 個 RAM 中,使用指針尋址 具體的 參考下面data,bdata,idata,pdata,xdata,cod 存 儲類型與存儲區bit 是在內部數據存儲空間中 20H . 2FH 區域中一個位的

2、地址,或者 8051 位可 尋址 SFR 的一個位地址。code 是在 0000H . 0FFFFH 之間的一個代碼地址。data 是在 0 到 127 之間的一個數據存儲器地址,或者在128 . 255 范圍內的一個特殊功能寄存器(SFR )地址。idata 是 0 to 255 范圍內的一個 idata 存儲器地址。xdata 是 0 to 65535 范圍內的一個 xdata 存儲器地址。指針類型和存儲區的關系詳解、存儲類型與存儲區關系data -可尋址片內 rambdata -可位尋址的片內 ramidata -可尋址片內 ram,允許訪問全部內部 rampdata -分頁尋址片外 r

3、am (MOVX R0 (256 BYTE/ 頁 xdata - 可尋址片外ram (64k 地址范圍code -程序存儲區(64k 地址范圍,對應 MOVC DPTR二、指針類型和存儲區的關系對變量進行聲明時可以指定變量的存儲類型如:uchar data x 和 data uchar x 相等價都是在內 ram 區分配一個字節的變量。同樣對于指針變量的聲明,因涉及到指針變量本身的存儲位置和指針所指向的 存儲區位置不同而進行相應的存儲區類型關鍵字的使用如:uchar xdata * data pstr是指在內 ram 區分配一個指針變量(*號后的 data 關鍵字的作用,而且這個 指針本身指向

4、 xdata 區(*前 xdata 關鍵字的作用,可能初學 C51 時有點不好懂也不好記。沒關系,我們馬上就可以看到對應“*前后不同的關鍵字的使用在編譯時出現什么情況。uchar xdata tmp10; 在外 ram 區開辟 10 個字節的內存空間,地址是外 ram 的0 x0000 - 0 x0009第 1 種情況:uchar data * data pstr;pstr=tmp;首先要提醒大家這樣的代碼是有 bug 的,他不能通過這種方式正確的訪問到tmp 空間。為什么?我們把編譯后看到下面的匯編代碼:MOV 0 x08,#tmp(0 x00 ;0 x08 是指針 pstr 的存儲地址看到

5、了嗎!本來訪問外 ram 需要 2 byte 來尋址 64k 空間,但因為使用 data 關 鍵字(在 *號前的那個,所以按 KeilC 編譯環境來說就把他編譯成指向內 ram 的指針變量了,這也是初學 C51 的朋友們不理解各 個存儲類型的關鍵字定義而造成的bug。特別是當工程中的默認的存儲區類為 large 時,又把 tmp10聲明為 uchar tmp10時,這樣的 bug 是很隱秘的不容易被發現。第 2 種情況:uchar xdata * data pstr;pstr = tmp;這種情況是沒問題的,這樣的使用方法是指在內ram 分配一個指針變量(*號后的 data 關鍵字的作用,而且

6、這個指針本身指向xdata 區(*前 xdata 關鍵字的作用。編譯后的匯編代碼如下MOV 0 x08,#tmp(0 x00 ;0 x08 和 0 x09 是在內 ram 區分配的 pstr 指針變量地址空MOV 0 x09,#tmp(0 x00這種情況應該是在這里所有介紹各種情況中效率最高的訪問外ram 的方法了,請大家記住他。第 3 種情況:uchar xdata * xdata pstr;pstr=tmp;這中情況也是對的,但效率不如第 2 種情況。編譯后的匯編代碼如下。MOVDPTR, #0 x000A ;0 x000A,0 x000B 是在外 ram 區分配的 pstr 指針變量地址

7、空間MOV A, #tmp(0 x00MOV DPTR, AINC DPTRMOV A, #tmp(0 x00MOVX DPTR, A這種方式一般用在內 ram 資源相對緊張而且對效率要求不高的項目中。第 4 種情況:uchar data * xdata pstr;pstr=tmp;如果詳細看了第 1 種情況的讀者發現這種寫法和第 1 種很相似,是的,同第 1 種情況一樣這樣也是有 bug 的,但是這次是把 pstr 分配到了外 ram 區了。編譯后的匯編代碼如下。MOV DPTR, #0 x000A ;0 x000A 是在外 ram 區分配的 pstr 指針變量的地址空間MOV A, #tm

8、p(0 x00MOVX DPTR, A第 5 種情況:uchar * data pstr;pstr=tmp;大家注意到*前的關鍵字聲明沒有了,是的這樣會發生什么事呢?下面這么 寫呢!對了用齊豫的一首老歌名來說就是請跟我來”,請跟我來看看編譯后的匯編代碼,有人問這不是在講C51 嗎?為什么還要給我們看匯編代碼。C51 要想用好就要盡可能提升 C51編譯后的效率,看看編譯后的匯編會幫助大家盡快成為生產高效C51 代碼的高手的。還是看代碼吧!MOV 0 x08, #0X01 ;0 x08 0 x0A 是在內 ram 區分配的 pstr 指針變量的地址空間MOV 0 x09, #tmp(0 x00MO

9、V 0 x0A, #tmp(0 x00注意:這是新介紹給大家的,大家會疑問為什么在前面的幾種情況的pstr 指針變量都用 2 byte 空間而到這里就用 3 byte 空間了呢?這是 KeilC 的一個系統內部處理,在 KeilC 中一個指針變量最多占用 3 byte 空間,對于沒有聲明指針指向存儲空間類型的指針,系統編譯代碼時都強制加載一個字節的指針類型分辯值。具體的對應關系可以參考 KeilC 的 help 中 C51 Users Guide第 6 種情況:uchar * pstr;pstr=tmp;這是最直接最簡單的指針變量聲明,但他的效率也最低。還是那句話,大家一 起說好嗎!編譯后的匯編代碼如下。MOV DPTR, #0 x000A ;0 x000A OxOOOC 是在外 ram 區分配的 pstr 指針變量地址空間MOV A, #0 x01MOV DPTR, AI

溫馨提示

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

評論

0/150

提交評論