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

歷史上的今天

今天是:2024年09月08日(星期日)

2021年09月08日 | S3C2440 Boot Loader引導(dǎo)代碼功能簡述

發(fā)布者:rho27 來源: eefocus關(guān)鍵字:S3C2440  Boot  Loader 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

【前言】開始學(xué)習(xí)ARM的時候,基本上都要從裸機(jī)編程開始。為了減低入門的門檻,很多時候只要修改模板里的主函數(shù)main.c,可是,久而久之,就會產(chǎn)生些疑問,問什么下載了這些C代碼編譯鏈接生成出來的BIN就能在ARM上跑了呢?原因就在于,有幾個文件已經(jīng)不聲不響的幫我們提前干了很多的事,而這些事C語言是干不了的,只能由匯編完成,美其名曰:ARM匯編引導(dǎo)代碼。其實(shí)不光“裸奔”需要,Boot Loader也同樣需要。那么到底這些匯編幫我干了些什么呢?筆者就結(jié)合S3C2440的Boot Loader引導(dǎo)代碼簡單分析整理下。


【一】變量及相關(guān)宏定義

開始首先用GET(相當(dāng)于C語言里的#include)偽指令包含進(jìn)來了三個頭文件option.inc、memcfg.inc、2440addr.inc,其中option.inc里定義芯片相關(guān)的配置,memcfg.inc里定義存儲器配置,2440addr.inc里定義了寄存器符號。


USERMODE    EQU 0x10


FIQMODE      EQU0x11


IRQMODE      EQU0x12


SVCMODE      EQU0x13


ABORTMODE   EQU 0x17


UNDEFMODE   EQU 0x1b


MODEMASK    EQU 0x1f 


NOINT         EQU0xc0


上面的幾行進(jìn)行了一些處理器模式的定義,下面定義了一些各模式下的常量,等到了【四】這一塊再詳細(xì)說。


UserStack   EQU(_STACK_BASEADDRESS-0x3800);0x33ff4800 ~  


SVCStack    EQU(_STACK_BASEADDRESS-0x2800);0x33ff5800 ~


UndefStack  EQU (_STACK_BASEADDRESS-0x2400);0x33ff5c00 ~


AbortStack  EQU (_STACK_BASEADDRESS-0x2000);0x33ff6000 ~


IRQStack    EQU(_STACK_BASEADDRESS-0x1000);0x33ff7000 ~


FIQStack    EQU(_STACK_BASEADDRESS-0x0);0x33ff8000 ~


注:_STACK_BASEADDRESS在option.inc中有相關(guān)定義


接下來的定義要到最后才能用到,THUMBCODE作為全局變量,其實(shí)就是一個指示的作用,在跳轉(zhuǎn)到main前進(jìn)行模式的切換。


下面的宏定義可能就不太好理解了,這個是一個中斷跳轉(zhuǎn)的工具,到【二】這再解釋。


MACRO


$HandlerLabel HANDLER $HandleLabel


$HandlerLabel        ;標(biāo)號


sub sp,sp,#4          ;(1)減少sp(用于存放轉(zhuǎn)跳地址)


stmfd sp!,{r0}         ;(2)把工作寄存器壓入棧


ldr     r0,=$HandleLabel   ;將HandleXXX的址址放入r0


ldr     r0,[r0]              ;把HandleXXX所指向的內(nèi)容(也就是中斷程序的入口)放入r0


str     r0,[sp,#4]            ;(3)把中斷服務(wù)程序(ISR)壓入棧


ldmfd   sp!,{r0,pc} ;(4)用出棧方式恢復(fù)r0原值和為pc設(shè)定新值(即完成了到ISR的轉(zhuǎn)跳)


MEND


還有一些,留到后面用到的時候再說。


【二】中斷向量表以及其相關(guān)跳轉(zhuǎn)設(shè)置

在上述定義完成之后就算真正意義來到了函數(shù)的入口處,這里處理的比較復(fù)雜,會有大小


端的處理,因?yàn)閷ξ覀兝斫庖龑?dǎo)代碼沒多少作用,暫且將其簡化處理掉。省略這些之后,其實(shí)入口就是這幾行代碼:


