初步認識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啟動模式
OM[5:4] = 0b10即可選擇UART/USB啟動模式此時IROM代碼運行完畢后,會先嘗試從UART 啟動,若失敗則會嘗試從USB啟動。若失敗則會根據OM[3:0]選擇相應的啟動介質再次嘗試啟動。
UART啟動時,必須在S5PV210上電前將串口連接好,上位機使用dnw工具來發送啟動代碼可執行文件。本教材中使用USB啟動方式作為調試,因此不詳細探討UART啟動方式。
1、USB啟動方式必須借助dnw工具,教材中使用dnw v0.60c。
2、打開dnw軟件,將dnw中USB下載地址設置為0xd0020010。
3、復位開發板。
4、若是初次使用則Windows會彈出發現新硬件圖標,索引安裝開發板dnw USB驅動即可。若已經安裝驅動,則dnw會顯示USB:OK,表示USB連接已經成功。
5、dnw菜單中USB Port->Transmit,選擇編譯好的bin文件即可。USB download完成后S5PV210會即刻跳轉到0xd0020010處執行。
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
{
sections-command
sections-command
}
/*link.lds*/
SECTIONS
{
. = 0xD0024000;
.text : {
start.o
* (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.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中會被用到。
data、text、bss段:
1) data段:數據段(datasegment)通常是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬于靜態內存分配。
2) text段:代碼段通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀,某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。
3) bss段:指用來存放程序中未初始化的全局變量的一塊內存區域。BSS是英文BlockStarted by Symbol的簡稱。當我們的程序有全局變量是,它是放在bss段的,由于全局變量默認初始值都是0,所有我們需要手動清bss段。
/*start.S*/
.global _start
_start:
// 關閉看門狗
ldr r0, =0xE2700000
mov r1, #0
str r1, [r0]
// 設置棧,以便調用c函數
ldr sp, =0xD0037D80
// 重定位
// _start當前所位于的地址:0xd0022000
adr r0, _start
// _start的鏈接地址:0xd0024000
ldr r1, =_start
// bss段的起始地址
ldr r2, =bss_start
cmp r0, r1
beq clean_bss
copy_loop:
ldr r3, [r0], #4 // 源
str r3, [r1], #4 // 目的
cmp r1, r2
bne copy_loop
// 清bss段
clean_bss:
ldr r0, =bss_start
ldr r1, =bss_end
cmp r0, r1
beq run_on_dram
mov r2, #0
clear_loop:
str r2, [r0], #4
cmp r0, r1
bne clear_loop
// 跳轉
run_on_dram:
ldr pc, =main
/*main.c*/
#define GPJ2CON (*(volatile unsigned long *) 0xE0200280)
#define GPJ2DAT (*(volatile unsigned long *) 0xE0200284)
// 延時函數
void delay(unsigned long count)
{
volatile unsigned long i = count;
while (i--);
}
void main()
//LED 閃爍
{
GPJ2CON = 0x00001111;
// 配置引腳
while(1)
// 閃爍
{
GPJ2DAT = 0;
// LED on
delay(0x100000);
GPJ2DAT = 0xf;
// LED off
delay(0x100000);
}
}
5、重定位代碼到DRAM
DRAM0對應的地址是0x2000_0000~0x3FFF_FFF共512M,DRAM1對應的地址是0x4000_000~0x7FFF_FFFF共1G。
上一篇:S5PV210點亮LED
下一篇:S5PV210控制蜂鳴器
推薦閱讀最新更新時間:2025-04-19 06:14




設計資源 培訓 開發板 精華推薦
- 適用于 ±10 V 輸入的 12 位、300 kSPS、單電源、完全隔離的數據采集系統
- NEWTEC-NTBMS: NewTec電池管理系統(BMS)參考設計
- ADA4571R-EBZ,基于ADA4571磁阻傳感器的軸端評估板
- 【立創開發板】梁山派RoboMaster擴展板
- 具有 I2C 基準的 LTC2655IGN-H12 四通道、12 位軌至軌 DAC 的典型應用
- LT8631EFE 1MHz、24V、0.5A 降壓轉換器的典型應用電路
- AD8534ARZ-REEL 單電源、立體聲耳機驅動器的典型應用
- QFP144封裝的SPC560系列512KB / 1.5MB器件的子板/適配器板
- OP284FSZ-REEL7 高端負載電流監控器的典型應用
- AL8807Q 高效 30V、1.3A 汽車級降壓 LED 驅動器的典型應用
- 下載白皮書 答題贏好禮|TE《智能監控應用連接解決方案指南》
- DIY數字示波器 V1.0
- 炎炎盛夏,EEWORLD社區6月明星人物出爐嘍!
- 拆招有禮:洞悉電子產品中的大數據,招招解決測量難題!Keysight DAQ970系列活動
- 有獎直播 | 英飛凌新型固態隔離器的創新技術與應用設計
- PI 有獎直播:在無需DC-DC變換器的多路輸出電源設計中實現高效率和出色的輸出調整率
- 【NI有獎直播】當DeepSeek遇到LabVIEW【進入直播頁面,掃碼看回放】
- 駿龍科技攜手ADI有獎直播:隔離系統設計的隱藏成本
- 有獎問答 | TE 互連解決方案助力智慧城市智能監控
- 下載有禮:看“智””造“熱”偵探 FLIR ETS320 紅外熱像儀如何糾錯!