先說說MDK編譯好后的顯示的。
上圖第三行是燒寫到FLASH的大小,第二行(可修改的數據)是占用SRAM的大小
1、stm32一開始上電的時候,按理來說是從0x0000 0000開始讀取第一條指令的,但M3系列的不同,通過boot0,boot1上電狀態的不同,進入不同的工作模式,取得第一條指令的地址也就不同了。
- 通過boot引腳設置可以將中斷向量表定位於SRAM區,即起始地址為0x2000000,同時復位后PC指針位於0x2000000處;
- 通過boot引腳設置可以將中斷向量表定位於FLASH區,即起始地址為0x8000000,同時復位后PC指針位於0x8000000處;
- 通過boot引腳設置可以將中斷向量表定位於內置Bootloader區,本文不對這種情況做論述;
(當然,上述地址也是可以更改的)
同時,stm32內部的該寄存器記錄了,向量表偏移量的值
2、0x08000000(代碼區)的一開始位置有一張中斷向量表,其第一個表項是棧頂地址,第二個表項是復位中斷服務入口地址。
程序會先取出0x08000000的值,給sp寄存器。
再接着取0x08000004的值(即復位中斷程序),給pc寄存器,去執行它
如圖,sp=0x20000690 pc=80001101
我們可以從生成的******.map文件中看到
pc指向的位置就是復位中斷服務的入口,進入之后,時鍾初始化,然后跳轉__main函數,最后進入mian函數,來到C的世界
3、那么sp的值大小有時怎么算出來的呢
就是根據最上面RW SIZE的數值大小,加上MDK里設置的0x20000000的初始值,得出的
但其實,有時候會發現自己寫的程序(初始化的全局變量,靜態變量之類)並沒有占有這么大的空間。那RW SIZE的數值大小有時哪來的呢
上圖為.map文件里的內容
看得出只有.data和.bss才是用戶自己添加的代碼占用空間大小
其他的HEAP,STACK都是別文件里添加上的,比如啟動文件