娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

S5PV210的啟動過程

發布者:alpha12最新更新時間:2024-12-03 來源: cnblogs關鍵字:S5PV210  啟動過程  IRAM 手機看文章 掃描二維碼
隨時隨地手機看文章

初步認識IROM和IRAM

S5PV210含有一個內64K的IROM和96K的IRAM,系統啟動時主要依靠它們,IROM和IRAM所處的存儲空間見下圖:

image

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  啟動過程  IRAM 引用地址:S5PV210的啟動過程

上一篇:S5PV210點亮LED
下一篇:S5PV210控制蜂鳴器

推薦閱讀最新更新時間:2025-05-20 20:23

S5PV210啟動燒寫過程信息
記錄下S5PV210啟動燒寫過程信息,對分析系統啟動及燒寫流程大有幫助: 通過串口燒的信息: OEMInitLIb is Success +++InitializeInterrupt() ---InitializeInterrupt() +++OTGDEV_InitOtg OTGDEV_SetSoftDisconnect ---OTGDEV_InitOtg TSR START ADDRESS : 0x47700000 TSR IMAGE SIZE : 0x00080000 DOWNLOADING IS COMPLETED Microsoft Windows CE Bootloader Common Library Version
[單片機]
S5PV210版本NDT嵌入式Linux主機目錄分布及開發流程簡要說明
開發才用win10宿主機+VMWare12.5+Ubuntu14.04 LTS虛擬機環境。 1、文件目錄介紹 開發機器所建用戶名為administrator,機器密碼為******。 嵌入式QT目錄:/home/administrator/linuxtools/armqt/ tftp共享目錄:/home/administrator/tftp 根文件系統: /home/administrator/rootfs 內核目錄: /home/administrator/kernel/linux-2.6.35.7 工程目錄: /home/administrator/NDT-2015/NDT-F 2、
[單片機]
S5PV210在Linux下如何編寫中斷驅動
我使用了兩種驅動開發的模型來寫了smart210上的按鍵驅動程序,這里做一下總結以及提供他人參考以及建議和改進,最后一個原因是自己很久沒有寫過博客了,現在想分享一下linux驅動開發程序的編寫。 首先是Linux的中斷處理機制。裸機開發中,通過中斷標識一個函數指明該函數是中斷處理函數,在編譯器處理時候,也會對該函數的指針保存或特殊處理,當把該程序燒寫到板子的時候,會把這個中斷函數的地址加載到指定的地址,當中斷發生時,通過寄存器保存的該函數的指針,進行中斷函數地處理。但是在Linux中采用了類似信號處理這一種機制,在Linux的底層,當有中斷發生時,就會有板級的代碼產生一個指定的中斷號,我們的中斷驅動就是在內核中注冊當接收的該中
[單片機]
S5PV210開發 -- 啟動流程
講完啟動模式、燒寫更新,接下來我們看一下啟動流程。 參看:S5PV210開發 -- 燒寫/啟動模式 參看:S5PV210開發 -- 通過 SD 卡燒寫 參看:S5PV210開發 -- 通過 DNW、fastboot 燒寫 參看:DM368開發 -- Bootloader 開發(轉畢設) 學習S5PV210 啟動流程部分,需要查看芯片手冊和相關的文檔。 下載:相關文檔 一、iROM啟動方式簡介 在講燒寫/啟動模式的時候其實已經提到,S5PV210 采用 iROM 啟動方式進行啟動,支持從MoviNAND/iNand, MMC/SD Card ,pure Nand, eMMC, eSSD, UART and U
[單片機]
<font color='red'>S5PV210</font>開發 -- <font color='red'>啟動</font>流程
uboot 2014.04 運行過程記錄
uboot啟動流程分析,針對S5PV210 BL1階段,SPL,u-boot-spl.bin 1、首先運行arch/arm/cpu/armv7/start.S 里面的_start函數,進行異常向量表設置,然后跳轉到reset復位處理函數,設置處理器SVC模式,關閉IRQ和FIQ中斷。設置cp15協處理器   的SCTRL寄存器V(bit13)為0,設置異常向量表在0x00000000-0x0000001C,設置異常向量表地址為_start。跳轉到cpu_init_cp15初始化協處理器,清除TLB,關閉cache,   關閉MMU,如果沒有定義CONFIG_SYS_ICACHE_OFF則打開icache。繼續執行cpu_ini
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 屏东县| 合作市| 德清县| 赣州市| 资讯 | 康平县| 德昌县| 铜陵市| 沙坪坝区| 香河县| 贡嘎县| 上虞市| 武平县| 宜君县| 小金县| 丰宁| 丘北县| 伊金霍洛旗| 驻马店市| 广南县| 德庆县| 景东| 庆城县| 修文县| 资源县| 万州区| 陆良县| 宣威市| 抚远县| 玉树县| 桂东县| 福清市| 益阳市| 蒙山县| 闸北区| 华亭县| 汉川市| 含山县| 临漳县| 大理市| 榆社县|