在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開(kāi)發(fā)>51單片機(jī)一般如何進(jìn)行內(nèi)存優(yōu)化?實(shí)例+要點(diǎn)資料下載

51單片機(jī)一般如何進(jìn)行內(nèi)存優(yōu)化?實(shí)例+要點(diǎn)資料下載

2021-04-03 | pdf | 100.91KB | 次下載 | 2積分

資料介紹

51單片機(jī)的內(nèi)存優(yōu)化最常見(jiàn)的是以下兩種 ① 超過(guò)變量128后必須使用compact模式編譯,實(shí)際的情況是只要內(nèi)存占用量不超過(guò) 256.0 就可以用 small 模式編譯 ② 128以上的某些地址為特殊寄存器使用,不能給程序用.與 PC 機(jī)不同,51 單片機(jī)不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的重復(fù)的地址。但訪問(wèn)時(shí)采用不同的指令,所以并不會(huì)占用 RAM 空間。 ③是否把一些固定的代碼存貯到了CODE區(qū)。如果把沒(méi)變化的數(shù)據(jù)也存儲(chǔ)到DATA去,就太浪費(fèi)了! 由于內(nèi)存比較小,一般要進(jìn)行內(nèi)存優(yōu)化,盡量提高內(nèi)存的使用效率。 以 Keil C 編譯器為例,small 模式下未指存儲(chǔ)類(lèi)型的變量默認(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é)肯定是不夠用的,但如果嵌套調(diào)用層數(shù)不深,有十幾個(gè)字節(jié)也夠有了。 為了驗(yàn)上面的觀點(diǎn),寫(xiě)了個(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é) 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). (測(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)是臃腫的,變量 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 就溢出了。(智能一點(diǎn)的編譯器會(huì)自動(dòng)將這個(gè)無(wú)用的變量去掉,但這個(gè)不在討論之列了)。另外,對(duì) idata 的定義的變量最好放在 data 變量之后,對(duì)于這一種定義 uchar c1; idata uchar c2; uchar c3; 變量 c2 肯定會(huì)以間接尋址,但它有可能落在 data 區(qū)域,就浪費(fèi)了一個(gè)可直接尋址的空間。 變量?jī)?yōu)化一般要注意幾點(diǎn): ①讓盡可能多的變量使用直接尋址,提高速度 假如有兩個(gè)單字節(jié)的變量,一個(gè)長(zhǎng)119的字符型數(shù)組 因?yàn)榭傞L(zhǎng)超過(guò) 120 字節(jié),不可能都定義在 data 區(qū) 按這條原則,定義的方式如下: ata UCHAR tab[119]; data UCAHR c1; idata UCHaR c2; 但也不是絕的,如果 c1, c2 需要以極高的頻率訪問(wèn),而 tab 訪問(wèn)不那么頻繁,則應(yīng)該讓訪問(wèn)量大的變量使用直接尋址: data UCAHR c1; data UCHaR c2; idata UCHAR tab[119]; 這個(gè)是要根據(jù)具體項(xiàng)目需求來(lái)確定的 ②提高內(nèi)存的重復(fù)利用率 就是盡可能的利用局部變量,局部變量還有個(gè)好處是訪問(wèn)速度比較快 由前面的例子可以看出,局部變量 i, j 是沒(méi)有單獨(dú)占用內(nèi)存的 子程序中使用內(nèi)存數(shù)目不大的變量盡量定義為局部變量 ③對(duì)于指針數(shù)組的定義,盡可能指明存儲(chǔ)類(lèi)型 盡量使用無(wú)符號(hào)類(lèi)型變量 一般指針需要一個(gè)字節(jié)額外的字節(jié)指明存儲(chǔ)類(lèi)型 8051 系列本身不支持符號(hào)數(shù),需要外加庫(kù)來(lái)處理符號(hào)數(shù),一是大大降低程序運(yùn)行效率,二是需要額外的內(nèi)存 ④避免出現(xiàn)內(nèi)存空洞 可以通過(guò)查看編譯器輸出符號(hào)表文件(.M51)查看 對(duì)前面的代碼,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開(kāi)始,占用0008H個(gè)字節(jié) 第二行顯示DATA區(qū)變量從0008H開(kāi)始,占用0078H個(gè)字節(jié)
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1TC358743XBG評(píng)估板參考手冊(cè)
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開(kāi)關(guān)電源基礎(chǔ)知識(shí)
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 6基于FPGA的C8051F單片機(jī)開(kāi)發(fā)板設(shè)計(jì)
  12. 0.70 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21548次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183278次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 国产v精品成人免费视频400条 | 天天干天天做天天射 | 色噜噜中文网 | 日韩草逼 | 在线成人欧美 | 日日摸夜夜添免费毛片小说 | 主人扒开腿揉捏花蒂调教cfh | 美女黄18| 丁香六月综合网 | 永久免费在线观看 | 欧美色综合高清免费 | 免费高清在线观看a网站 | 久久99精品久久久久久臀蜜桃 | 美女隐私黄www视频 美女用手扒开尿口给男生桶爽 | 午夜寂寞影院视频观看 | 爱婷婷网站在线观看 | 国产大毛片 | 天天拍夜夜添久久精品免费 | 日本www色 | 国产午夜精品理论片在线 | 自拍中文字幕 | 亚洲精品久久久久午夜福 | 久久久久久久综合狠狠综合 | 男人天堂网址 | 色内内免费视频播放 | 在线小视频你懂的 | 九月丁香婷婷亚洲综合色 | 欧美性猛交aa一级 | 黄色片啪啪 | 一个色在线视频 | 色视频在线播放 | 丁香六月综合网 | 五月激情在线 | 五月婷色| 天天做天天爱夜夜爽女人爽宅 | 国模私拍视频 | www.热| 51久久 | 一区二区高清在线 | 天天躁夜夜躁 | 日韩a级毛片 |