1. 程式人生 > >微控制器keil C中的data、bdata、idata、xdata、hdata、pdata、code解釋

微控制器keil C中的data、bdata、idata、xdata、hdata、pdata、code解釋

從資料儲存型別來說,8051系列有片內、片外程式儲存器,片內、片外資料儲存器,片內程式儲存器還分直接定址區和間接定址型別,分別對應以及根據系列特點而設定的型別,使用不同的儲存器,將使程式執行效率不同,在編寫程式時,最好指定變數的儲存型別,這樣將有利於提高程式執行效率此問題將在後面專門講述。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對應不同的實際硬體系統,也將有不同的編譯結果。

51系列中data,idata,xdata,pdata的區別:

data:固定指前面0x00-0x7f128RAM,可以用acc直接讀寫的,速度最快,生成的程式碼也最小。

idata:固定指前面0x00-0xff256RAM,其中前128data128完全相同,只是因為訪問的方式不同。idata是用類似C中的指標方式訪問的。彙編中的語句為:mox ACC,@Rx.(不重要的補充:cidata做指標式的訪問效果很好)

xdata:外部擴充套件RAM,一般指外部0x0000-0xffff空間,用DPTR訪問。

pdata:外部擴充套件RAM的低256個位元組,地址出現在A0-A7的上時讀寫,用movx ACC,@Rx讀寫。這個比較特殊,而且C51好象有對此BUG,建議少用。但也有他的優點,具體用法屬於中級問題,這裡不提。

微控制器C語言unsigned char code table[] code 

是什麼作用?

code的作用是告訴微控制器,我定義的資料要放在ROM(程式儲存區)裡面,寫入後就不能再更改,其實是相當與彙編裡面的定址MOVX(好像是),因為C語言中沒辦法詳細描述存入的是ROM還是RAM(暫存器),所以在軟體中添加了這一個語句起到代替彙編指令的作用,對應的還有data是存入RAM的意思。

程式可以簡單的分為code(程式)區,和data (資料)區,code區在執行的時候是不可以更改的,data區放全域性變數和臨時變數,是要不斷的改變的,cpucode區讀取指令,對data區的資料進行運算處理,因此code區儲存在什麼介質上並不重要,象以前的計算機程式儲存在卡片上,code

區也可以放在rom裡面,也可以放在ram裡面,也可以放在flash裡面(但是執行速度要慢很多,主要讀flash比讀ram要費時間),因此一般的做法是要將程式放到flash裡面,然後loadram裡面執行的;DATA區就沒有什麼選擇了,肯定要放在RAM裡面,放到rom裡面改動不了。

bdata如何使用它呢?若程式需要8個或者更多的bit變數,如果你想一次性給8個變數賦值的話就不方便了,(舉個例子說說它的方便之處,想更深入的瞭解請在應用中自己琢磨)又不可以定義bit陣列,只有一個方法

char bdata MODE;
sbit MODE_7 = MODE^7;
sbit MODE_6 = MODE^6;
sbit MODE_5 = MODE^5;
sbit MODE_4 = MODE^4;
sbit MODE_3 = MODE^3;
sbit MODE_2 = MODE^2;
sbit MODE_1 = MODE^1;
sbit MODE_0 = MODE^0;
8
bit變數MODE_n 就定義好了這是定義語句,Keilc 的特殊資料型別。記住一定要是sbit
不能bit MODE_0 = MODE^0;
賦值語句要是這麼寫C語言就視為異或運算

空間名稱

地址範圍

說明

DATA

D:00H~7FH

片內RAM直接定址區

BDATA

D:20H~2FH

片內RAM位定址區

IDATA

I:00H~FFH

片內RAM間接定址區

XDATA

X:0000H~FFFFH

64KB常規片外RAM資料區

HDATA

X:0000H~FFFFFFH

16MB擴充套件片外RAM資料區

CODE

C:0000H~FFFFH

64K常規片內外ROM程式碼區

HCONST(ECODE)

C:0000H~FFFFFFH

16MB擴充套件片外ROM常數區(Dallas390可用作程式碼區)

BANK0~BANK31

B0:0000H~FFFFH

:

:

B31:0000H~FFFFH

