女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]對 51 單片機內(nèi)存的認識,很多人有誤解,最常見的是以下兩種:① 超過變量128后必須使用compact模式編譯實際的情況是只要內(nèi)存占用量不超過 256.0 就可以用 small 模式編譯② 128以上的某些地址為特殊寄存器使用,不能

對 51 單片機內(nèi)存的認識,很多人有誤解,最常見的是以下兩種:

① 超過變量128后必須使用compact模式編譯

實際的情況是只要內(nèi)存占用量不超過 256.0 就可以用 small 模式編譯

② 128以上的某些地址為特殊寄存器使用,不能給程序用

與 PC 機不同,51 單片機不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的重復(fù)的地址。但訪問時采用不同的指令,所以并不會占用 RAM 空間。

由于內(nèi)存比較小,一般要進行內(nèi)存優(yōu)化,盡量提高內(nèi)存的使用效率。

以 Keil C 編譯器為例,small 模式下未指存儲類型的變量默認為data型,即直接尋址,只能訪問低 128 個字節(jié),但這 128 個字節(jié)也不是全為我們的程序所用,寄存器 R0-R7必須映射到低RAM,要占去 8 個字節(jié),如果使用寄存組切換,占用的更多。

所以可以使用 data 區(qū)最大為 120 字節(jié),超出 120 個字節(jié)則必須用 idata 顯式的指定為間接尋址,另外堆棧至少要占用一個字節(jié),所以極限情況下可以定義的變量可占 247 個字節(jié)。當然,實際應(yīng)用中堆棧為一個字節(jié)肯定是不夠用的,但如果嵌套調(diào)用層數(shù)不深,有十幾個字節(jié)也夠有了。

為了驗上面的觀點,寫了個例子

#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;

}

}

可以計算 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 "./Debug/Test"...

"./Debug/Test" - 0 Error(s), 0 Warning(s).

(測試環(huán)境為 XP + Keil C 7.5)

這段代碼已經(jīng)達到了內(nèi)存分配的極限,再定義任何全局變量或?qū)?shù)組加大,編譯都會報錯 107

這里要引出一個問題:為什么變量 i、j 不計算在內(nèi)?

這是因為 i、j 是局部變量,編譯器會試著將其優(yōu)化到寄存器 Rx 或棧。問題也就在這了,如果局部變量過多或定義了局部數(shù)組,編譯器無法將其優(yōu)化,就必須使用 RAM 空間,雖然全局變量的分配經(jīng)過精心計算沒有超出使用范圍,仍會產(chǎn)生內(nèi)存溢出的錯誤!

而編譯器是否能成功的優(yōu)化變量是根據(jù)代碼來的

上面的代碼中,循環(huán)是臃腫的,變量 j 完全不必要,那么將代碼改成

UCHAR i;

UCHAR j;

for(i = 0; i < LEN; ++i )

{

tt1[i] = 0x55;

}

再編譯看看,出錯了吧!

因為編譯器不知道該如何使用 j,所以沒能優(yōu)化,j 須占 RAM 空間,RAM 就溢出了。

(智能一點的編譯器會自動將這個無用的變量去掉,但這個不在討論之列了)

另外,對 idata 的定義的變量最好放在 data 變量之后

對于這一種定義

uchar c1;

idata uchar c2;

uchar c3;

變量 c2 肯定會以間接尋址,但它有可能落在 data 區(qū)域,就浪費了一個可直接尋址的空間

變量優(yōu)化一般要注意幾點:

①讓盡可能多的變量使用直接尋址,提高速度

假如有兩個單字節(jié)的變量,一個長119的字符型數(shù)組

因為總長超過 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ù)具體項目需求來確定的

②提高內(nèi)存的重復(fù)利用率

就是盡可能的利用局部變量,局部變量還有個好處是訪問速度比較快

由前面的例子可以看出,局部變量 i, j 是沒有單獨占用內(nèi)存的

子程序中使用內(nèi)存數(shù)目不大的變量盡量定義為局部變量

③對于指針數(shù)組的定義,盡可能指明存儲類型

盡量使用無符號類型變量

一般指針需要一個字節(jié)額外的字節(jié)指明存儲類型

8051 系列本身不支持符號數(shù),需要外加庫來處理符號數(shù),一是大大降低程序運行效率,二是需要額外的內(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ù)目差異太大、使用了寄存器切換但未充分利用。

