在為資源受限的系統開發軟件時,強烈建議嵌入式開發人員使用跟蹤代碼、數據和RAM使用情況的指標。該信息總是可以在編譯器生成的映射文件中找到,但它并不總是最終的和總的值。許多編譯器會計算這些值,并在編譯過程中將它們打印到控制臺窗口。盡管顯示的信息并不總是清晰的。
例如,在為ARM Cortex-M處理器編譯程序時,打印到控制臺的輸出將采用類似如下的形式:
文本數據 bss dec 十六進制文件名
0x100 0x22 0x56 377 0x178 experiment1.elf
乍一看,這可能看起來相對令人生畏,盡管并不完全如此。腦海中浮現的問題是,這些不同的空間到底是什么意思?實際使用了多少RAM和多少閃存?要理解這一點,關鍵是要知道這些細分市場到底是什么,以及它們對這些總數的貢獻如何。
文本段告訴嵌入式開發人員有多少閃存空間被分配給程序的代碼和常量。這可以被認為是任何使用常量類型限定符的變量、函數和作為程序的一部分生成的可執行代碼。例如,下面的語句將向文本段添加四個字節。
const uint32 _ t Data = 0x14
數據段包含初始化變量在閃存中占用的空間量。這一部分非常重要,因為變量的初始值存儲在flash中,但在系統初始化期間會復制到RAM中。這種復制過程通常被稱為C向下復制。下面是一個初始化變量的例子:
uint32 _ t Data _ Init = 0x14
bss段包含用于任何未初始化數據的空間。這是將被賦予初始值0的數據。這些變量將再次存儲在RAM中。未初始化數據的一個簡單示例如下:
uint32 _ t Data _ NoInit
編譯器輸出中的其余值只是以十進制或十六進制表示法表示文本、數據和bss段的總數。不幸的是,這個結果實際上只告訴了應用程序將使用多少閃存空間。要獲得正在使用的RAM量,需要將數據段和bss段相加。一旦完成,嵌入式開發人員就可以了解器件使用了多少閃存和RAM空間。