音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

用C51操作片內(nèi)擴展RAM——很多工程師都遇到過的“怪現(xiàn)象”

作者:LPC900 欄目:單片機
用C51操作片內(nèi)擴展RAM——很多工程師都遇到過的“怪現(xiàn)象”
    標(biāo)準(zhǔn)80C51、52內(nèi)核的單片機片內(nèi)最多只有256字節(jié)的RAM,少得可憐,很多情況下會出現(xiàn)不夠用的問題。如果在片外擴展RAM,則會增加成本,并可能減少多達18條I/O口線,F(xiàn)在許多新型8051內(nèi)核的單片機為了解決上述問題,會在片內(nèi)另外擴展有一定容量的RAM,一般安排在XDATA地址空間。PHILIPS半導(dǎo)體的p89c668更是在片內(nèi)擴展有8KB的XRAM,與其它型號相比,堪稱“海量”。為了保持與標(biāo)準(zhǔn)80C51的兼容性,一般這些擴展的片內(nèi)RAM在復(fù)位時默認(rèn)是無效的,如果要使用,則需要先修改相關(guān)SFR寄存器里的使能位(但也有少數(shù)型號的規(guī)定與此恰恰相反,復(fù)位時默認(rèn)是有效的,如果片外已經(jīng)擴展有XRAM,則地址重疊的部分會被自動屏蔽掉)。
    如果使用匯編語言編程,在程序一開始,可以立即使能片內(nèi)擴展RAM,以后用MOVX指令就能方便地訪問。如果用C51編程,許多用戶很自然地也在main()函數(shù)的一開始就使能片內(nèi)擴展RAM。然而在調(diào)試程序時總是出現(xiàn)意外情況,仔細(xì)排查后,“確認(rèn)”是片內(nèi)外部RAM有問題,通常表現(xiàn)為數(shù)據(jù)沒有被初始化。部分客戶還會去找供應(yīng)商算帳,稱芯片質(zhì)量存在嚴(yán)重問題,等等?梢哉f,這是我們許多單片機工程師都曾經(jīng)遇到過的問題。
    總之,你用C51編程并打算使用片內(nèi)擴展的RAM,那么就很容易出現(xiàn)上述怪現(xiàn)象。是芯片有問題嗎?不是!同樣功能的程序如果換作匯編來寫,就跑通了,這就證明芯片還是好的——找供應(yīng)商算帳無理!是C51編譯器有問題嗎?更不是!C51編譯器是經(jīng)過多年千錘百煉才發(fā)展到今天“完善”的程度,想找出并證實一個bug還真不容易。“是我的程序錯了嗎?程序很小,僅10幾行,專門測試片內(nèi)擴展RAM用的,已經(jīng)過反復(fù)核查,怎么會出錯呢?”——很多工程師對我這樣講,但我還是要告訴他:確實是程序有問題!
    我們先不提程序錯在何處,因為部分工程師性子太急,我先給出解決方案,行不行,先試試看:請刪除main()函數(shù)里使能片內(nèi)擴展RAM的語句;重新建立工程,選擇器件后,Keil C51會提示是否復(fù)制并添加startup code到工程里,此時一定要選擇“是”;將你的相關(guān)C源程序添加進工程;打開剛才添加的Startup.A51文件,找到標(biāo)號“STARTUP1:”,緊接其后添加使能片內(nèi)擴展RAM的匯編指令;重新編譯工程并調(diào)試。OK,問題解決了嗎?
    咦——這是為什么?原因是這樣的:如果你用到了片內(nèi)擴展RAM,定義有xdata屬性的全局變量(或在main()函數(shù)的開頭定義有),而且定義的同時賦有初值,那么變量的初始化操作實際上在進入main()函數(shù)之前(或剛進入main函數(shù)時,不可控)就已經(jīng)完成了。因此在main()函數(shù)里,第一條可執(zhí)行語句就安排為使能片內(nèi)擴展RAM的操作已是來不及!這就是C51編譯器的特性,同時也是其它C編譯器所共有的、ANSI C所要求的。文件Startup.A51是啟動代碼部分,里面包含有初始化全局變量的操作。新建工程時,如果不添加此文件,則在編譯時系統(tǒng)也會自動插入安裝目錄中的那個Startup.A51文件。如果在main()函數(shù)里的開頭定義有xdata屬性的變量并賦初值,則執(zhí)行時剛一進入main()該變量就被初始化,然后才輪到正常的可執(zhí)行語句。現(xiàn)在知道在main()中添加使能片內(nèi)擴展RAM的操作語句為什么不行了嗎?


* - 本貼最后修改時間:2006-2-7 16:18:46 修改者:LPC900

2樓: >>參與討論
LPC900
一句話概括:在使能片內(nèi)擴展RAM之前對XRAM進行的任何操作都無效
因此,相關(guān)使能片內(nèi)擴展RAM的指令必須位于全局變量初始化操作之前。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
關(guān)于RS485的問題
問一下誰有此IC單片機控制的資料
單片機或嵌入式系統(tǒng)的開發(fā)規(guī)范化問題(ZZ)
關(guān)于芯片封裝,誰能說出道理來嗎?
用8954芯片時頭文件用reg52.h可以嗎?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號