哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

電子發(fā)燒友App

硬聲App

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

資料介紹

51單片機的內(nèi)存優(yōu)化最常見的是以下兩種 ① 超過變量128后必須使用compact模式編譯,實際的情況是只要內(nèi)存占用量不超過 256.0 就可以用 small 模式編譯 ② 128以上的某些地址為特殊寄存器使用,不能給程序用.與 PC 機不同,51 單片機不使用線性編址,特殊寄存器與 RAM 使用重復(fù)的重復(fù)的地址。但訪問時采用不同的指令,所以并不會占用 RAM 空間。 ③是否把一些固定的代碼存貯到了CODE區(qū)。如果把沒變化的數(shù)據(jù)也存儲到DATA去,就太浪費了! 由于內(nèi)存比較小,一般要進行內(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)然,實際應(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ū) 按這條原則,定義的方式如下: ata 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é)
單片機 mcu 嵌入式 STM
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1冷柜-電氣控制系統(tǒng)講解
  2. 13.68 MB  |  4次下載  |  10 積分
  3. 2安川A1000變頻器中文版說明書
  4. 20.16 MB  |  3次下載  |  3 積分
  5. 3直流電路的組成和基本定律
  6. 1.67 MB   |  2次下載  |  免費
  7. 4丹佛斯2800系列變頻器說明書
  8. 8.00 MB  |  1次下載  |  5 積分
  9. 5PC8011同步開關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊
  10. 0.74 MB   |  1次下載  |  免費
  11. 6ES7243E+ES8311音頻錄制與播放電路資料
  12. 0.06 MB   |  1次下載  |  5 積分
  13. 7SDM02 激光測距模塊產(chǎn)品手冊
  14. 0.43 MB   |  1次下載  |  免費
  15. 8SDFM 激光測距模塊模組手冊
  16. 0.54 MB   |  1次下載  |  免費

本月

  1. 1CH341編程器軟件NeoProgrammer_2.2.0.10
  2. 20.47 MB   |  170次下載  |  1 積分
  3. 22025智能家居傳感器市場分析及創(chuàng)新應(yīng)用
  4. 3.11 MB  |  43次下載  |  免費
  5. 3RV1126B系列開發(fā)板產(chǎn)品資料
  6. 4.19 MB  |  18次下載  |  免費
  7. 4CH341編程軟件下載
  8. 2.50 MB   |  16次下載  |  5 積分
  9. 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場景
  10. 3.05 MB  |  12次下載  |  免費
  11. 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學(xué)習(xí)資源包
  12. 10.55 MB  |  8次下載  |  免費
  13. 7冷柜-電氣控制系統(tǒng)講解
  14. 13.68 MB  |  4次下載  |  10 積分
  15. 8特斯拉MODEL S車載充電機主電路回路原理圖
  16. 0.81 MB   |  4次下載  |  3 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935137次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233094次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191448次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183356次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81604次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73824次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分
山西省| 砀山县| 江永县| 博罗县| 安化县| 丰城市| 张家口市| 沈阳市| 库车县| 通海县| 黄石市| 靖宇县| 黄大仙区| 九寨沟县| 咸丰县| 兰西县| 新疆| 兴山县| 平陆县| 陆川县| 铁力市| 攀枝花市| 慈溪市| 灵武市| 郓城县| 平凉市| 尤溪县| 三穗县| 崇明县| 宁明县| 临西县| 正阳县| 左贡县| 家居| 云霄县| 蓬安县| 通辽市| 卢氏县| 云南省| 甘孜| 库伦旗|