b ResetHandler   ;上電復(fù)位中斷;0x00


b HandlerUndef   ;handlerfor Undefined mode  ;0x04


b HandlerSWI     ;handler for SWI interrupt  ;0x08


b HandlerPabort ;handler for PAbort    ;0x0c


b HandlerDabort ;handler for DAbort    ;0x10


b .                ;其實(shí)是個死循環(huán)   ;0x14


b HandlerIRQ     ;handler for IRQ interrupt  ;0x18


b HandlerFIQ      ;handler for FIQ interrupt  ;0x1c


這就是我們有名的中斷向量表!中斷向量表必須位于啟動代碼的開始部分連續(xù)8*4字節(jié)的連續(xù)空間,它是用戶程序與啟動代碼之間以及啟動代碼的各部分之間聯(lián)系的紐帶。它由一個一個的跳轉(zhuǎn)函數(shù)組成,它就象一個普通的散轉(zhuǎn)函數(shù),只不過散轉(zhuǎn)的過程中有硬件機(jī)制參與,當(dāng)系統(tǒng)發(fā)生異常時,ARM 處理器會通過硬件機(jī)制強(qiáng)制將PC 指針指向中斷向量表中對應(yīng)的異常跳轉(zhuǎn)函數(shù)存儲的地址,然后程序會跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序去執(zhí)行。因?yàn)槲覀冮_機(jī)的第一個中斷是上電復(fù)位,所以進(jìn)來之后首先是跳轉(zhuǎn)到ResetHandler中斷函數(shù)里去進(jìn)行一些必要的系統(tǒng)設(shè)置,故在0x00處就是bResetHandler。


對于ARM的中斷,其實(shí)有兩種模式(可通過相關(guān)寄存器設(shè)置):向量中斷模式和普通中斷模式。簡單的區(qū)分這兩個就是:對于向量中斷模式,當(dāng)中斷發(fā)生時,CPU會跳轉(zhuǎn)到向量表中相應(yīng)中斷類型的表項(xiàng),直接把中斷服務(wù)例程的起始地址送到PC,這個有個優(yōu)點(diǎn)就是速度快;對于普通中斷模式,在跳轉(zhuǎn)到中斷向量表之后還要進(jìn)行一次跳轉(zhuǎn)查詢,最紅由返回ISR的最紅中斷處理函數(shù)的地址給PC,現(xiàn)在就可以說說【一】中宏定義$HandlerLabel HANDLER $HandleLabel的作用了。這個宏是用于第一次查表過程的實(shí)現(xiàn)中斷向量的重定向,在_ISR_STARTADDRESS里定義的第一級中斷向量表是采用型如Handle###的方式的,而在程序的開始處采用的是b Handler###的方式,在這里Handler###就是通過HANDLER這個宏和Handle###建立聯(lián)系的.所以在后面其實(shí)還有一段初始化程序作為宏展開。


HandlerFIQ      HANDLER HandleFIQ


HandlerIRQ      HANDLER HandleIRQ


HandlerUndef    HANDLER HandleUndef


HandlerSWI      HANDLER HandleSWI


HandlerDabort   HANDLER HandleDabort


HandlerPabort   HANDLER HandlePabort


這種方式的優(yōu)點(diǎn)就是正真定義的向量數(shù)據(jù)在內(nèi)存空間里,而不是在ENTRY處的ROM空間里,這樣就可以在程序里靈活的改動向量的數(shù)據(jù)了.這段程序用于把中斷服務(wù)程序的首地址裝載到pc中,也可以稱之為“加載程序”。


接著跳轉(zhuǎn)那一塊繼續(xù)說,因?yàn)橥獠恐袛鄮缀醵际峭ㄟ^IRQ引入的(其實(shí)FIQ理論上也可以,但是在linux幾乎用不到),于是便跳到了HandleIRQ,但是此時HandleIRQ又是多少呢,在程序的下面還有一段也必須拿上來說:


