1. 程式人生 > >keil c51中的data idata xdata code詳解

keil c51中的data idata xdata code詳解

51微控制器採用哈佛結構。記憶體空間編址有重疊。可以在不同匯流排(本文稱其為匯流排域,簡稱域)上定義不同的變數。在keilc51中定義了data idata xdata code幾種域修飾符。這些修飾符決定了變數訪問方式。
data:用mov直接訪問的內部RAM
idata:用mov @間接訪問的內部RAM
xdata:用movx訪問的外部RAM
code:用movc訪問的rom

這些假定以上以及型別為where。資料型別為type。

乾貨:
變數(包括指標)預設儲存在data中。指標能夠智慧的指向所有的域。
指定變數(包括指標)在某個域時,域修飾符寫在變數型別後面。type where value,type* where point。
想讓指標只能指向某個域type where* point
指定指標的域並指定指標本身的儲存域 type where* where point
const寫在前面const type where* where point
宣告struct型別不用where。定義變數時候用。struct變數不能跨域。


以下是乾貨來源
一下是實驗結果
type value :data中的變數
where type value :where中的變數
type where value :where中的變數
where type where value 是的,沒錯,這種神經病寫法也是在where中的變數
type * point data中的跨域指標,
where type * point 儲存在where中的跨域指標
type * where point 儲存在where中的跨域指標
where type * where point 這種更神經病的寫法也是儲存在where中的跨域指標
type where* point 儲存在內部RAM中只能指向where的指標
where type where* point 儲存在where中指向where的指標
type where* where point 儲存在where中指向where的指標

很亂是吧?我們整理一下


聰明的同學已經發現規律了,是不是?
作為c不得不提的一種變數——指標。keil c51中還存在一個指標,這個指標實際上是sizeof(type*) + 1的。有一個位元組來儲存指標指向的區域。訪問*point時對於不同區域的資料使用不同的指令。也就是說這中指標可以訪問所有的匯流排。暫且稱其跨域指標。

既然指標也是變數“指向什麼東西”是指標變數的型別。那麼互忽略型別,把這些寫法調換順序。

發現規律了麼?data,idata,xdata,code可以在型別前,也可以在型別之後,或者前後都有。
定義變數時,c型別最前面最著最後面新增(或者前後都有)匯流排域修飾符,可以決定該變數儲存的位置。前後都不加,預設是
data。
我們在單獨關心一下指標。

發現規律了麼?type *是可以指向任何區域的指標。決定指標指向位置時候域修飾符必須在type和*之間。
至於const struct,呵呵自己試試就知道了。

相關推薦

keil c51data idata xdata code

51微控制器採用哈佛結構。記憶體空間編址有重疊。可以在不同匯流排(本文稱其為匯流排域,簡稱域)上定義不同的變數。在keilc51中定義了data idata xdata code幾種域修飾符。這些修飾符決定了變數訪問方式。 data:用mov直接訪問的內部RAM idata

C51 keildata,idata,xdata,pdata,code

從資料儲存型別來說,8051系列有片內、片外程式儲存器,片內、片外資料儲存器,片內程式儲存器還分直接定址區和間接定址型別,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata型別,使用不同的儲存器,將使程式執行效率不同,在編寫C51程式時,

在51系列data,idata,xdata,pdata的區別

         從資料儲存型別來說,8051系列有片內、片外程式儲存器,片內、片外資料儲存器,片內程式儲存器還分直接定址區和間接定址型別,分別對應code、data、xdata、idata以及根據51系列特點而設定的p

KEIL C51dataidataxdatacode

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

關於keil單片機編程data,idata,xdata,pdata,code數據類型

賦值語句 很多 全局 一個 速度 根據 ans 告訴 常數 從數據存儲類型來說,8051系列有片內、片外程序存儲器,片內、片外數據存儲器,片內程序存儲器還分直接尋址區和間接尋址類型,分別對應code、data、xdata、idata以及根據51系列特點而設定的pdata類型

