block 0 里面有一段叫做FLASH,也就是內部FLASH,我們的程序就是下載到這個地方,起始地址是0X800 0000,大家注意,這個只有1M空間?,F在STM32已經有2M flash的芯片了,超出1M的FLASH放在哪里呢?請自行查看對應的芯片手冊。
在block 1 內,有兩段SRAM,總共128K,這個空間,也就是我們前面說的內存,存放程序使用的變量。如果需要,也可以把程序放到SRAM中運行。407不是有196K嗎?
其實407有196K內存,但是有64k并不是普通的SRAM,而是放在block 0 內的CCM。
(資料圖)
這兩段區域不連續,而且,CCM只能內核使用,外設不能使用,例如DMA就不能用CCM內存,否則就死機。
block 2,是Peripherals,也就是外設空間。我們看右邊,主要就是APB1/APB2、AHB1/AHB2,什么東西呢?回頭再說。
block 3、block4、block5,是FSMC的空間,FSMC可以外擴SRAM,NAND FALSH,LCD等外設。
函數從哪里開始運行?
每個芯片都有復位功能,復位后,芯片的PC指針(一個寄存器,指示程序運行位置,對于多級流水線的芯片,PC可能跟真正執行的指令位置不一致,這里暫且認為一致)會復位到固定值,一般是0x00000000,在STM32中,復位到 0X08000004。因此復位后運行的第一條代碼就是 0X08000004。前面我們不是拷貝了一個啟動代碼文件到工程嗎?
startup_stm32f40_41xxx.s,這個匯編文件為什么叫啟動代碼?因為里面的匯編程序,就是復位之后執行的程序。在文件中,有一段數據表,稱為中斷向量,里面保存了各個中斷的執行地址。復位,也是一個中斷。
是我們在 main.c 中定義的 main 函數嗎?后面我們再說這個問題。
芯片是怎么知道開始就執行啟動代碼的呢?或者說,我們如何把這個啟動代碼放到復位的位置?這就牽涉到一個一般情況下不關注的文件 wujique.sct,這個文件在 wujique\prj\Objects 目錄下,通常把這個文件叫做分散加載文件,編譯工具在鏈接時,根據這個文件放置各個代碼段和變量。
第6行 ER_IROM1 0x08000000 0x00080000定義了ER_IROM1,也就是我們說的內部FLASH,從 0x08000000 開始,大小 0x00080000。
第7行.o (RESET, +First)從 0x08000000 開始,先放置一個.o文件, 并且用(RESET, +First)指定RESET塊優先放置,RESET塊是什么?請查看啟動代碼,中斷向量就是一個AREA,名字叫RESET,屬于READONLY。這樣編譯后,RESET塊將放在0x08000000位置,也就是說,中斷向量就放在這個地方。
DCD是分配空間,4字節,第一個就是__initial_sp,第二個就是Reset_Handler函數指針。也就是說,最后編譯后的程序,將Reset_Handler這個函數的指針(地址),放在0x800000+4的地方。所以芯片在復位的時候,就能找到復位函數Reset_Handler。
第8行 *(InRoot$$Sections)什么鬼?GOOGLE??!回頭再說。
第9行 .ANY (+RO)意思就是其他的所有RO,順序往后放。就是說,其他代碼,跟著啟動代碼后面。
第11行 RW_IRAM1 0x20000000 0x00020000定義了RAM大小。
第12行 .ANY (+RW +ZI)所有的RW ZI,全部放到RAM里面。RW,ZI,也就是變量,這一行指定了變量保存到什么地址。
map 總信息
ROM為什么不包括ZI Data?為什么包含RW Data?
Image component sizes
首先,是我們自己的源碼,這個程序我們的代碼不多,只有 main.o,wujique_log.o,和其他一些 STM32 的庫文件。
文件map
在代碼中,我們經常會包含一些頭文件,例如:
Image Symbol Table
標簽:
新聞排行
圖文播報
科普信息網 - 科普類網站
聯系郵箱:920 891 263@qq.com 備案號: 京ICP備2022016840號-87
版權所有:科普信息網 www.www44bkbkcom.cn copyright © 2018 - 2020
科普信息網版權所有 本站點信息未經允許不得復制或鏡像,違者將被追究法律責任!