分組程式碼區,最大可擴充套件32X64KB ROM

keil生成的檔案:

.plg:編譯器編譯結果
.hex
.bin:可執行檔案
.map
.lst:連結檔案
.o
:目標檔案
.crf
.lnp.d.axf:除錯檔案
.opt
:儲存工程配置資訊
.bak
:工程備份檔案

M51檔案,startup檔案。

普通51系列微控制器儲存空間資源分配情況:

空間名稱 地址範圍 說明
DATA D:00H~7FH 片內RAM直接定址區
BDATA D:20H~2FH 片內RAM位定址區
IDATA I:00H~FFH 片內RAM間接定址區
XDATA X:0000H~FFFFH 64K片外RAM資料區
CODE C:0000H~FFFFH 64K片內外ROM程式碼區
BANK0~BANK31 B0:0000H~FFFFH : : B31:0000H~FFFFH 分組程式碼區,最大可擴充套件32X64KB ROM
下表是新型80C51微控制器擴充套件空間的分配情況:
空間名稱 地址範圍 說明
DATA D:00H~7FH 片內RAM直接定址區
BDATA D:20H~2FH 片內RAM位定址區
IDATA I:00H~FFH 片內RAM間接定址區
XDATA X:0000H~FFFFH 64KB常規片外RAM資料區
HDATA X:0000H~FFFFFFH 16MB擴充套件片外RAM資料區
CODE C:0000H~FFFFH 64K常規片內外ROM程式碼區
HCONST(ECODE) C:0000H~FFFFFFH 16MB擴充套件片外ROM常數區(對Dallas390可用作程式碼區)
BANK0~BANK31 B0:0000H~FFFFH : : B31:0000H~FFFFH 分組程式碼區,最大可擴充套件32X64KB ROM

相關推薦

微控制器keil Cdatabdataidataxdatahdatapdatacode解釋

從資料儲存型別來說,8051系列有片內、片外程式儲存器,片內、片外資料儲存器,片內程式儲存器還分直接定址區和間接定址型別,分別對應以及根據系列特點而設定的型別,使用不同的儲存器,將使程式執行效率不同,在編寫程式時,最好指定變數的儲存型別,這樣將有利於提高程式執行

