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

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

3天內(nèi)不再提示

Keil、 IAR編譯存儲相關(guān)說明及拓展

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-20 11:38 ? 次閱讀

寫在前面 Ⅰ

Keil、IAR編譯(Build)窗口打印出來的信息

Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028

72 765 bytes ofreadonly codememory

3 508 bytes ofreadonly datamemory

20 202 bytes ofreadwrite datamemory

5 676 bytes ofCODEmemory

926 bytes ofCONSTmemory

1 148 bytes ofDATAmemory

相信大家都看到過上面的信息,應(yīng)該都知道它們大概的意思,但關(guān)于存儲這一塊的細節(jié)知識又有多少朋友去深入理解過呢?

要知道代碼、常量、全局、局部變量存儲在哪兒,就需要了解FLASH和RAM的一些特性,在工程中要具體分析其大小及對應(yīng)存儲地址,可以從map文件中分析。

簡要說明其意思 Ⅱ

為了照顧大部分人,簡要說一下上面打印信息的意思。微主這里提醒一下大家,網(wǎng)上也有一大堆相關(guān)資料,但網(wǎng)上好些資料說的有歧義,可能會誤導(dǎo)大家,如:RW-data為已初始化的全局變量。加了static修飾的變量叫靜態(tài)變量,和全局變量還是存在差別,但已初始化的靜態(tài)變量也會歸為RW-data中。

1.Keil編譯窗口信息

Program Size:Code=2596RO-data=268RW-data=44ZI-data=1028

Code:指代碼的大小;

Ro-data:指除了內(nèi)聯(lián)數(shù)據(jù)(inline data)之外的常量數(shù)據(jù);

RW-data:指可讀寫(RW)、已初始化的變量數(shù)據(jù);

ZI-data:指未初始化(ZI)的變量數(shù)據(jù);

Code、Ro-data:位于FLASH中;

RW-data、ZI-data:位于RAM中;

提醒:RW-data已初始化的數(shù)據(jù)會存儲在Flash中,上電會從FLASH搬移至RAM中。

關(guān)系如下:

RO Size= Code + RO Data

RW Size= RW Data + ZI Data

ROM Size = Code + RO Data + RW Data

2.IAR編譯窗口信息

IAR存在兩種情況,但意思都差不多,只是顯示不一樣:

編譯工程(點擊Make),會出現(xiàn)如下信息:

72 765 bytes ofreadonly codememory

3 508 bytes ofreadonly datamemory

20 202 bytes ofreadwrite datamemory

編譯單個文件(點擊Compile),會出現(xiàn)下面信息(若沒有DATA就沒有那一行):

5 676 bytes ofCODEmemory

926 bytes ofCONSTmemory

1 148 bytes ofDATAmemory

readonly code:代碼大小(類似于CODE);

readonly data:常量數(shù)據(jù)(類似于CONST);

readwrite data:可讀寫變量數(shù)據(jù)(類似于DATA);

說明:

IAR中的Data相當于Keil中RW Data + ZI Data

內(nèi)存(RAM)分配 Ⅲ

本節(jié)擴展一下RAM的一些知識,有助于大家對程序運行時RAM的情況。

內(nèi)存分為5類:

1、棧區(qū)(stack): 由編譯器自動分配和釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。

2、堆區(qū)(heap) : 一般由程序員(使用malloc)分配和(使用free)釋放, 若程序員不釋放,則一直被占用。一般來說,單片機類的程序一般沒有使用堆。

3、全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。

4、文字常量區(qū)(const) :常量字符串就是放在這里的。

5、程序代碼區(qū) (code): 存放函數(shù)體的二進制代碼。

經(jīng)典例子:

int a = 0; 全局初始化區(qū)

char *p1; 全局未初始化區(qū)

main(void)