ldr r0,=HandleIRQ        ;This routine is needed


ldr r1,=IsrIRQ             ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c


str r1,[r0]


可見,HandleIRQ和IsrIRQ其實(shí)等價(jià)了!于是可以把IsrIRQ處的處理函數(shù)拿來分析一下:


IsrIRQ


sub sp,sp,#4            ;給PC寄存器保留 reserved for PC


stmfd sp!,{r8-r9}              ;把r8-r9壓入棧


;把INTOFFSET的地址裝入r9, INTOFFSET是一個內(nèi)部的寄存器,存著中斷的偏移


ldr r9,=INTOFFSET


ldr r9,[r9]                  ;I_ISR


ldr r8,=HandleEINT0    ;這就是我們第二個中斷向量表的入口的,先裝入r8


add r8,r8,r9,lsl #2  ;地址對齊,每個中斷向量占4個字節(jié),即isr = IvectTable + Offeset * 4


ldr r8,[r8]    ;裝入中斷服務(wù)程序的入口


str r8,[sp,#8]   ;把入口也入棧,準(zhǔn)備用舊招


ldmfd sp!,{r8-r9,pc} ;彈出棧,順便把r8彈出到PC了,跳轉(zhuǎn)成功!


 


【三】初始化硬件

終于可以開始對硬件真正的干涉了,ARM要能形成一個可以供C語言工作的環(huán)境,還要


要干下面的幾件事:


1、 關(guān)看門狗,看門狗是用來解決軟件崩潰的,這里不需要


ldr r0,=WTCON     


ldr r1,=0x0        


str r1,[r0]


2、關(guān)中斷,引導(dǎo)代碼里不需要處理中斷事件,除了上電復(fù)位中斷其它都交給C的主函數(shù)完成


ldr r0,=INTMSK


ldr r1,=0xffffffff 


str r1,[r0]


3、關(guān)子中斷,同上


ldr r0,=INTSUBMSK


ldr r1,=0x7fff  


str r1,[r0]


4、減少PLL的lock time,調(diào)整LOCKTIME寄存器


ldr r0,=LOCKTIME


ldr r1,=0xffffff


str r1,[r0]


5、設(shè)定PLL,這個直接關(guān)系到板子的快慢,不過也不是越快越好,除了要考慮功耗外還要滿足下面的公式:


Fpllo=(m*Fin)/(p*2^s)


m=MDIV+8,p=PDIV+2,s=SDIV(1<=P<=62, 1<=M<=248)


Fpllo必須大于200Mhz小于600Mhz


Fpllo*2^s必須小于1.2GHz


PLLCON設(shè)定中的M_DIV P_DIV S_DIV是取自option.inc中的


6、設(shè)置系統(tǒng)存儲寄存器,其中SMRDATA在程序段的后面有詳細(xì)描述,這里知道作用就好


adrl r0, SMRDATA 


ldr r1,=BWSCON  ;BWSCON Address


add r2, r0, #52  ;SMRDATA數(shù)據(jù)的結(jié)束地址,共有52字節(jié)的數(shù)據(jù)


0


ldr r3, [r0], #4


str r3, [r1], #4


cmp r2, r0


bne %B0  ;%表示搜索,B表示反向-back(F表示向前-forward),0為局部標(biāo)號(0~99)


 


【四】 初始化堆棧

ARM 有7 種模式,用戶模式,快速中斷模式,中斷模式,管理模式,中止模式,未定義模式和系統(tǒng)模式。系統(tǒng)堆棧的初始化主要是給各個處理器模式分配堆棧空間。堆棧是為中斷或程序跳轉(zhuǎn)服務(wù)的,當(dāng)發(fā)生中斷或程序跳轉(zhuǎn)時,需要將當(dāng)前處理器的狀態(tài)及一些參數(shù)保持在堆棧中,當(dāng)中斷處理完畢以后或程序執(zhí)行完后返回時,再將堆棧保存的現(xiàn)場數(shù)據(jù)進(jìn)行恢復(fù),以保證原來的程序正確運(yùn)行。在【一】中已經(jīng)提到了一些與堆棧有關(guān)的變量定義。可以這樣簡單說,堆棧的初始化分為兩個步驟:1、指定堆棧的位置和大小,這些在【一】中已經(jīng)完成了;2、將各個模式下的堆棧指針指向相應(yīng)的棧,下面做的就是這個工作。


InitStacks


mrs r0,cpsr


bic r0,r0,#MODEMASK


orr r1,r0,#UNDEFMODE|NOINT


msr cpsr_cxsf,r1  ;UndefMode


ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00


orr r1,r0,#ABORTMODE|NOINT


msr cpsr_cxsf,r1  ;AbortMode


ldr sp,=AbortStack ; AbortStack=0x33FF_6000


orr r1,r0,#IRQMODE|NOINT


msr cpsr_cxsf,r1  ;IRQMode


ldr sp,=IRQStack  ; IRQStack=0x33FF_7000


orr r1,r0,#FIQMODE|NOINT


msr cpsr_cxsf,r1 ;FIQMode


ldr sp,=FIQStack ; FIQStack=0x33FF_8000


bic r0,r0,#MODEMASK|NOINT


orr r1,r0,#SVCMODE


msr cpsr_cxsf,r1 ;SVCMode


ldr sp,=SVCStack  ; SVCStack=0x33FF_5800


注:仔細(xì)看看發(fā)現(xiàn)沒有初始化user模式下的堆棧,為什么呢?很明顯嘛,你一開始就運(yùn)行在了user模式下了!


 


 


【五】C主函數(shù)接管前的數(shù)據(jù)搬移及入口設(shè)定

其實(shí)一直還有個東西沒說,這個在進(jìn)入代碼段前就定義了,我提到了,后面用到會詳細(xì)說,


現(xiàn)在是時候了。在【一】時用IMPORT偽指令引入了|Image

RO

RO

Base|  |Image

RO

RO

Limit|...這些變量是通過ADS、RVDS,MDK等工具的工程設(shè)置里面設(shè)定的RO Base和RW Base設(shè)定的,這個應(yīng)該有印象,可能很多人感覺這個沒用,其實(shí)很有用呢!那為什么要引入這玩意呢,最簡單的用處是可以根據(jù)它們拷貝自己,這些變量是編譯器生成的。


RO,RW, ZI這三個段都保存在Flash中,但RW,ZI在Flash中的地址肯定不是程序運(yùn)行時變量所存儲的位置,因此我們的程序在初始化時應(yīng)該把Flash中的RW,ZI拷貝到RAM的對應(yīng)位置。一般情況下,我們可以利用編譯器替我們實(shí)現(xiàn)這個操作。比如我們跳轉(zhuǎn)到main()時,使用 b  __Main,編譯器就會在__Main和Main之間插入一段匯編代碼,來替我們完成RW,ZI段的初始化。 如果我們使用b  Main, 那么初始化工作要我們自己做。編譯器會生成如下變量告訴我們RO,RW,ZI三個段應(yīng)該位于什么位置,但是它并沒有告訴我們RW,ZI在Flash中存儲在什么位置,實(shí)際上RW,ZI在Flash中的位置就緊接著RO存儲。


IMPORT  |Image

RO

RO

Base| ; Base of ROM code


IMPORT  |Image

RO

RO

Limit|  ; End of ROM code (=start of ROM data)


IMPORT  |Image

RW

RW

Base|   ; Baseof RAM to initialise


IMPORT  |Image

ZI

ZI

Base|   ; Base and limit of area


IMPORT  |Image

ZI

ZI

Limit| ; to zero initialize


在程序的最后,通過下面的代碼就可以進(jìn)入main()了。


[ :LNOT:THUMBCODE;ifthumbcode={false} bl main   L代表logic變量


     bl Main       ;Don't use main() because ......


     b .           ;注意小圓點(diǎn)         


 ]


 [ THUMBCODE        ;for start-up code for Thumb mode


     orr lr,pc,#1


     bx lr


     CODE16


     bl Main        ;Don't use main() because ......


     b .          ;注意小圓點(diǎn)


     CODE32


 ]


現(xiàn)在,就可以順便回顧下【一】中提到的THUMBCODE了,這不就是一個指示的作用嗎?!

【后記】總的來說,ARM光初始化都要這樣折騰,如果這個都折騰會了,后面的就慢慢來吧!

關(guān)鍵字:S3C2440  Boot  Loader 引用地址:S3C2440 Boot Loader引導(dǎo)代碼功能簡述

上一篇:s3c2440的Memory Controller與外設(shè)地址線錯位連接分析
下一篇:s3c2440學(xué)習(xí)之路-001 匯編點(diǎn)亮led

推薦閱讀

王傳福正把汽車駛?cè)敫偪竦馁惖馈?比亞迪(42.600, 0.10, 0.24%)雖然是全球新能源汽車銷量冠軍,但遭遇日益增多的強(qiáng)勁競爭對手圍攻而面臨守擂壓力陡升。?9月5日,比亞迪舉行全球開發(fā)者大會,希望作為智能汽車硬件標(biāo)準(zhǔn)平臺提供商,開放汽車所有的傳感系統(tǒng)和執(zhí)行系統(tǒng)。比亞迪董事長兼總裁王傳福稱,這是汽車史上的第一次開發(fā)者大會,比亞迪采取這樣的策...
據(jù)彭博社報(bào)道,將于2020年發(fā)布的新款 iPhone 有望增加屏下 Touch ID 指紋識別傳感器。盡管包括三星、華為、一加和其他安卓手機(jī)制造商已經(jīng)可以為智能手機(jī)提供屏下 Touch ID功能,但蘋果還在為此而努力。蘋果此前曾表示,面部識別比指紋識別更安全。將于北京時間9月11日發(fā)布的新款iPhone上預(yù)計(jì)也只有Face ID功能。但目前看來,蘋果可能想給手機(jī)用戶...
  在現(xiàn)代化智能制造生產(chǎn)線中,越來越多的企業(yè)講究柔性化生產(chǎn)。工業(yè)自動化是當(dāng)今制造業(yè)發(fā)展的大趨勢,機(jī)器人產(chǎn)業(yè)將是一個陽光產(chǎn)業(yè),未來企業(yè)發(fā)展的核心是自動化、智能化,人類將從單調(diào)繁雜的體力勞動中解放出來,并從事更加富有創(chuàng)造性的工作。   自動生產(chǎn)線和自動化程度高的智能化加工設(shè)備已經(jīng)成為今后中小企業(yè)工廠技術(shù)改造的一個必然趨勢。單一和普...
