| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
XBYTE[0x30000]=0x00;會(huì)出錯(cuò)么? | 
  
| 作者:zoupeng139 欄目:單片機(jī) | 
XBYTE[0x30000]=0x00;會(huì)出錯(cuò)么?往大于64K的數(shù)據(jù)存儲(chǔ)器寫(xiě)東西 其實(shí)我的分頁(yè)已經(jīng)由其他程序執(zhí)行好,現(xiàn)在的希望實(shí)現(xiàn)的功能就是在當(dāng)前頁(yè)(03頁(yè))下,寫(xiě)到當(dāng)前頁(yè)的0x0000地址內(nèi),不知道這樣寫(xiě)合適不合適?  | 
  
| 2樓: | >>參與討論 | 
| 作者: xwj 于 2006/10/25 20:04:00 發(fā)布:
         當(dāng)然是: 錯(cuò)!  | 
  |
| 3樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/25 20:25:00 發(fā)布:
         對(duì)于keil c51來(lái)說(shuō),是不會(huì)錯(cuò)的。  | 
  |
| 4樓: | >>參與討論 | 
| 作者: 80572892 于 2006/10/25 20:34:00 發(fā)布:
         會(huì)錯(cuò)吧 0X30000已經(jīng)大于64K了啊,XBYTE對(duì)KEIL來(lái)說(shuō)其實(shí)編譯出來(lái)是MOVX,你把0X30000送到DPTR中程序會(huì)把高位截?cái),你送的?X30000可是匯編代碼是 C:0x000F 900000 MOV DPTR,#0x0000 C:0x0012 E4 CLR A C:0x0013 F0 MOVX @DPTR,A 這樣會(huì)寫(xiě)進(jìn)0x0000中, 如果你把0X30000換成0X40000 結(jié)果是一樣的。 我是這樣認(rèn)為的,如果不對(duì)請(qǐng)指點(diǎn)。  | 
  |
| 5樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/25 20:55:00 發(fā)布:
         呵呵,其實(shí)樓主要的就是這個(gè)功能:寫(xiě)到地址0去。  | 
  |
| 6樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/25 22:18:00 發(fā)布:
         對(duì)阿,呵呵 0X30000已經(jīng)大于64K了啊,XBYTE對(duì)KEIL來(lái)說(shuō)其實(shí)編譯出來(lái)是MOVX,你把0X30000送到DPTR中程序會(huì)把高位截?cái),你送的?X30000可是匯編代碼是 C:0x000F 900000 MOV DPTR,#0x0000 C:0x0012 E4 CLR A C:0x0013 F0 MOVX @DPTR,A 這樣會(huì)寫(xiě)進(jìn)0x0000中, 如果你把0X30000換成0X40000 結(jié)果是一樣的。 我是這樣認(rèn)為的,如果不對(duì)請(qǐng)指點(diǎn)。 要是就是這樣的就太好了!請(qǐng)大蝦們?cè)賻兔Υ_定一下! 可是我的程序怎么會(huì)出現(xiàn)這種問(wèn)題: else { XBYTE[Current_Address]=AddH; Current_Address++; M512CS=1; M512ADDH++; CS138=1; M512Latch=M512ADDH; CS138=0; _nop_(); M512CS=0; _nop_(); XBYTE[Current_Address]=AddL;//1 此時(shí)Current_Address為0x30000 Current_Address++; M512CS=1; } } else { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; //2 Current_Address++; M512CS=1; 程序執(zhí)行過(guò)程中直接由1跳到了2 不知道為什么?  | 
  |
| 7樓: | >>參與討論 | 
| 作者: zgl7903 于 2006/10/25 22:40:00 發(fā)布:
         回復(fù)主題:[0x30000]=0x00;會(huì)出錯(cuò)么? XBYTE支持到64K空間,超過(guò)的當(dāng)然是被截去了 如果訪問(wèn)大于64K的空間,keil推薦是分頁(yè),32K空間為一頁(yè),使用far修飾符,使用A15線區(qū)分XDATA和HDATA空間,詳細(xì)的看keil的幫助.  | 
  |
| 8樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/25 23:05:00 發(fā)布:
         也許編譯器認(rèn)為這兩段代碼一樣的,所以就優(yōu)化掉了  * - 本貼最后修改時(shí)間:2006-10-26 10:43:34 修改者:computer00  | 
  |
| 9樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/26 13:33:00 發(fā)布:
         可是 我 得 程序 出錯(cuò) 得 原因是什么 呢 ? ?  | 
  |
| 10樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/26 14:02:00 發(fā)布:
         哪里錯(cuò)了啊?  | 
  |
