精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Keil、 IAR編譯存儲相關說明及拓展

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 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

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

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

簡要說明其意思 Ⅱ

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

1.Keil編譯窗口信息

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

Code:指代碼的大小;

Ro-data:指除了內聯數據(inline data)之外的常量數據;

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

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

Code、Ro-data:位于FLASH中;

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

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

關系如下:

RO Size= Code + RO Data

RW Size= RW Data + ZI Data

ROM Size = Code + RO Data + RW Data

2.IAR編譯窗口信息

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

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

72 765 bytes ofreadonly codememory

3 508 bytes ofreadonly datamemory

20 202 bytes ofreadwrite datamemory

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

5 676 bytes ofCODEmemory

926 bytes ofCONSTmemory

1 148 bytes ofDATAmemory

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

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

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

說明:

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

內存(RAM)分配 Ⅲ

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

內存分為5類:

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

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

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

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

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

經典例子:

int a = 0; 全局初始化區

char *p1; 全局未初始化區

main(void)

{

int b;// 棧

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

char *p2; //棧

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

static int c =0; //全局(靜態)初始化區

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

//分配得來得10和20字節的區域就在堆區。

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

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • IAR
    IAR
    +關注

    關注

    5

    文章

    345

    瀏覽量

    36625
  • keil
    +關注

    關注

    68

    文章

    1212

    瀏覽量

    166701
  • 編譯
    +關注

    關注

    0

    文章

    654

    瀏覽量

    32813
收藏 人收藏

    評論

    相關推薦

    如何獲取入口函數不是__iar_program_start的Program entry的stack使用情況

    entry的stack使用相關信息: 如果對應啟動代碼沒有使用默認的入口函數__iar_program_start,需要使用--entry鏈接器選項指定對應的入口函數(以使用入口函數
    的頭像 發表于 11-25 16:23 ?74次閱讀
    如何獲取入口函數不是__<b class='flag-5'>iar</b>_program_start的Program entry的stack使用情況

    分享一個keil MDK編譯信息增強工具

    今天給大家分享一個 keil MDK 編譯信息增強工具:keil-build-viewer. 1 keil-build-viewer介紹 這是一個
    的頭像 發表于 11-14 11:01 ?237次閱讀

    GD32F103 KeilIAR pack包

    電子發燒友網站提供《GD32F103 KeilIAR pack包.rar》資料免費下載
    發表于 10-15 17:25 ?6次下載

    keil編譯后報錯redefinition的原因?怎么解決?

    keil編譯后報錯redefinition如何解決?
    發表于 09-27 06:15

    怎樣將keil中的程序導出

    1. 準備工作 在開始導出程序之前,需要確保已經完成了以下準備工作: 安裝Keil MDK-ARM軟件。 創建一個新的項目,并添加所需的源文件和庫文件。 配置項目設置,包括芯片型號、編譯器選項、鏈接
    的頭像 發表于 09-02 10:23 ?1187次閱讀

    Keil中變量不被初始化方法

    介紹使用KeilIAR和CubeIDE的操作方法,本文中所用芯片為:STM32G431RBT6。Keil中沒有這個關鍵字,而且會有版本的區別,下面分別介紹:為了防
    的頭像 發表于 08-30 11:47 ?541次閱讀
    <b class='flag-5'>Keil</b>中變量不被初始化方法

    芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南

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

    請問如何編寫.bin程序使用IAR或GreenHill將文件存儲到外部存儲器中?

    你好, 我們使用帶有 CYT4DN 和 S25HS 外部存儲器的自定義COOLDIM_PRG_BOARD 。 我們正在嘗試閃存 .bin 圖像 文件到外部存儲器中。 因此,我想知道 IAR
    發表于 05-15 07:22

    ARM7使用IAR或者KEIL,設置中斷優先級后,默認就是中斷嵌套嗎還是需要專門處理?

    使用IAR或者KEIL,設置中斷優先級后,默認就是中斷嵌套嗎,還是需要專門處理?
    發表于 04-19 08:09

    TLT507-Qt工程編譯說明

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

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

    TL3588-Qt工程編譯、GPU核心使用說明
    的頭像 發表于 01-24 14:03 ?877次閱讀
    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
    發表于 01-15 08:22

    keil如何生成bin文件

    Keil是一種集成開發環境(IDE),專為ARM架構的嵌入式系統開發而設計。在Keil中生成bin文件是將代碼編譯并轉換為可執行文件的過程。本文將詳細介紹Keil生成bin文件的步驟和
    的頭像 發表于 12-15 13:43 ?1.2w次閱讀

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

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

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

    U型光電開關說明
    發表于 12-04 10:30 ?0次下載