STM32的FLASH和SRAM的使用情況分析

STM32片上自帶FLASH和SRAM,簡單講FLASH用來存儲程序的,SRAM是用來存儲運行程序中的中間變量。本文詳細分析下如何查看程序中FLASH和SRAM的使用情況。

  • STM32
Image placeholder
管理員 2021-04-01 10:45

01 前言


STM32片上自帶FLASH和SRAM,簡單講FLASH用來存儲程序的,SRAM是用來存儲運行程序中的中間變量。本文詳細分析下如何查看程序中FLASH和SRAM的使用情況。

本文開發工具: keil5

芯片: STM32F105VCT6


02 FLASH和SRAM介紹


FLASH存儲器又成為閃存,它與EEPROM都是掉電后數據不丟失的存儲器,但是FLASH的存儲容量都普遍的大于EEPROM,在存儲控制上,最主要的區別是FLASH芯片只能一大片一大片地擦除,而EEPROM可以單個字節擦除。

SRAM是靜態隨機存取存儲器。它是一種具有靜止存取功能的內存,不需要刷新電路即能保存它內部存儲的數據。STM32F1系列可以通過FSMC外設來拓展SRAM。

注意:SRAM和SDRAM是不相同的,SDRAM是同步動態隨機存儲器,同步是指內存工作需要同步時鐘,內部的命令的發送與數據的傳輸都以它為基準;動態是指存儲陣列需要不斷的刷新來保證數據不丟失;隨機是指數據不是線性依次存儲,而是自由指定地址進行數據讀寫。STM32的F1系列是不支持SDRAM的。

stm32不同型號的SRAM和FLASH大小是不相同的,可在datasheet中查看如下圖:


03 編譯結果分析

在keil中編譯結果如下圖:

打開生成的map文件拉到最后可看到如下:

編譯結果里面幾個的含義

  • Code:代碼空間,本質是ARM指令( FLASH)。

  • RO-data:即 Read Only-data, 表示程序定義的常量,如 const 類型( FLASH)。

  • RW-data:即 Read Write-data, 非0初始化的全局和靜態變量占用的RAM大小,同時還要占用等量的ROM大小用于存放這些非0變量的初值(FLASH+RAM)。

  • ZI-data:即 Zero Init-data, 0初始化的內存區的大小(該區域3個用途:0初始化的全局和靜態變量+堆區+棧區)(RAM)。


由上可知:

程序占用FLASH=Code + RO-data + RW-data 即map文件中ROM size?

程序占用RAM? = RW-data + ZI-data? ? ?即map文件中RW size?

常見的倆個疑問:

1、RW-data為什么會即占用Flash又占用RAM空間?

由前文知道RAM掉電數據會丟失,RW-data是非0初始化的數據,已初始化的數據需要被存儲在掉電不會丟失的FLASH中,上電后會從FLASH搬移到RAM中。

2、為什么燒錄的鏡像文件不包含ZI-data呢?

我們都知道在燒寫程序的時候,需要燒寫bin文件或者hex文件到STM32的flash中,被燒寫的文件稱為鏡像像文件image。image的內容包含這三個Code 、 RO-data 和 RW-data。

通過第一個問題大家應該有所理解,因為ZI數據是0,沒必要包含,只要在程序運行前把ZI數據區域一律清零即可,包含進去反而浪費Flash存儲空間。

評論0