擴展閱讀:EEPROM的幾種保護方法

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在C語言編程中,結(jié)構(gòu)體內(nèi)存對齊是一個容易被忽視卻影響深遠的關(guān)鍵問題。它不僅關(guān)乎程序性能,更直接影響到內(nèi)存占用效率,尤其在嵌入式系統(tǒng)等資源受限環(huán)境中顯得尤為重要。本文將深入探討結(jié)構(gòu)體內(nèi)存對齊的原理,并分享手動調(diào)整與編譯器優(yōu)...

關(guān)鍵字: C語言 內(nèi)存對齊 編譯器

編譯器不僅是連接硬件與軟件的橋梁,還直接影響MCU的性能優(yōu)化與功能安全。面對汽車行業(yè)對高可靠性、低功耗和高算力的需求,編譯器需在確保ASIL-D等嚴格標準的同時,最大化發(fā)揮RISC-V芯片的潛力。

關(guān)鍵字: 車規(guī)MCU RISC-V 編譯器 HighTec

國內(nèi)電子信息產(chǎn)業(yè)內(nèi)的廠商正在全球嵌入式系統(tǒng)的發(fā)展浪潮中扮演著越來越重要的角色,但隨之而來的是國內(nèi)嵌入式系統(tǒng)和相關(guān)芯片企業(yè)在出海時也面臨越來越多的合規(guī)要求,尤其是在保障用戶、設(shè)備和周邊人與物安全的功能安全領(lǐng)域內(nèi)的合規(guī)要求。...

關(guān)鍵字: 嵌入式系統(tǒng) 智能網(wǎng)聯(lián) 編譯器

采用51單片機最小開發(fā)板,由8位自制獨立按鍵控制。單片機芯片為STC89C52RC,晶振為@12.000 mhz。8X8LED點陣屏模塊由MAX7219驅(qū)動,MAX7219包含一個自動掃描電路。你只需要把要顯示的數(shù)據(jù)發(fā)送...

關(guān)鍵字: 51單片機 MAX7219 寄存器

【2025年4月11日, 德國慕尼黑訊】全球功率系統(tǒng)和物聯(lián)網(wǎng)領(lǐng)域的半導(dǎo)體領(lǐng)導(dǎo)者英飛凌科技股份公司(FSE代碼:IFX / OTCQX代碼:IFNNY)推出用于AURIX?、TRAVEO?和PSOC?的可擴展軟件包產(chǎn)品組合...

關(guān)鍵字: PSOC 物聯(lián)網(wǎng) 編譯器

瑞典烏普薩拉,2025年3月11日 — 全球領(lǐng)先的嵌入式系統(tǒng)開發(fā)軟件解決方案供應(yīng)商IAR在德國紐倫堡舉辦的embedded world 2025展會上重磅發(fā)布全新云端平臺。該平臺為嵌入式軟件開發(fā)人員提供前所未有的自由度與...

關(guān)鍵字: 編譯器 嵌入式 RISC-V

該統(tǒng)一解決方案為Microchip編譯器產(chǎn)品線提供靈活且經(jīng)濟高效的許可選項

關(guān)鍵字: 編譯器 嵌入式

當安全標準相互契合:意法半導(dǎo)體 (ST) Stellar MCU取得了風(fēng)險管理安全標準等級最高的ISO 26262 ASIL D 級認證,現(xiàn)在更有達到同等安全級別的 HighTec Rust 編譯器的加持

關(guān)鍵字: 微控制器 編譯器

在嵌入式系統(tǒng)的開發(fā)中,內(nèi)存資源的有限性常常成為設(shè)計者和開發(fā)者面臨的主要挑戰(zhàn)。特別是在那些對成本、功耗和尺寸有著嚴格要求的應(yīng)用中,如何在有限的內(nèi)存空間內(nèi)實現(xiàn)高效、可靠的代碼運行,成為了嵌入式系統(tǒng)開發(fā)中的核心問題。本文將深入...

關(guān)鍵字: 嵌入式系統(tǒng) 內(nèi)存優(yōu)化

在嵌入式系統(tǒng)開發(fā)的廣闊領(lǐng)域,51單片機和STM32無疑是兩種極具代表性的微控制器。對于初學(xué)者而言,選擇學(xué)習(xí)路徑時往往會面臨一個抉擇:是直接跨越51單片機,挑戰(zhàn)更高層次的STM32,還是從51開始,逐步進階?本文旨在探討直...

關(guān)鍵字: 51單片機 STM32
關(guān)閉