国产九九热视频-国产九九精品视频-国产精自产拍久久久久久蜜-国产精自产拍久久久久久-国产精在线-国产精亚洲视频
[Full]
完整版
[Rss]
訂閱
[Xml]
無(wú)圖版
[Xhtml]
無(wú)圖版
Rss
& SiteMap
曙海教育集團(tuán)論壇
http://www.bjzhda.cn
曙海教育集團(tuán)論壇
◎
曙海教育集團(tuán)論壇
→
單片機(jī)初中級(jí)
→
關(guān)于c51內(nèi)存優(yōu)化的帖子問(wèn)題
共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽:
[1]
[瀏覽完整版]
標(biāo)題:關(guān)于c51內(nèi)存優(yōu)化的帖子問(wèn)題
1樓
wangxinxin
發(fā)表于:2010-12-7 14:50:06
以下內(nèi)容含腳本,或可能導(dǎo)致頁(yè)面不正常的代碼
天祥老師原帖如下: 對(duì) 51 <span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B5%A5%C6%AC%BB%FA">單片機(jī)</span>內(nèi)存的認(rèn)識(shí),很多人有誤解,最常見(jiàn)的是以下兩種 ① 超過(guò)變量128后必須使用compact模式編譯 實(shí)際的情況是只要內(nèi)存占用量不超過(guò) 256.0 就可以用 small 模式編譯 ② 128以上的某些地址為特殊寄存器使用,不能給<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B3%CC%D0%F2">程序</span>用 與 <img alt="" src="http://www.51c51.com/bbs/images/smilies/default/titter.gif" border="0" smilieid="9"/>C 機(jī)不同,51 單片機(jī)不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的重復(fù)的地址。但訪問(wèn)時(shí)采用不同的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%D6%B8%C1%EE">指令</span>,所以并不會(huì)占用 RAM 空間。 由于內(nèi)存比較小,一般要進(jìn)行內(nèi)存優(yōu)化,盡量提高內(nèi)存的使用效率。 以 Keil C 編譯器為例,small 模式下未指存儲(chǔ)類型的變量默認(rèn)為data型,即直接尋址,只能訪問(wèn)低 128 個(gè)字節(jié),但這 128 個(gè)字節(jié)也不是全為我們的程序所用,寄存器 R0-R7必須映射到低RAM,要占去 8 個(gè)字節(jié),如果使用寄存組切換,占用的更多。 所以可以使用 data 區(qū)最大為 120 字節(jié),超出 120 個(gè)字節(jié)則必須用 idata 顯式的指定為間接尋址,另外堆棧至少要占用一個(gè)字節(jié),所以極限情況下可以定義的變量可占 247 個(gè)字節(jié)。當(dāng)然,實(shí)際應(yīng)用中堆棧為一個(gè)字節(jié)肯定是不夠用的,但如果<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C7%B6%CC%D7">嵌套</span>調(diào)用層數(shù)不深,有十幾個(gè)字節(jié)也夠有了。 為了驗(yàn)上面的觀點(diǎn),寫了個(gè)例子 #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 個(gè)字節(jié) <span class="t_tag" onclick="tagshow(event)" href="tag.php?name=keil">keil</span> 編譯的結(jié)果如下: Program Size: data=256.0 xdata=0 code=30 creating hex file from ".\Debug\Test"... ".\Debug\Test" - 0 Error(s), 0 Warning(s). (測(cè)試環(huán)境為 XP + Keil C 7.5) 這段代碼已經(jīng)達(dá)到了內(nèi)存分配的極限,再定義任何全局變量或?qū)?shù)組加大,編譯都會(huì)報(bào)錯(cuò) 107 這里要引出一個(gè)問(wèn)題:為什么變量 i、j 不計(jì)算在內(nèi)? 這是因?yàn)?i、j 是局部變量,編譯器會(huì)試著將其優(yōu)化到寄存器 Rx 或棧。問(wèn)題也就在這了,如果局部變量過(guò)多或定義了局部數(shù)組,編譯器無(wú)法將其優(yōu)化,就必須使用 RAM 空間,雖然全局變量的分配經(jīng)過(guò)精心計(jì)算沒(méi)有超出使用范圍,仍會(huì)產(chǎn)生內(nèi)存溢出的錯(cuò)誤! 而編譯器是否能成功的優(yōu)化變量是根據(jù)代碼來(lái)的 上面的代碼中,循環(huán)是<a style="TEXT-DECORATION: underline" href="http://www.sogou.com/sogoupedia?query=%D3%B7" target="_blank"><font color="#0000ff">臃</font></a>腫的,變量 j 完全不必要,那么將代碼改成 UCHAR i; UCHAR j; for(i = 0; i < LEN; ++i ) { tt1<i> = 0x55; } 再編譯看看,出錯(cuò)了吧! 因?yàn)榫幾g器不知道該如何使用 j,所以沒(méi)能優(yōu)化,j 須占 RAM 空間,RAM 就溢出了。 (<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%D6%C7%C4%DC">智能</span>一點(diǎn)的編譯器會(huì)自動(dòng)將這個(gè)無(wú)用的變量去掉,但這個(gè)不在討論之列了) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// <font color="#f73809" size="5">我現(xiàn)在仿照上面那個(gè)列子</font> <font color="#f73809" size="5">#include<reg52.h></font> <font color="#f73809" size="5">#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; } } </font> <font color="#f73809" size="5">在smalll模式下編譯怎么出現(xiàn)這樣的錯(cuò)誤,在compact 和larger也出線這樣的結(jié)果,怎么回事?</font> <font color="#f73809" size="5">Build target 'Target 1' assembling STARTUP.A51... linking... *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_START MODULE: STARTUP.obj (?C_STARTUP) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?C_START MODULE: STARTUP.obj (?C_STARTUP) ADDRESS: 000DH Program Size: data=9.0 xdata=0 code=15 creating hex file from "neicun"... "neicun" - 0 Error(s), 2 Warning(s).</font> <font color="#f73809" size="5">兩個(gè)警告 我認(rèn)為那兩個(gè)只是c編譯器把他當(dāng)作警告了,其實(shí)應(yīng)該是錯(cuò)誤.</font> <font color="#f73809" size="5">警告1:沒(méi)有引用外部變量</font> <font color="#f73809" size="5">警告2:應(yīng)該也是關(guān)于外部變量的事</font> <font color="#f73809" size="5">我定義的data 和idata都是C52自帶的RAM (256Byte)沒(méi)有定義外部變量,怎么說(shuō)我引用了外部變量呢?</font> <font color="#f73809" size="5">謝謝大家!!!</font> </i>
說(shuō)明:
上面顯示的是代碼內(nèi)容。您可以先檢查過(guò)代碼沒(méi)問(wèn)題,或修改之后再運(yùn)行.
共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽:
[1]
Copyright © 2000 - 2009
曙海
教育集團(tuán)
Powered By
曙海教育集團(tuán)
Version 2.2
Processed in .01367 s, 2 queries.
[Full]
完整版
[Rss]
訂閱
[Xml]
無(wú)圖版
[Xhtml]
無(wú)圖版
主站蜘蛛池模板:
鹤峰县
|
邵武市
|
达拉特旗
|
额敏县
|
鄂托克旗
|
信宜市
|
永顺县
|
安平县
|
英山县
|
三原县
|
祁门县
|
三穗县
|
盈江县
|
灵丘县
|
博客
|
建宁县
|
年辖:市辖区
|
陇川县
|
潜江市
|
正阳县
|
潮州市
|
资阳市
|
通河县
|
留坝县
|
辽源市
|
化州市
|
纳雍县
|
兴和县
|
泰兴市
|
金昌市
|
天等县
|
靖安县
|
淄博市
|
建瓯市
|
阳新县
|
普洱
|
大方县
|
渝北区
|
顺义区
|
连州市
|
东丰县
|