初始化子程序:START0x7C; I2C子地址0xEA;ICSET,軟件復(fù)位芯片0xC0;MODSET,關(guān)顯示0xF0;BLKCTL,關(guān)閃爍0xA3;DISCTL,80Hz Line inversion,High Power mode0xE8;ICSET,清復(fù)位bit1STOP顯示刷新子程序:START0x7C;I2C子地址0xF0;BLKCTL,關(guān)閃爍0xA3;DISCTL,80Hz Line inversion,High Power mode0xE8或0xEC;ICSET,顯存高位地址為0或10...

史海拾趣

問答坊 | AI 解惑

DSP C語言編程的要點(diǎn)

原文地址:http://www.hellodsp.com/bbs/viewthread.php?tid=7756&extra=page%3D1 年初到現(xiàn)在,接觸DSP已經(jīng)半年了,由于公司沒有人指導(dǎo),做了這么久都沒出什么大的成果,也走了不少的彎路。以前做單片機(jī)用C編過一些程序,個人覺得還可以。現(xiàn)在看來 ...…

查看全部問答∨

Driver Examples on the DM642 EVM.pdf

Driver Examples on the DM642 EVM.pdf…

查看全部問答∨

GSM系統(tǒng)掉話分析

GSM系統(tǒng)掉話分析 本文介紹了GSM話音掉話產(chǎn)生的種類和原因,并給出了降低掉話率的若干措施。 關(guān)鍵詞 掉話 切換 天線 1 前言 掉話率在移動通信網(wǎng)中是一項(xiàng)非常重要的指標(biāo),掉話率的高低在一定程度上體現(xiàn)了移動 網(wǎng)通信質(zhì)量的優(yōu)劣。不同廠家的設(shè)備 ...…

