女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]開始start.s分析,根據(jù)S3C2410來(lái)跟蹤代碼,參考了S3C2410的datasheet和網(wǎng)上各個(gè)帖子一般來(lái)說(shuō),大家都是從start.s來(lái)分析UBOOT,但是事實(shí)是流程是從makefile中來(lái)的,也就是說(shuō)是在敲入make smdk2410_config和make all后

開始start.s分析,根據(jù)S3C2410來(lái)跟蹤代碼,參考了S3C2410的datasheet和網(wǎng)上各個(gè)帖子

一般來(lái)說(shuō),大家都是從start.s來(lái)分析UBOOT,但是事實(shí)是流程是從makefile中來(lái)的,也就是說(shuō)是在敲入make smdk2410_config和make all后才進(jìn)入start.s中,makefile在這里不做分析,韋東山的那本書有詳細(xì)的說(shuō)明,這里要提到的是makefile傳進(jìn)來(lái)的,我們?cè)?UBOOT中所設(shè)計(jì)到的LDFLAGS,這個(gè)標(biāo)志確定了連接方式,其中的-T board/smd2410/U-Boot.lds -Ttext 0x33F8000(展開后的)指定了程序的布局和地址,U-Boot.lds如下(參考martree的專欄):

/*******************************************************/

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm"")
;指定輸出可執(zhí)行文件是elf格式,32位ARM指令,小端
OUTPUT_ARCH(arm)
;指定輸出可執(zhí)行文件的平臺(tái)為ARM
ENTRY(_start)
;指定輸出可執(zhí)行文件的起始代碼段為_start.
SECTIONS
{
. = 0x00000000 ; 指明目標(biāo)代碼的起始地址從0x0位置開始,"."代表的是當(dāng)前位置
. = ALIGN(4) ; 代碼以4字節(jié)對(duì)齊
.text : ;指定代碼段
{
cpu/arm920t/start.o (.text) ; 代碼的第一個(gè)代碼部分,指明start.s是入口程序代碼,被放到代碼段的開頭
*(.text) ;其它代碼部分
}
. = ALIGN(4)
.rodata : { *(.rodata) } ;指定只讀數(shù)據(jù)段,RO段
. = ALIGN(4);
.data : { *(.data) } ;指定讀/寫數(shù)據(jù)段,RW段
. = ALIGN(4);
.got : { *(.got) } ;指定got段, got段式是uboot自定義的一個(gè)段, 非標(biāo)準(zhǔn)段
__u_boot_cmd_start = . ;把__u_boot_cmd_start賦值為當(dāng)前位置, 即起始位置
.u_boot_cmd : { *(.u_boot_cmd) } ;指定u_boot_cmd段, uboot把所有的uboot命令放在該段.
__u_boot_cmd_end = .;把__u_boot_cmd_end賦值為當(dāng)前位置,即結(jié)束位置
. = ALIGN(4);
__bss_start = .; 把__bss_start賦值為當(dāng)前位置,即bss段的開始位置
.bss : { *(.bss) }; 指定bss段
_end = .; 把_end賦值為當(dāng)前位置,即bss段的結(jié)束位置
}

/****************************************/

從這里可以看出start.s是程序的入口點(diǎn),下面是start.s代碼

//global聲明一個(gè)符號(hào)可被其它文件引用,相當(dāng)于聲明了一個(gè)全局變量,.globl與.global相同。
//該部分為處理器的異常處理向量表。地址范圍為0x0000 0000 ~ 0x0000 0020,剛好8條指令。

.globl _start
_start: b reset /*跳轉(zhuǎn)到reset標(biāo)號(hào)執(zhí)行*/
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq


// .word偽操作用于分配一段字內(nèi)存單元(分配的單元都是字對(duì)齊的),并用偽操作中的expr初始化。.long與.int作用與之//相同。
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq

.balignl 16,0xdeadbeef

/*
* Startup Code (reset vector)
*
* do important init only if we don't start from RAM!
* - relocate armboot to ram
* - setup stack
* - jump to second stage
*/

// TEXT_BASE在開發(fā)板相關(guān)的目錄中的config.mk文件中定義, 它定義了
// 代碼在運(yùn)行時(shí)所在的地址, 那么_TEXT_BASE中保存了這個(gè)地址
_TEXT_BASE:
.wordTEXT_BASE

// 聲明 _armboot_start 并用 _start 來(lái)進(jìn)行初始化,在board/u-boot.lds中定義。
.globl _armboot_start
_armboot_start:
.word _start

/*
* These are defined in the board-specific linker script.
*/

// 聲明_bss_start并用__bss_start來(lái)初始化,其中__bss_start定義在與板相關(guān)的u-boot.lds中。
// _bss_start保存的是__bss_start這個(gè)標(biāo)號(hào)所在的地址, 這里涉及到當(dāng)前代碼所在
// 的地址不是編譯時(shí)的地址的情況, 這里直接取得該標(biāo)號(hào)對(duì)應(yīng)的地址, 不受編譯時(shí)
// 地址的影響. _bss_end也是同樣的道理.
.globl _bss_start
_bss_start:
.word __bss_start
// 同上
.globl _bss_end
_bss_end:
.word _end

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif

//MRS {} Rd,CPSR|SPSR 將CPSR|SPSR傳送到Rd
//使用這兩條指令將狀態(tài)寄存器傳送到一般寄存器,只修改必要的位,再將結(jié)果傳送回狀態(tài)寄存器,這樣可以最好地完成對(duì)CRSP或者SPSR的修改
//MSR {} CPSR_|SPSR_,Rm 或者是 MSR {} CPSR_f|SPSR_f,#<32-bit immediate>
//MRS與MSR配合使用,作為更新PSR的“讀?。薷模瓕懟亍毙蛄械囊徊糠?br/>//bic r0,r1,r2;r0:=r1 and not r2
//orr ro,r1,r2;r0:=r1 or r2
//這幾條指令執(zhí)行完畢后,進(jìn)入SVC模式,該模式主要用來(lái)處理軟件中斷(SWI)
reset:
mrsr0,cpsr/* set the cpu to SVC32 mode*/
bicr0,r0,#0x1f/* (superviser mode, M=10011)*/
orrr0,r0,#0xb3 /*disable irq and frq SVC mode*/
msrcpsr,r0

/* 關(guān)閉看門狗,S3C2410手則 */
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#endif

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]

/*
* 屏蔽所有中斷
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif

/* 設(shè)置FCLK:HCLK:PCLK = 1:2:4 */
/*FCLK默認(rèn)為120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */

/*該語(yǔ)句首先調(diào)用cpu_init_crit進(jìn)行CPU的初始化,并把下一條指令的地址保存在LR中,以使得執(zhí)行完后能夠正常返回。后面會(huì)分析*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif

//調(diào)試階段的代碼是直接在RAM中運(yùn)行的,而最后需要把這些代碼固化到Flash中,因此U-Boot需要自己從Flash轉(zhuǎn)移到
//RAM中運(yùn)行,這也是重定向的目的所在。
//通過(guò)adr指令得到當(dāng)前代碼的地址信息:如果U-boot是從RAM開始運(yùn)行,則從adr,r0,_start得到的地址信息為
//r0=_start=_TEXT_BASE=TEXT_BASE=0xa3000000;如果U-boot從Flash開始運(yùn)行,即從處理器對(duì)應(yīng)的地址運(yùn)行,
//則r0=0x0000,這時(shí)將會(huì)執(zhí)行copy_loop標(biāo)識(shí)的那段代碼了。
// _TEXT_BASE 定義在board/pxa255_idp/config.mk中

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */

copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