初步認識irom和iram
s5pv210含有乙個內64k的irom和96k的iram,系統啟動時主要依靠它們,irom和iram所處的儲存空間見下圖:
s5pv210有irom,且只能從irom啟動,不再支援原來的直接從外部介質啟動方式。
irom**(bl0)執行完畢後,根據om[5:0]確定外部啟動介質(bl1和bl2)完成啟動。s5pv210支援的外部啟動介質包括:nand flash、onenand、sd/mmc、emmc、essd、uart/usb。完整的啟動序列
系統剛啟動時,會執行irom中的固化**,進行一些通用的初始化,具體步驟包括:
第一步 關閉看門狗;
第二步 初始化icache;
第三步 初始化堆疊;
第四步 設定時鐘;
第五步 判斷啟動裝置(nand/sd/onenand等),檢查校驗和,然後從啟動裝置中拷貝前16k的**到iram的0xd0020000處;
第六步 若是安全模式啟動,則進行完整性檢查;
第七步 跳轉到iram的0xd0020010位址上繼續執行;
uart /usb啟動模式
1、//關閉看門狗
ldr r0, =0xe2700000
mov r1, #0
str r1, [r0]
2、控制icache
// 開啟icache可提高執行速度
#ifdef config_sys_icache_off
// clear bit 12 (i) i-cache
bic r0, r0, #0x00001000
#else
// set bit 12 (i) i-cache
orr r0, r0, #0x00001000
#endif
mcr p15, 0, r0, c1, c0, 0
3、//設定棧
棧的整體作用
1) 儲存現場;
2) 傳遞引數:彙編**呼叫c函式時,需傳遞引數;
3) 儲存臨時變數:包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數; 4、重定位**到iram+0x4000
重定位:對於程式而言,我們需要理解兩個概念,一是程式當前所處的位址,即程式在執行時,所處的當前位址;二是程式的鏈結位址,即程式執行時應該位於的執行位址。編譯程式時,可以指定程式的鏈結位址。
對於s5pv210而言,啟動時只會從nand flash/sd等啟動裝置中拷貝前16k的**到iram中,那麼當我們的程式超過16k怎麼辦?那就需要我們在前16k的**中將整個程式完完整整地拷貝到dram等其他更大儲存空間,然後再跳轉到dram中繼續執行我們的**,這個拷貝然後跳轉的過程就叫重定位。本章中我們主要學習如何重定位,但是並不會涉如何使用到dram,而是簡單地將**從iram的0xd0020010處拷貝到iram的0xd0024000處,然後跳轉到0xd0024000處繼續執行我們的**。
鏈結指令碼:鏈結指令碼就是程式鏈結時的參考檔案,其主要目的是描述如何把輸入檔案中的段(section)對映到輸出檔案中,並控制輸出檔案的儲存布局。鏈結指令碼的基本命令式sections命令,乙個sections命令內部包含乙個或多個段,段(section)是鏈結指令碼的基本單元,它表示輸入檔案中的某個段是如何放置的。
鏈結指令碼的標準格式如下:
sections
/*link.lds*/
sections
.data :
bss_start = .;
.bss :
bss_end = .;
}1) 在鏈結指令碼中,單獨的點號(.)代表了當前位置,. = 0xd0024000; 表示程式的鏈結位址是0xd0024000;
2) link.lds中的.text 、 .data 、 .bss分別是text段、data段、bss段的段名(這些段名並不是固定的,是可以隨便起的)。.text段包含的內容是start.o和其餘**中所有的text段;.data段包含的內容是**中所有的data段;.bss段包含的內容是**中所有的bss段。
3) bss_start和bss_end儲存的是bss段的起始位址和結束位址,在start.s中會被用到。
/*main.c*/
#define gpj2con (*(volatile unsigned long *) 0xe0200280)
#define gpj2dat (*(volatile unsigned long *) 0xe0200284)
// 延時函式
void delay(unsigned long count)
void main()
//led 閃爍
}5、重定位**到dram
dram0對應的位址是0x2000_0000~0x3fff_fff共512m,dram1對應的位址是0x4000_000~0x7fff_ffff共1g。
s5pv210的啟動過程
s5pv210的啟動方式 sd0啟動,sd2啟動,usb啟動 上電後,先從64kb的irom中讀取預先設定的 bl0,這部分 初始化了soc 內部的東西,包括關看門狗,初始化指令icache,初始化棧,初始化堆,初始化塊裝置賦值函式,設定soc時鐘系統,賦值bl1到內部iram 16kb 檢查bl1...
S5PV210啟動過程分析
剛剛接觸 s5pv210 看了官方的資料手冊感覺跟以前用的 stm32 微控制器根本不在乙個層面上,當然兩者的用途不同,不具備可比性。可能之前習慣使用 stm32 等微控制器,現在接觸 s5pv210 還有點不太適應,尤其搞不懂 s5pv210 norflash 很貴,所以現在很多的嵌入式系統傾向於...
S5PV210的啟動詳解2
disable the watch dog timer initialize the instruction cache initialize the stack region see memory map on chap 2.5 initialize the heap region.see mem...