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

當前位置:首頁 > 單片機 > 單片機
[導讀]看到這篇C51的內(nèi)存分配和優(yōu)化的文章,個人覺得分析的十分到位,在這里轉(zhuǎn)給大家C51的內(nèi)存分配不同于一般的PC,內(nèi)存空間有限,采用覆蓋和共享技術(shù)。在Keil編譯器中,經(jīng)過編譯后,會形成一個M51文件,在其內(nèi)部可以詳細的

看到這篇C51的內(nèi)存分配和優(yōu)化的文章,個人覺得分析的十分到位,在這里轉(zhuǎn)給大家

C51的內(nèi)存分配不同于一般的PC,內(nèi)存空間有限,采用覆蓋和共享技術(shù)。在Keil編譯器中,經(jīng)過編譯后,會形成一個M51文件,在其內(nèi)部可以詳細的看到內(nèi)存的分配情況。

C51內(nèi)存常見的兩個誤區(qū):

(1) 變量超過128字節(jié)后必須用COMPACT模式。

其實,只要不超過256字節(jié),都可以用SMALL模式

(2) 內(nèi)部RAM,128字節(jié)以上的是SFR用,不給程序用。

其實,由于C51尋址的不同,高128字節(jié)也可以用來存儲變量,雖與SFR地址相同,但尋址的方式不同。

下面通過幾個程序來看內(nèi)存的分配。

*******************************************************************************

//程序1:

#include

void main()

{}

Program Size: data=9.0 xdata=0 code=16

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOLUTE "REG BANK 0"

IDATA 0008H 0001H UNIT ?STACK

*******************************************************************************

從上面可以看到,即使程序內(nèi)部無任何變量和函數(shù)data也會為9.0。這9個字節(jié)內(nèi)存分別為R0-R8和一個堆棧指針(C51的堆棧是“grow up”,即使堆棧中沒有內(nèi)容,也會有一個棧底指針)。data區(qū)中由于R0-R8占有8個存儲空間,因此data區(qū)最大為120字節(jié)(棧在所有的變量空間 之后),如果超過120個字節(jié)則由idata顯式的指定為間接尋址。對于整個內(nèi)部256字節(jié)的RAM,在極端的情況下,最大的變量為247字節(jié)。

當定義全局變量時

*******************************************************************************

//程序2:

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

void main()

{}

Program Size: data=12.0 xdata=0 code=16

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOLUTE "REG BANK 0"

DATA 0008H 0003H UNIT ?DT?MAIN

IDATA 000BH 0001H UNIT ?STACK

* * * * * * * C O D E M E M O R Y * * * * * * *

CODE 0000H 0003H ABSOLUTE

CODE 0003H 000CH UNIT ?C_C51STARTUP

CODE 000FH 0001H UNIT ?PR?MAIN?MAIN

*******************************************************************************

存在全局變量時,根據(jù)全局變量的類型分配相應的存儲空間。

看下面的程序

*****************************************************************

//程序3:

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

uint sum(uint c)

{

uint d;

d = c;

return d;

}

void main()

{}

Program Size: data=12.0 xdata=0 code=17

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOLUTE "REG BANK 0"

DATA 0008H 0003H UNIT ?DT?MAIN

IDATA 000BH 0001H UNIT ?STACK

* * * * * * * C O D E M E M O R Y * * * * * * *

CODE 0000H 0003H ABSOLUTE

CODE 0003H 000CH UNIT ?C_C51STARTUP

CODE 000FH 000CH UNIT ?PR?MAIN?MAIN

CODE 001BH 0001H UNIT ?PR?_SUM?MAIN

********************************************************************

與上面的程序想比較,發(fā)現(xiàn)內(nèi)存并沒有任何的變化。

看下面的程序

***************************************************************************

//程序4:

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

uint sum(uint c)

{

uint d;

d = c;

return d;

}

void main()

{

b = sum(5);

}

Program Size: data=12.0 xdata=0 code=28

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOLUTE "REG BANK 0"

DATA 0008H 0003H UNIT ?DT?MAIN

IDATA 000BH 0001H UNIT ?STACK

* * * * * * * C O D E M E M O R Y * * * * * * *

CODE 0000H 0003H ABSOLUTE

CODE 0003H 000CH UNIT ?C_C51STARTUP

CODE 000FH 000CH UNIT ?PR?MAIN?MAIN

CODE 001BH 0001H UNIT ?PR?_SUM?MAIN

****************************************************************************

