久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3537|回復: 0
打印 上一主題 下一主題
收起左側

SMT32:ARM編譯中的RO、RW和ZI DATA區段

[復制鏈接]
跳轉到指定樓層
樓主
ID:51269 發表于 2014-11-10 22:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、ARM程序(指在ARM系統中正在執行的程序,而非保存在ROM中的bin文件)的組成
    一個ARM程序包含3部分:RO段,RW段和ZI段
    RO是程序中的指令和常量
    RW是程序中的已初始化變量
    ZI是程序中的未初始化的變量
    由以上3點說明可以理解為:
    RO就是readonly,
    RW就是read/write,
    ZI就是zero
二、ARM映像文件的組成
    所謂ARM映像文件就是指燒錄到ROM中的bin文件,也成為image文件。以下用Image文件來稱呼它。Image文件包含了RO和RW數據。之所以Image文件不包含ZI數據,是因為ZI數據都是0,沒必要包含,只要程序運行之前將ZI數據所在的區域一律清零即可。包含進去反而浪費存儲空間。

三、
Q:為什么Image中必須包含RO和RW?
A:因為RO中的指令和常量以及RW中初始化過的變量是不能像ZI那樣“無中生有”的。
ARM程序的執行過程
    從以上兩點可以知道,燒錄到ROM中的image文件與實際運行時的ARM程序之間并不是完全一樣的。
因此就有必要了解ARM程序是如何從ROM中的image到達實際運行狀態的。
    實際上,RO中的指令至少應該有這樣的功能:
1. 將RW從ROM中搬到RAM中,因為RW是變量,變量不能存在ROM中。
2. 將ZI所在的RAM區域全部清零,因為ZI區域并不在Image中,所以需要程序根據編譯器給出的ZI地址及大小來將相應得RAM區域清零。
    ZI中也是變量,同理:變量不能存在ROM中。在程序運行的最初階段,RO中的指令完成了這兩項工作后C程序才能正常訪問變量。否則只能運行不含變量的代碼。
    說了上面的可能還是有些迷糊,RO,RW和ZI到底是什么,下面我將給出幾個例子,最直觀的來說明RO,RW,ZI在C中是什么意思。
1; RO
    看下面兩段程序,他們之間差了一條語句,這條語句就是聲明一個字符常量。因此按照我們之前說的,他們之間應該只會在RO數據中相差一個字節(字符常量為1字節)。
Prog1:
#include <stdio.h>
void main(void)
{
;
}
Prog2:
#include <stdio.h>
const char a = 5;
void main(void)
{
;
}
Prog1編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog2編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 61 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1009 ( 0.99kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
以上兩個程序編譯出來后的信息可以看出:
Prog1和Prog2的RO包含了Code和RO Data兩類數據。他們的唯一區別就是Prog2的RO Data比Prog1多了1個字節。
這正和之前的推測一致。如果增加的是一條指令而不是一個常量,則結果應該是Code數據大小有差別。
2; RW
同樣再看兩個程序,他們之間只相差一個“已初始化的變量”,按照之前所講的,已初始化的變量應該是算在RW中的,
所以兩個程序之間應該是RW大小有區別。
Prog3:
#include <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
char a = 5;
void main(void)
{
;
}
Prog3編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 1 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
================================================================================
可以看出Prog3和Prog4之間確實只有RW Data之間相差了1個字節,這個字節正是被初始化過的一個字符型變量“a”所引起的。

3; ZI
    再看兩個程序,他們之間的差別是一個未初始化的變量“a”,從之前的了解中,應該可以推測,
這兩個程序之間應該只有ZI大小有差別。
Prog3:
#include <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
char a;
void main(void)
{
;
}
Prog3編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 96 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
Prog4編譯出來后的信息如下:
================================================================================
Code RO Data RW Data ZI Data Debug
948 60 0 97 0 Grand Totals
================================================================================
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
================================================================================
    編譯的結果完全符合推測,只有ZI數據相差了1個字節。這個字節正是未初始化的一個字符型變量“a”所引起的。
    注意:如果一個變量被初始化為0,則該變量的處理方法與未初始化華變量一樣放在ZI區域。
即:ARM C程序中,所有的未初始化變量都會被自動初始化為0。
總結:
1; C中的指令以及常量被編譯后是RO類型數據。
2; C中的未被初始化或初始化為0的變量編譯后是ZI類型數據。
3; C中的已被初始化成非0值的變量編譯后市RW類型數據。
附:
程序的編譯命令(假定C程序名為tst.c):
armcc -c -o tst.o tst.c
armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
編譯后的信息就在aa.map文件中。
ROM主要指:NAND Flash,Nor Flash
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM

以上摘自(原文不知何處):
http://hi.baidu.com/smallwormsea/blog/item/08e40a17cc22520a4a90a7a1.html

另外,
1、你會發現:ROM Size不等于RO和RW的總和,原因是這里使用了RW數據壓縮,LInker默認把下載到ROM的重復的RW數據壓縮。如下表,可見,原本的316B的RW被壓縮為108B,也正如上文開頭說的那樣,Image文件(下載到ROM的文件)是沒有包括ZI的,所以這里由2692B變成實際下載到ROM的0B。

2、其中inc.data為內聯數據(inline data),是包含在code里面的,如文字池、短字符串,這個與RO data很相似的,但是和RO Data有什么區別呢?(現在可以確定的是const數據歸為RO data,但明顯不只有const數據,難道還有‘長字符串’??待查)
3、如上文介紹,下載到單片機上的image文件只包括RO和RW,沒有包括ZI,這就是所謂的加載區(LR),但是程序運行 時候需要重新建立映像的會生產一個ZI,這個就是所謂的執行區(ER)
==============================================================================





      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   


     14014       3494       1954        316       2692     384984   Grand Totals
     14014       3494       1954        108       2692     384984   ELF Image Totals(compressed)
     14014       3494       1954        108          0          0   ROM Totals


==============================================================================


    Total RO  Size (Code + RO Data)                15968 (  15.59kB)
    Total RW  Size (RW Data + ZI Data)              3008 (   2.94kB)
    Total ROM Size (Code + RO Data + RW Data)      16076 (  15.70kB)


==============================================================================



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热免费看 | 黄色三级免费网站 | 日日综合 | 热99视频 | 成人午夜性成交 | 亚洲一区精品在线 | 成人国产免费视频 | 精品一区二区久久 | 欧美视频精品 | 国产一区二区在线免费观看 | 在线播放第一页 | 国产精品欧美一区喷水 | 亚洲国产精品久久久久 | 国产资源在线观看 | 日本午夜在线视频 | 成人毛片视频在线播放 | 国产精品久久777777 | 在线免费观看亚洲 | 欧美日韩视频 | 日本不卡一二三 | 久久99精品久久久久久国产越南 | 伊人久久综合 | 亚洲精品一区二区 | 亚洲精品视频一区 | 91色综合 | 成人久久久 | 2020国产在线| 色在线免费视频 | 国产福利在线 | 日产精品久久久一区二区福利 | 亚洲一区二区三区四区五区中文 | 91精品国产色综合久久不卡98口 | 国产精品福利网 | 91五月婷蜜桃综合 | 欧美啪啪| 中文字幕在线视频免费视频 | 97在线超碰| 在线欧美一区二区 | 欧美综合视频在线 | 国产视频中文字幕在线观看 | 国产精品福利视频 |