查看全部問答∨

在線等待,用單片機(jī)模擬標(biāo)準(zhǔn)ps/2鍵盤,winxp系統(tǒng),開機(jī)初始化不了!!1急

在線等待,用單片機(jī)模擬標(biāo)準(zhǔn)ps/2鍵盤,winxp系統(tǒng),開機(jī)初始化不了!!1急 用單片機(jī)模擬標(biāo)準(zhǔn)ps/2鍵盤,c8051f020片子, 上電,往主機(jī)發(fā)送鍵盤自檢通過標(biāo)志0xAA,然后根據(jù)鍵盤發(fā)送過來的數(shù)據(jù)發(fā)送不同的數(shù)據(jù), 結(jié)果現(xiàn)在系統(tǒng)開機(jī)自檢檢不到鍵盤, 如 ...…

查看全部問答∨

應(yīng)急燈原理圖(使用MAX1924V和MAX8970A)

各位XDJM:   附件是我設(shè)計(jì)的應(yīng)急燈原理圖,請大家指點(diǎn)!…

查看全部問答∨

stm32rtc晶振起振問題

做了一批板子,焊了幾個 外部晶振32.768是6p的  剛開始可以起振  可是放了一段時間 就很難起振了  偶爾可以  外部接的10pf電容  什么問題呀這是  為什么一會好一會壞呢 while ...…