這與上面的內(nèi)存使用相同,在這個程序中通過反匯編,查看編譯后的匯編程序可以發(fā)現(xiàn),參數(shù)的傳遞通過通用寄存器完成,沒有占用新的內(nèi)存。編譯器將其優(yōu) 化的通用寄存器(寄存器一般傳遞3個參數(shù),超過3個參數(shù)時,多余的參數(shù)通過分配空間地址的方式來訪問。但是分配的內(nèi)存空間包含了寄存器傳遞的3個參數(shù)在內(nèi) 的所有參數(shù)的空間。詳見《Parameter And Local Variable 》和《Parameter and Register》)和棧中(程序7),但是如果參數(shù)或局部變量過多,則情況就完全不同(程序6)。

再看下面的程序

*******************************************************************

//程序5

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

uint sum(uint c)

{

uint d;

}

void main()

{

}

Program Size: data=16.0 xdata=0 code=21

TYPE BASE LENGTH RELOCATION SEGMENT NAME

-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *

REG 0000H 0008H ABSOL

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

嵌入式開發(fā)作為一種專業(yè)且技術(shù)密集型的領(lǐng)域,涵蓋了從硬件底層驅(qū)動、中間件到應用層軟件開發(fā)等多個層面的工作,其所需的工具種類繁多,各有針對性,旨在提升開發(fā)效率、保證代碼質(zhì)量以及簡化調(diào)試過程。

關(guān)鍵字: 嵌入式開發(fā) keil

單片機內(nèi)部有很多的特殊功能寄存器,每個寄存器在單片機內(nèi)部都分配有唯一的地址,一般我們會根據(jù)寄存器功能的不同給寄存器賦予各自的名稱,當我們需要在程序中操作這些特殊功能寄存器時,必須要在程序的最前面將這些名稱加以聲明,聲明的...

關(guān)鍵字: C51 數(shù)據(jù)類型 擴充定義

數(shù)據(jù)元(Data Element),也稱為數(shù)據(jù)元素,是用一組屬性描述其定義、標識、表示和允許值的數(shù)據(jù)單元,在一定語境下,通常用于構(gòu)建一個語義正確、獨立且無歧義的特定概念語義的信息單元。數(shù)據(jù)元可以理解為數(shù)據(jù)的基本單元,將若...

關(guān)鍵字: C51 數(shù)據(jù)類型

之后新建新的工程,添加.a文件就可以使用了,當然也可以使用keil來添加,但是keil默認的是用.lab,需要自己配置一下文件屬性,改為lib文件即可。一半release sdk的時候用這種方式很關(guān)鍵的,畢竟自己的核心代...

關(guān)鍵字: keil 文件屬性 lib文件

↓推薦關(guān)注↓前言堆內(nèi)存(HeapMemory)是一個很有意思的領(lǐng)域。你可能和我一樣,也困惑于下述問題很久了:如何從內(nèi)核申請堆內(nèi)存?誰管理它?內(nèi)核、庫函數(shù),還是應用本身?內(nèi)存管理效率怎么這么高?!堆內(nèi)存的管理效率可以進一步...

關(guān)鍵字: 分配器 內(nèi)存分配 BSP THREAD

關(guān)注、星標公眾號,直達精彩內(nèi)容文章來源:技術(shù)讓夢想更偉大整理:李肖遙前言由于malloc()的源碼十分的繁瑣,并且會調(diào)用OS所提供的API,所以我不在對malloc()的源碼進行分析了,而只是會分析malloc()的動作...

關(guān)鍵字: 內(nèi)存分配 GROUP TE COOKIE

▼點擊下方名片,關(guān)注公眾號▼歡迎關(guān)注【玩轉(zhuǎn)單片機與嵌入式】公眾號,回復關(guān)鍵字獲取更多免費資料。回復【加群】,限時免費進入知識共享群;回復【3D封裝庫】,常用元器件的3D封裝庫;回復【電容】,獲取電容、元器件選型相關(guān)的內(nèi)容...

關(guān)鍵字: C51 MDK RealView

Understandingglibcmalloc日志:[2019-10-10]經(jīng)評論@kwdecsdn提醒,新增對「UnsortedBin中的chunks何時移至small/largechunk中」的補充解釋。[2019...

關(guān)鍵字: 分配器 內(nèi)存分配

Understandingglibcmalloc日志:[2019-10-10]經(jīng)評論@kwdecsdn提醒,新增對「UnsortedBin中的chunks何時移至small/largechunk中」的補充解釋。[2019...

關(guān)鍵字: 分配器 內(nèi)存分配

在Keil C51軟件中51單片機的中斷服務和外設驅(qū)動程序的開發(fā)

關(guān)鍵字: keil5 編譯 C51
關(guān)閉