【轉】淺談C51記憶體優化(data idata xdata

對 51 微控制器記憶體的認識,很多人有誤解,最常見的是以下兩種① 超過變數128後必須使用compact模式編譯   實際的情況是隻要記憶體佔用量不超過 256.0 就可以用 small 模式編譯② 128以上的某些地址為特殊暫存器使用,不能給程式用   與 PC 機

DATA/IDATA/XDATA 區別

class lis aid baidu 建議 .html con nbsp .com 轉載自:http://jingyan.baidu.com/article/c843ea0b80c56e77931e4a2a.html DATA: 固定指前面0x00-0x7F

Keil C51 使用Printf()進行串列埠輸出。

       如何使用printf在串列埠顯示資訊,有兩種辦法,因為在keil C51中 printf函式是呼叫putchar進行資料傳送的,而putchar應該是先判斷TI是否為1,不為1則等待為1。 如果為1則清0,然後送出一個字元。因此如果你直

requests.post()方法data、json引數

json和dict python中的dict型別要轉換為json格式的資料需要用到json庫: import json   <json> = json.dumps(<dict>) <dict> = json.loads(<json&

51微控制器data,idata,xdata,pdata的區別

在51系列微控制器中data,idata,xdata,pdata的區別: data:固定指前面0x00-0x7F的128byte的RAM,可以用ACC直接讀寫的,速度最快,生成的程式碼也最小。 idata:固定指前面0x00-0xFF的256byte的RAM,其中前12

[Keil-C51]在Keil C51使用sizeof()的一點問題記錄

   問題描述:利用51核的微控制器程式設計時,有時需要確切知道某個數值的位元組數大小(如AD採集時採集到的AD值會存放在n位的數值),除了查詢KeilC51的手冊進行驗證,另一種就是直接用sizeof()檢視。    sizeof():關於sizeof()的介紹網上有很多詳細的資料,這是一個操作符,所以使用

Visual StudioC#新增引用圖文(using MySql.Data.MySqlClient;無法使用)

使用C#連線MySQL時,遇到名稱空間using MySql.Data.MySqlClient;無法使用。這是因為VS中沒有新增此引用,解決方法如下:(1)下載MySQL.Data.dll,(https

keil c51的一些關鍵字的用法

_at_代表絕對地址的意思: struct link list idata _at_ 0x40; /* 定義位於內部RAM低128位元組區0x40地址處的 結構體 */ char xdata text[256] _at_ 0xE000; /* 定義位於外部

keil C51使用sprintf問題

unsigned char count = 12; UartInit(); TI = 1; sprintf(pstr,"%d",count); printf("%s\n",pstr);如上將count定為unsigned char 型變數使用printf函式輸出時,會出現錯誤

慎用Keil C51的using 關鍵字

今天除錯程式時發現程式一直表現很怪異,查了好久都沒發現問題,結果把一箇中斷程式定義處的 using 3 去掉,就全好了,看來using 3還是慎用為妙啊,否則自己得認真分析然後去分配暫存器組,這也太累了,否則編譯完的程式不定是什麼結果呢。

Javascript的apply與call

選項 this 模式 div sun fun object 面向 傳遞     JavaScript中有一個call和apply方法,其作用基本相同,但也有略微的區別。  一、方法定義   1、call 方法   語法:call([thisObj[,arg1[, arg2[

JQuery$.ajax()方法參數(轉載)

瀏覽器 object 服務器 字符串 false type: 要求為String類型的參數,請求方式(post或get)默認為get。註意其他http請求方法,例如put和 delete也可以使用,但僅部分瀏覽器支持。timeout: 要求為Number類型的參數,設置請求超時時

JavaScript數組對象

稀疏數組 nsh isa 學習過程 bnf value 明顯 global sci Array對象即數組對象用於在單個變量中存儲多個值,JS的數組是弱類型的,所以允許數組中含有不同類型的元素,數組元素甚至可以是對象或者其他數組。 創建數組的語法 1、Array構造器 1

react native textInput的value屬性

hold eric 工作 als size 保持 chang 無奈 bsp TextInput用法就不多講了,主要記錄下遇到的一個怪問題。 背景:項目需要開發一個充值頁面,需要一個輸入框,然後幾個按鈕,輸入框是允許用戶自己輸入任意金額,按鈕是可以讓用戶快捷選擇金

TP5關聯模型的使用

php 關聯模型 tp5 首先是model裏,舉個例子,user.php<?phpnamespace app\rbac\model;use think\Model;class User extends Model{ public function roleusers() {