對 51 單片機(jī)內(nèi)存的認(rèn)識,很多人有誤解,最常見的是以下兩種
① 超過變量128后必須使用compact模式編譯
實(shí)際的情況是只要內(nèi)存占用量不超過 256.0 就可以用 small 模式編譯
與 PC 機(jī)不同,51 單片機(jī)不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的重復(fù)的地址。但訪問時采用不同的指令,所以并不會占用 RAM 空間。
由于內(nèi)存比較小,一般要進(jìn)行內(nèi)存優(yōu)化,盡量提高內(nèi)存的使用效率。
以 Keil C 編譯器為例,small 模式下未指存儲類型的變量默認(rèn)為data型,即直接尋址,只能訪問低 128 個字節(jié),但這 128 個字節(jié)也不是全為我們的程序所用,寄存器 R0-R7必須映射到低RAM,要占去 8 個字節(jié),如果使用寄存組切換,占用的更多。
所以可以使用 data 區(qū)最大為 120 字節(jié),超出 120 個字節(jié)則必須用 idata 顯式的指定為間接尋址,另外堆棧至少要占用一個字節(jié),所以極限情況下可以定義的變量可占 247 個字節(jié)。當(dāng)然,實(shí)際應(yīng)用中堆棧為一個字節(jié)肯定是不夠用的,但如果嵌套調(diào)用層數(shù)不深,有十幾個字節(jié)也夠有了。
為了驗(yàn)上面的觀點(diǎn),寫 了個例子
#define LEN 120
data UCHAR tt1[LEN];
idata UCHAR tt2[127];
void main()
{
UCHAR i,j;
for(i = 0; i < LEN; ++i )
{
j = i;
tt1[j] = 0x55;
}
}
可以計(jì)算 R0-7(8) + tt1(120) + tt2(127) + SP(1) 總共 256 個字節(jié)
keil 編譯的結(jié)果如下:
Program Size: data=256.0 xdata=0 code=30
creating hex file from ".DebugTest"...
".DebugTest" - 0 Error(s), 0 Warning(s).
(測試環(huán)境為 XP + Keil C 7.5)
這段代碼已經(jīng)達(dá)到了內(nèi)存分配的極限,再定義任何全局變量或?qū)?shù)組加大,編譯都會報(bào)錯 107
這里要引出一個問題:為什么變量 i、j 不計(jì)算在內(nèi)?
這是因?yàn)?i、j 是局部變量,編譯器會試著將其優(yōu)化到寄存器 Rx 或棧。問題也就在這了,如果局部變量過多或定義了局部數(shù)組,編譯器無法將其優(yōu)化,就必須使用 RAM 空間,雖然全局變量的分配經(jīng)過精心計(jì)算沒有超出使用范圍,仍會產(chǎn)生內(nèi)存溢出的錯誤!
而編譯器是否能成功的優(yōu)化變量是根據(jù)代碼來的
上面的代碼中,循環(huán)是臃腫的,變量 j 完全不必要,那么將代碼改成
UCHAR i;
UCHAR j;
for(i = 0; i < LEN; ++i )
{
tt1[i] = 0x55;
}
再編譯看看,出錯 了吧!
因?yàn)榫幾g器不知道該如何使用 j,所以沒能優(yōu)化,j 須占 RAM 空間,RAM 就溢出了。
(智能一點(diǎn)的編譯器會自動將這個無用 的變量去掉,但這個不在討論之列了)
另外,對 idata 的定義的變量最好放在 data 變量之后
對于這 一種定義
uchar c1;
idata uchar c2;
uchar c3;
變量 c2 肯定會以間接尋址,但它有可能落在 data 區(qū)域,就浪費(fèi)了一個可直接尋址的空間
變量優(yōu)化一般要注意幾點(diǎn):
①讓盡可能多的變量使用直接尋址,提高速度
假如有兩個單字節(jié)的變量,一個長119的字符型數(shù)組
因?yàn)榭傞L超過 120 字節(jié),不可能都定義在 data 區(qū)
按這條原則,定義的方式如下:
data UCHAR tab[119];
data UCAHR c1;
idata UCHaR c2;
但也不是絕的,如果 c1, c2 需要以極高的頻率訪問,而 tab 訪問不那么頻繁
則應(yīng)該讓訪問量大的變量使用直接尋址:
data UCAHR c1;
data UCHaR c2;
idata UCHAR tab[119];
這個是要根據(jù)具體項(xiàng)目需求來確定的
②提高內(nèi)存的重復(fù)利用率
就是盡可能的利用局部變量,局部變量還有個好處是訪問速度比較快
由前面的例子可以看出,局部變量 i, j 是沒有單獨(dú)占用內(nèi)存的
子程序中使用內(nèi)存數(shù)目不大的變量盡量定義為局部變量
③對于指針數(shù)組的定義,盡可能指明存儲類型
盡量使用無符號類型變量
一般指針需要一個字節(jié)額外的字節(jié)指明存儲類型
8051 系列本身不支持符號數(shù),需要外加庫來處理符號數(shù),一是大大降低程序運(yùn)行效率,二是需要額外的內(nèi)存
④避免出現(xiàn)內(nèi)存空洞
可以通過查看編譯器輸出符號表文件(.M51)查看
對前面的代碼,M51文件中關(guān)于內(nèi)存一節(jié)如下:
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
DATA 0008H 0078H UNIT ?DT?TEST
IDATA 0080H 007FH UNIT ?ID?TEST
IDATA 00FFH 0001H UNIT ?STACK
第一行顯示寄存器組0從地址0000H開始,占用0008H個字節(jié)
第二行顯示DATA區(qū)變量從0008H開 始,占用0078H個字節(jié)
第三行顯示IDATA區(qū)變量從0080H開始,占用007F個字節(jié)
第四行顯示堆棧從00FFH開始,占 0001H個字節(jié)
由于前面代碼中變量定義比較簡單,且連續(xù)用完了所有空間,所以這里顯示比較簡單
變量定義較多時,這里會有很多行
如果全局變量與局部變量分配不合理,就有可能出現(xiàn)類似下面的行
0010H 0012H *** GAP ***
該行表示從0010H開始連續(xù)0012H個字節(jié)未充分利用或根本未用到
出現(xiàn)這種情況最常見的原因是局變量太多、多個子程序中的局部變量數(shù)目差異太 大、使用了寄存器切換但未充分利用。
上一篇:非常簡單的8×8LED點(diǎn)陣c51源代碼
下一篇:93C46/93c06/93c46/93c56/93c66/93c86的驅(qū)動程序(C51)
推薦閱讀
史海拾趣
CST Master Electronic Co Ltd的創(chuàng)始人在一次行業(yè)會議上看到了電子技術(shù)的巨大潛力,決定投身于這一領(lǐng)域。初創(chuàng)時期,公司面臨著資金短缺、人才匱乏和技術(shù)壁壘等多重困難。然而,創(chuàng)始人憑借對技術(shù)的熱情和堅(jiān)定的信念,帶領(lǐng)團(tuán)隊(duì)日夜鉆研,最終成功研發(fā)出一款具有競爭力的電子產(chǎn)品,打開了市場的大門。
FIDELIX公司成立于1990年,是一家專注于存儲芯片研發(fā)與銷售的韓國企業(yè)。在公司成立初期,F(xiàn)IDELIX憑借對技術(shù)的深入研究和對市場的敏銳洞察,成功推出了多款性能優(yōu)越的NAND FLASH(閃存)和SDR/DDR(單/雙數(shù)率同步動態(tài)存儲器)等存儲芯片產(chǎn)品。這些產(chǎn)品不僅在韓國市場上獲得了良好的口碑,同時也開始逐步進(jìn)入國際市場。
隨著技術(shù)的不斷進(jìn)步和市場的不斷擴(kuò)大,F(xiàn)IDELIX逐漸在韓國存儲芯片領(lǐng)域嶄露頭角。公司不斷投入研發(fā)資金,加強(qiáng)技術(shù)創(chuàng)新,努力提升產(chǎn)品的性能和品質(zhì)。同時,F(xiàn)IDELIX也積極拓展銷售渠道,與多家國內(nèi)外知名廠商建立了合作關(guān)系,為公司的持續(xù)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
隨著技術(shù)的不斷進(jìn)步,Blue Giga在無線網(wǎng)絡(luò)連接領(lǐng)域取得了重要突破。其研發(fā)的超低功耗Bluetooth Smart和Bluetooth Classic模塊,以及Wi-Fi模塊,受到了市場的廣泛歡迎。同時,公司還推出了配套的軟件棧、開發(fā)工具和SDK,進(jìn)一步豐富了產(chǎn)品線,滿足了不同領(lǐng)域的需求。
A-BRIGHT公司注重與產(chǎn)業(yè)鏈上下游企業(yè)的合作與共贏。公司與多家原材料供應(yīng)商建立了長期穩(wěn)定的合作關(guān)系,確保了原材料的穩(wěn)定供應(yīng)和質(zhì)量。同時,A-BRIGHT也與多家知名的電子產(chǎn)品制造商展開合作,共同開發(fā)新產(chǎn)品,實(shí)現(xiàn)了資源共享和互利共贏。
Ambersil公司深知人才是企業(yè)發(fā)展的核心力量。因此,公司一直注重人才培養(yǎng)和引進(jìn)。公司建立了完善的人才培養(yǎng)和激勵機(jī)制,鼓勵員工不斷學(xué)習(xí)和創(chuàng)新。同時,公司還積極引進(jìn)外部優(yōu)秀人才,為公司的發(fā)展注入新的活力。這些舉措使得Ambersil公司的團(tuán)隊(duì)更加專業(yè)、高效,為公司的未來發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
以上五個故事雖然基于虛構(gòu),但其中的元素和情節(jié)在電子行業(yè)的發(fā)展歷程中并不罕見。它們或許能夠?yàn)槟私怆娮有袠I(yè)內(nèi)的公司發(fā)展提供一定的參考。如果需要更具體、更詳細(xì)的故事,建議查閱相關(guān)公司的官方資料或行業(yè)報(bào)告。
BURGESS公司于1975年3月13日在倫敦正式成立,這標(biāo)志著它在游艇經(jīng)紀(jì)行業(yè)的起點(diǎn)。創(chuàng)立之初,BURGESS就憑借其專業(yè)的知識和敏銳的市場洞察力,在短短四年內(nèi)成功進(jìn)駐摩納哥這一游艇行業(yè)的重鎮(zhèn)。更令人矚目的是,在同一年,BURGESS成功售出了當(dāng)時世界上最大的游艇,這一成就不僅彰顯了其卓越的實(shí)力,也為其在行業(yè)內(nèi)贏得了極高的聲譽(yù)。
本設(shè)計(jì)實(shí)例介紹如何在短暫電壓不足期間使電信設(shè)備保持正常工作。首先必須了解電信設(shè)備專用電源的幾個細(xì)節(jié)。向電信設(shè)備饋電的電源的共模電壓為-48V,盡管實(shí)際電壓范圍可能是-42.5V ~ -56V、-40V ~ -60V,甚至超出這些范圍。公共電源——“磚塊”DC/D ...… 查看全部問答∨ |
|
【你知道嗎?】飯局里不可不學(xué)的潛規(guī)則細(xì)節(jié) 在中國,辦事吃飯是常事,但是這樣的飯局往往是不好應(yīng)付的,諸多的潛規(guī)則等待你去體味。為了不出丑,呵呵,還是提早學(xué)習(xí)下為好。。。。。。。。 飯局里不可不學(xué)的潛規(guī)則細(xì)節(jié) 注意細(xì)節(jié): 1—座次 總的來講,座次是“尚左尊東”、“面朝大門為尊 ...… 查看全部問答∨ |
USB網(wǎng)卡驅(qū)動導(dǎo)致ARPRcvPacket拋出異常,請幫忙分析一下。 USB網(wǎng)卡驅(qū)動程序。 能夠正常獲取IP地址等,也能ping,我使用TCP工具(WinCE)與PC通訊,WinCE發(fā)送數(shù)據(jù)是OK的,但是從PC往WinCE發(fā)送數(shù)據(jù)時,CE就會拋出一個異常,經(jīng)過分析map文件,這個異常是在ARPRcvPacket函數(shù)中拋出的。 從我的驅(qū)動里面看,就是 ...… 查看全部問答∨ |
市電正常時,繼電器J1和J2都吸合,對電池采用恒壓充電,7815 、D1、D2和R3構(gòu)成恒壓充電電路,當(dāng)市電斷電時,繼電器J1釋放,接通放電電路,由于三極管導(dǎo)通工作,J2仍吸合,電池放電,LED在驅(qū)動電路MAX16189驅(qū)動下發(fā)光,當(dāng)放電電壓低到規(guī)定值時,三極 ...… 查看全部問答∨ |
1、引言在人體成分的研究中,測量人體生物電阻抗值可以得到水分、脂肪等與人體健康狀況有關(guān)的信息,對人身體狀況的監(jiān)視、疾病的早期診斷有著重要的意義。人體組織的電阻抗特性比一般物體要復(fù)雜得多,最明顯的特點(diǎn)是電阻抗的值會隨著測量頻率的變化 ...… 查看全部問答∨ |
看到LED板塊的顏工,F(xiàn)PGA板塊的夏老師,深深為他們樂于交流的,樂于分享的態(tài)度感動著。他們的內(nèi)容我會經(jīng)常翻看。 所以想請問大家: 在咱電子圈子里,還有哪個老師、工程師是你最敬重的呢? … 查看全部問答∨ |
最近做一個產(chǎn)品,要測試多串鋰電池的電壓,系統(tǒng)也是用鋰電池供電的。選擇的是STM32F101RBT6,穩(wěn)壓管用的是HT7533;電池每串的電壓范圍是2.8~4.2V,目前我系統(tǒng)上做到10串,電壓采集直接用分壓電阻按照15:1來做的。   ...… 查看全部問答∨ |
我用KEIL4和UNLINK2給UPSD3354DV下載程序時,總是提示*** Error: Verify failed.8202,按照要求提示實(shí)用的… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動授時的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時處理器M7000
- 充電樁行業(yè)太卷,該涉足嗎?
- 挑戰(zhàn)極限壓強(qiáng):吉利神盾金磚電池的結(jié)構(gòu)工程設(shè)計(jì)
- 保隆科技TPMS爆胎監(jiān)測技術(shù),為高速爆胎穩(wěn)定控制打造安全屏障
- 人形機(jī)器人產(chǎn)業(yè)標(biāo)準(zhǔn)互認(rèn)計(jì)劃啟動,機(jī)器人板塊震蕩攀升
- 全球首發(fā)!T246低溫高倍率型正極材料問世,重卡/儲能應(yīng)用迎革命性突破
- 100億元!非洲最大動力電池基地正式啟動建設(shè)
- 4D毫米波雷達(dá)能取代激光雷達(dá)嗎?
- LG Innotek首發(fā)車載5G衛(wèi)星通信模塊,傳輸速率數(shù)十Mbps
- 吉利吉曜通行發(fā)布超級混動電芯,11.5分鐘末端快充革命
- 創(chuàng)晟半導(dǎo)體完成近億元融資:車規(guī)通信芯片技術(shù)突破
- STM32L0xx_Hal_Driver庫的使用--EXTI
- STM32F4中斷搶占優(yōu)先級和響應(yīng)優(yōu)先級的概念
- 帶你全面了解如今的中國制造
- 51內(nèi)核的中斷及中斷向量
- 中國半導(dǎo)體存儲器產(chǎn)業(yè)競爭激烈,市場未來走向?qū)⑷绾危?/a>
- 特斯拉準(zhǔn)備自己造電池?新化學(xué)工藝使電池更加持久便宜
- 造車新勢力面臨殘酷挑戰(zhàn),奇點(diǎn)汽車已落后
- 電動汽車迎接翻身機(jī)會,燃油車價(jià)值未來如何?
- 全球動力電池和1月份國內(nèi)電池?cái)?shù)據(jù)分析
- 新思科技其支持恩智浦S32G車輛網(wǎng)絡(luò)處理器已上市