查看全部問答∨

用DSP 28335編程序的時候,內(nèi)存空間不足怎么辦?

我用DSP編程序的時候,因?yàn)橐M(jìn)行矩陣運(yùn)算,所以要建一個10000左右的float數(shù)組,但是總是報(bào)錯,說page 1 的RAML4 空間不足。可是把RAML4的length增加,然后把RAML5-6的其實(shí)地址相應(yīng)延后后,有會出現(xiàn)燒錄后的warning提示,并且使用不能。經(jīng)過試驗(yàn),R ...…

查看全部問答∨

基于DSP的三相變頻變幅逆變電源

2012 TI C2000及MCU大獎賽,本科組,南華大學(xué),控制系統(tǒng)類,三相變頻變幅逆變電源. $(\'swf_OrE\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \' ...…

查看全部問答∨

經(jīng)過驗(yàn)證并測試的 電磁兼容性(EMC)RS-485通信解決方案

實(shí)踐中用到RS485通訊時可以學(xué)習(xí)下!…

查看全部問答∨

一博即將參加2014 IIC-China展覽會

     第十九屆IIC-China 2014電子工程展覽會暨研討會,將在2014年9月2日-5日在深圳會展中心舉辦。深圳市一博科技有限公司將攜新品參加本次展會。感謝您一直以來對一博科技的支持和關(guān)注,我們歡迎您解釋蒞臨一博科技展臺參觀指 ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 福海县| 阳朔县| 铜陵市| 西乌珠穆沁旗| 都昌县| 陆良县| 多伦县| 武隆县| 博白县| 古蔺县| 姚安县| 文昌市| 贵港市| 彭山县| 始兴县| 新密市| 巴东县| 沅陵县| 临海市| 稷山县| 巩留县| 中西区| 麻栗坡县| 高州市| 南澳县| 揭东县| 宝丰县| 乾安县| 福海县| 黑水县| 无棣县| 西城区| 安康市| 利川市| 桐柏县| 贵州省| 澄城县| 旺苍县| 满洲里市| 衡山县| 布拖县|