{

int b;// 棧

char s[] = "abc"; //棧

char *p2; //棧

char *p3 = "123456"; 123456\0";//在常量區(qū),p3在棧上。

static int c =0; //全局(靜態(tài))初始化區(qū)

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

//分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(p1, "123456"); //123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方。

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    344

    瀏覽量

    36564
  • keil
    +關(guān)注

    關(guān)注

    68

    文章

    1209

    瀏覽量

    166462
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    647

    瀏覽量

    32743
收藏 人收藏

    評論

    相關(guān)推薦

    GD32F103 KeilIAR pack包

    電子發(fā)燒友網(wǎng)站提供《GD32F103 KeilIAR pack包.rar》資料免費下載
    發(fā)表于 10-15 17:25 ?0次下載

    芯海通用 MCU應(yīng)用筆記 :在 IAR 及 MDK 開發(fā)環(huán)境下使用 printf 函數(shù)重定向移植差異指南

    UART 口輸出打印信息。在 IAR9.x版本下,IAR 官方已經(jīng)不再支持 fputc 接口的重定向,此時若移植原 Keil 下代碼,則無法在 IAR
    發(fā)表于 05-16 11:56

    TLT507-Qt工程編譯說明

    TLT507-Qt工程編譯說明
    的頭像 發(fā)表于 01-26 09:37 ?930次閱讀
    TLT507-Qt工程<b class='flag-5'>編譯</b><b class='flag-5'>說明</b>

    TL3588-Qt工程編譯、GPU核心使用說明

    TL3588-Qt工程編譯、GPU核心使用說明
    的頭像 發(fā)表于 01-24 14:03 ?795次閱讀
    TL3588-Qt工程<b class='flag-5'>編譯</b>、GPU核心使用<b class='flag-5'>說明</b>

    Mini51DE_Series_BSP_CMSIS_v3.02.000為何在IAR編譯報錯?

    IAR 8.32 編譯時報如下錯誤: Error[Pe235]: variable \"__stdout\" was declared with a
    發(fā)表于 01-15 08:22

    keil如何生成bin文件

    Keil是一種集成開發(fā)環(huán)境(IDE),專為ARM架構(gòu)的嵌入式系統(tǒng)開發(fā)而設(shè)計。在Keil中生成bin文件是將代碼編譯并轉(zhuǎn)換為可執(zhí)行文件的過程。本文將詳細介紹Keil生成bin文件的步驟和
    的頭像 發(fā)表于 12-15 13:43 ?1.1w次閱讀

    IAR編譯環(huán)境使用小技巧(2)

    IAR下出現(xiàn)abort handle或hardware fault后,如何處理
    的頭像 發(fā)表于 12-13 13:29 ?856次閱讀
    <b class='flag-5'>IAR</b><b class='flag-5'>編譯</b>環(huán)境使用小技巧(2)

    24系列 槽型光電傳感器使用說明

    U型光電開關(guān)說明
    發(fā)表于 12-04 10:30 ?0次下載

    實戰(zhàn)經(jīng)驗 | Keil、IAR、CubeIDE 中變量不被初始化方法

    關(guān)鍵詞:不被初始化,編譯環(huán)境 目錄預(yù)覽 1、前言 2、IAR 實現(xiàn)變量不初始化方法 3、Keil 實現(xiàn)變量不被初始化方法 4、CubeIDE 實現(xiàn)變量不初始化方法 01 前言 有些時候在我們的應(yīng)用過
    的頭像 發(fā)表于 11-24 18:05 ?3531次閱讀

    keil編譯很慢的原因?

    不知道什么時候開始我的keil編譯變的即慢,本來編譯大工程的時候慢什么什么感覺,但是剛才我編譯之前寫的一些小工程,記得之前編譯很快的,不知道
    發(fā)表于 11-10 06:45

    請問Helix的匯編文件有沒有IAR版本的?

    現(xiàn)在做個可以播放mp3文件的東西,參考原子的資料還有網(wǎng)上下載的都是keil版本,mdk編譯工程速度實在太慢,習(xí)慣IAR了,哪里可以找到IAR版本的Helix?
    發(fā)表于 11-09 07:12

    Maxim開發(fā)環(huán)境是什么?支持keiliar?

    Maxim開發(fā)環(huán)境是什么?支持keiliar?
    發(fā)表于 11-09 06:59

    Arduino開發(fā)單片機和傳統(tǒng)的IAR、keil最大區(qū)別在哪?

    為何Arduino現(xiàn)在這么收追捧? 如何入門Arduino?有STM32 C語音基礎(chǔ),以前基本是IARkeil
    發(fā)表于 11-07 08:14

    STM32通過命令行編譯和下載keilIAR工程的方法

    STM32通過命令行編譯和下載keilIAR工程的方法
    的頭像 發(fā)表于 10-31 17:01 ?1424次閱讀
    STM32通過命令行<b class='flag-5'>編譯</b>和下載<b class='flag-5'>keil</b>和<b class='flag-5'>IAR</b>工程的方法

    keil好用還是iar好用?

    之前操作stm32,一直用keil的mdk5編譯環(huán)境。最近開始弄智能車比賽,發(fā)現(xiàn)飛卡的kinetis類的芯片基本上大家都用的是iar環(huán)境。就想問一下這兩者之間的區(qū)別是怎么樣的?哪個更好用一些呢?
    發(fā)表于 10-31 07:14