| 11樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/27 15:26:00 發(fā)布:
         錯(cuò)誤如下,執(zhí)行結(jié)果倒是對(duì)的,但過(guò)程不對(duì)勁 else { XBYTE[Current_Address]=AddH; Current_Address++; M512CS=1; M512ADDH++; CS138=1; M512Latch=M512ADDH; CS138=0; _nop_(); M512CS=0; _nop_(); XBYTE[Current_Address]=AddL;//1 此時(shí)Current_Address為0x30000 Current_Address++; M512CS=1; } } else { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; //2 Current_Address++; M512CS=1; 程序執(zhí)行過(guò)程中直接由1處直接跳到了2處執(zhí)行 不知道為什么?  | 
  |
| 12樓: | >>參與討論 | 
| 作者: wnch 于 2006/10/28 5:04:00 發(fā)布:
         編譯器把相同的C代碼優(yōu)化了,只編譯成一組匯編代碼, 當(dāng)要執(zhí)行相同的C操作時(shí),在匯編里會(huì)直接跳轉(zhuǎn)到那組匯編代碼處,所以執(zhí)行的結(jié)果應(yīng)該是對(duì)的。而在C里面看時(shí),只會(huì)是相同操作C代碼的最后一組。所以看起來(lái)好像過(guò)程不對(duì)的感覺(jué)。調(diào)試時(shí)看一下匯編代碼就明白了。  | 
  |
| 13樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/28 8:38:00 發(fā)布:
         樓上正解. else { XBYTE[Current_Address]=AddH; Current_Address++; M512CS=1; M512ADDH++; CS138=1; M512Latch=M512ADDH; CS138=0; _nop_(); M512CS=0; _nop_(); XBYTE[Current_Address]=AddL;//1 此時(shí)Current_Address為0x30000 Current_Address++; M512CS=1; } } else { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; //2 Current_Address++; M512CS=1; 你看紅色代碼跟蘭色代碼不是完全一樣么?既然一樣,那運(yùn)行上面的跟運(yùn)行下面的有什么區(qū)別么? 既然沒(méi)啥區(qū)別,哪又何必編譯出兩段完全一樣的代碼,浪費(fèi)ROM? 并且偶還可以推測(cè)出,你這個(gè)else語(yǔ)句就到這里結(jié)束了,即下面就是一個(gè)}. 你自己跟著代碼走一遍,想想看這樣優(yōu)化后結(jié)果還對(duì)否.  * - 本貼最后修改時(shí)間:2006-10-28 8:39:17 修改者:computer00  | 
  |
| 14樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/28 13:03:00 發(fā)布:
         大家誤會(huì)了,原來(lái)那個(gè)程序我只截取一部分,下面是全的 if(((Current_Address&0xF0000)!=7)&&((0xFFFF-(Current_Address&0xFFFF))<2)) //未到存儲(chǔ)器極限或不夠存儲(chǔ)一次數(shù)據(jù) { if((Current_Address&0xFFFF)==0xFFFE) { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; Current_Address++; M512CS=1; M512ADDH++; //最高位地址加一 CS138=1; M512Latch=M512ADDH; CS138=0; _nop_(); } else { XBYTE[Current_Address]=AddH; Current_Address++; M512CS=1; M512ADDH++; CS138=1; M512Latch=M512ADDH; CS138=0; _nop_(); M512CS=0; _nop_(); XBYTE[Current_Address]=AddL; Current_Address++; M512CS=1; } } else { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; Current_Address++; M512CS=1; } }  | 
  |
| 15樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/29 10:49:00 發(fā)布:
         up up  | 
  |
| 16樓: | >>參與討論 | 
| 作者: computer00 于 2006/10/30 9:34:00 發(fā)布:
         暈暈暈。。。樓主還沒(méi)想明白?? _nop_(); //假設(shè)程序運(yùn)行到這里了,本來(lái)應(yīng)該往下 運(yùn)行的,即要執(zhí)行11那一句,對(duì)吧? //11那句跟21那句是否完全一樣呢?我想除了注釋不一樣之外,其它的好象都一樣吧? //那既然是一模一樣的,不管是執(zhí)行11還是執(zhí)行12,結(jié)果都一樣吧? //同理,下面的12跟22,13跟23都是一樣的,并且最后的結(jié)果都是去執(zhí)行31。 //按你的理解,應(yīng)該是執(zhí)行11→12→13→31才對(duì),但現(xiàn)在執(zhí)行的是 //21→22→23→31,你比較一下,這兩個(gè)執(zhí)行過(guò)程,所執(zhí)行的代碼不是 //完全相同么?所以編譯器就給你做了優(yōu)化,將前面那段11→12→13給刪掉了, //用了后面的21→22→23來(lái)代替!這樣就節(jié)省了空間,運(yùn)行結(jié)果又不會(huì)出錯(cuò)。 //因此你在調(diào)試的時(shí)候,就看不到前面的代碼了(實(shí)際上它已經(jīng)不存在了,被編譯器給刪除了, //并且插入了一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到下面去了。) //前面已經(jīng)說(shuō)過(guò)很多次了,請(qǐng)仔細(xì)比較11→12→13和21→22→23三條語(yǔ)句,它們是完全一樣的。 XBYTE[Current_Address]=AddL; //11 Current_Address++; //12 M512CS=1; //13 } } else { XBYTE[Current_Address]=AddH; Current_Address++; XBYTE[Current_Address]=AddL; //21 Current_Address++; //22 M512CS=1; //23 } //31  | 
  |
| 17樓: | >>參與討論 | 
| 作者: zoupeng139 于 2006/10/30 11:02:00 發(fā)布:
         恩 ,謝謝 我再好好理解一下 要是編譯優(yōu)化的 結(jié)果就成了 呵呵,我是怕程序有什么錯(cuò)誤  | 
  |
| 18樓: | >>參與討論 | 
| 作者: jkljl 于 2008/4/16 15:38:03 發(fā)布:
         我用keil c51編譯C語(yǔ)言程序使用XBYTE命令怎么會(huì)出現(xiàn)未定義的錯(cuò)誤? 出現(xiàn) 'XBYTE' : undefined identifier 的錯(cuò)誤!  | 
  |
| 19樓: | >>參與討論 | 
| 作者: 好好看 于 2009/8/12 10:57:07 發(fā)布:
         0x30000 這里的‘3’只是類型編號(hào),從0到5好像都有固定的類型 3好像是byte,4代表code 你的0x30000實(shí)際上等于0x0000  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào)  |