C++類的三種繼承方式public(公有繼承)protected(保護繼承)private(私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

03C++語言對C的增強——實用性變量檢測struct類型C++所有變量和函數都必須有類型bool類型三目運算符

自己 聲明 優化 同名 編譯器 直接 修飾 關鍵字 變化 register關鍵字 請求編譯器讓變量a直接放在寄存器裏面,速度快在c語言中 register修飾的變量 不能取地址,但是在c++裏面做了內容1register關鍵字的變化register關鍵字請求“編

51微控制器 Keil C 延時程式的簡單(晶振12MHz,一個機器週期1us.)

一. 500ms延時子程式 void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 產生的彙

keil c檔案打包成lib檔案

1.選擇:projects   -   options   for   target   'target   1'   , 在   output   頁選中   create   library ,  使將要打包的檔案生成LIB和OBJ檔案. 如將如下檔案: /***********************

實戰c++的string系列--string與char*const char *的轉換(data() or c_str())

在工程中,我們也有很多時候用到string與char*之間的轉換,這裡有個一我們之前提到的函式 c_str(),看看這個原型: const char *c_str(); c_str()函式返回一個指向正規C字串的指標, 內容與本string串相同. 這

KEIL C51dataidataxdatacode詳解

      51微控制器採用哈佛結構。記憶體空間編址有重疊。可以在不同總線上定義不同的變數。在KEIL C51中定義了xdata、idata、xdata、code幾種域修飾符。這些修飾符決定了變數訪問方式。      data:固定指前面0x00-0x7F的128個RAM,可

KEIL MDK的RORW和ZI DATA

一直以來對於ARM體系中所描述的RO,RW和ZI資料存在似是而非的理解,這段時間對其仔細瞭解了一番,發現了一些規律,理解了一些以前書本上有的但是不理解的東西,我想應該有不少人也有和我同樣的困惑,因此將我的一些關於RO,RW和ZI的理解寫出來,希望能對大家有所幫助。 要了解RO,RW和ZI需要首先了解以下知識

c#如何獲取本機MAC地址IP地址硬盤IDCPU序列號等系統信息

finall ipaddress reac 地址 computer mod urn aca rop public class Computer { public static string CpuID; //1.cpu序列號 pub

C#的方法傳參與switchif結構(4)

判斷 1.2 菱形 條件表達式 執行 代碼 輸出 分類 簡易 一、方法傳參的2種方式    1、按值傳遞       傳遞的是值的副本,值會更改但未保留,值最終並未更改     2、按引用傳遞(形參用ref關鍵字修飾)【P86頁】 傳遞的是地址,值會更改且保留,值最終更改

深刻理解:C#的委托事件

java 定義 ret 指定 and net 泛型 pan sub C#中的事件還真是有點繞啊,以前用JavaScript的我,理解起來還真是廢了好大勁!剛開始還真有點想不明白為什麽這麽繞,想想和JS的區別,最後終於恍然大悟! C#中事件繞的根本原因: C#的方法,它不是

c++字符輸入函數getlinecin.getline區分

不能 ng- 設置 alt pos art 結束 out 兩個 1、cin>>s; s能夠是:string s、char s[]; 這個是ostream中的函數。遇到‘ ’(空格) , ‘\n‘(換行),就會自己主動結束,因此假設用cin讀取字符串,那麽這

深入理解C++publicprotected及private用法

strong ostream pro index nbsp contain table bsp 新的 深入理解C++中public、protected及private用法 投稿:shichen2014 字體:[增加 減小] 類型:轉載 時間:2014-08-23 我要評論

C#數組ArrayList和List三者的區別

collect comm 兩個 根據 -s lis 數據打包 功能 target 在C#中數組,ArrayList,List都能夠存儲一組對象,那麽這三者到底有什麽樣的區別呢。 數組 數組在C#中最早出現的。在內存中是連續存儲的,所以它的索引速度非常快,而且賦值

c# 的封裝繼承多態詳解

作用 整體 自己 實現 擴展 封裝 長方形 產生 同名 面向對象有封裝、繼承、多態這三個特性,面向對象編程按照現實世界的特點來管理復雜的事物,把它們抽象為對象,具有自己的狀態和行為,通過對消息的反應來完成任務。這種編程方法提供了非常強大的多樣性,大大增加了代碼的重用機會,增

C/C++,空數組空類類中空數組的解析及其作用

class 不同 理解 返回 free 而且 解析 分配 空類 轉自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我們經常會遇到這些問題: (1)C++中定義一個空類,他們它的大小(sizeof) 為多少

C++publicprotectedprivate的差別

影響 dsm sin 使用 pub 聲明 友元 fff c++ 第一: private,public,protected的訪問範圍: private: 僅僅能由該類中的函數、其友元函數訪問,不能被不論什麽其它訪問。該類的對象也不能訪問. protect

C++值傳遞指針傳遞引用傳遞的總結

地址 變形 不同的 值傳遞 class col 並不會 單向 角度 C++中值傳遞、指針傳遞、引用傳遞的總結 指針傳遞和引用傳遞一般適用於:函數內部修改參數並且希望改動影響調用者。對比值傳遞,指針/引用傳遞可以將改變由形參“傳給”實參(實際上就是直接在實參的內存上修改,

C#(int)Conver.Toint32()int.Parse()三種類型轉換方式的區別與聯系--C#基礎知識

實例 文章 小數位 其他 返回 system roman static logs 自己也是剛學習C#程序設計語言,總結了一點知識點,想分享給大家。畢竟剛學習這門語言,學得不深,哪裏如果有錯誤,請幫個忙指出一下哈,謝謝! 1、(int)可用於單精度、雙精度等其他數值類型的轉

C# CLR via 對象內存堆的存儲【類型對象指針同步塊索引】

一個表 style bsp 同步 spa .net clr 以及 不知道 最近在看書,看到了對象在內存中的存儲方式。 講到了對象存儲在內存堆中,分配的空間除了類型對象的成員所需的內存量,還有額外的成員(類型對象指針、 同步塊索引 ),看到這個我就有點不懂了,不知道類型對象