日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]基于S3C44B0芯片的uClinux內(nèi)核引導(dǎo)過程分析

前 言

隨著計(jì)算機(jī)硬件技術(shù)的不斷發(fā)展,功能強(qiáng)大、資源豐富的嵌入式芯片,成為研究人員開發(fā)專業(yè)應(yīng)用領(lǐng)域產(chǎn)品的首選。三星公司生產(chǎn)的S3C44B0芯片,采用ARM7TDM I內(nèi)核,具有功耗小、成本低的特點(diǎn),是一款專門針對移動(dòng)終端及PDA手持設(shè)備市場的產(chǎn)品。近幾年,源碼開放的L inux系統(tǒng)迅速發(fā)展,很快成為跨平臺(tái)操作系統(tǒng)中的佼佼者,并且出現(xiàn)了專門針對嵌入式系統(tǒng)的產(chǎn)品———uClinux。在S3C44B0芯片上移植 uClinux操作系統(tǒng),能夠充分發(fā)揮該芯片系統(tǒng)資源豐富(相對單片機(jī)而言)的特點(diǎn),開發(fā)出功能強(qiáng)大的應(yīng)用產(chǎn)品。

嵌入式系統(tǒng)的啟動(dòng)引導(dǎo)程序與硬件嚴(yán)格相關(guān),對編寫人員的要求較高,而在移植uClinux后又大大增加了引導(dǎo)程序的復(fù)雜程度,因此這部分代碼往往是各個(gè)嵌入式產(chǎn)品開發(fā)廠商嚴(yán)格保密的部分。下面將以一款市場上成熟的基于S3C44B0芯片的嵌入式開發(fā)板為藍(lán)本,對引導(dǎo)uClinux內(nèi)核的過程進(jìn)行分析。

系統(tǒng)引導(dǎo)過程分析

嵌入式系統(tǒng)中uClinux內(nèi)核的系統(tǒng)引導(dǎo)過程通??梢苑譃?個(gè)階段,即boot階段、系統(tǒng)初始化階段和uClinux內(nèi)核引導(dǎo)階段。通常情況下boot階段和系統(tǒng)初始化階段的工作由一段被稱為bootloader的代碼完成,而內(nèi)核引導(dǎo)則是由事先編譯好了的uClinux可執(zhí)行鏡像來實(shí)現(xiàn)。

系統(tǒng)內(nèi)存組織

由于嵌入式系統(tǒng)的硬件環(huán)境千差萬別,即使選用同一種型號的嵌入式芯片,其外圍設(shè)備也大不相同,特別是存儲(chǔ)設(shè)備的組織,將直接關(guān)系到引導(dǎo)程序的實(shí)現(xiàn)。對于 S3C44B0芯片,其生產(chǎn)廠家規(guī)定在系統(tǒng)加電自舉后,從0x00000000處開始執(zhí)行(其他芯片如ARM9系列可以通過地址映射改變該地址) ,故此處通常安排的是Flash 地址空間,用于保存bootloader啟動(dòng)代碼以及uClinux映象。對于S3C44B0 芯片, RAM 地址被固定在0x0c000000到0x0fffffff的64兆,開發(fā)人員可以根據(jù)自己的需要再組織RAM,如本開發(fā)板存儲(chǔ)器地址安排如下:

此外,考慮到Flash運(yùn)行速度的問題,通常采取的做法是將系統(tǒng)初始化階段的代碼和uClinux內(nèi)核鏡像拷貝到RAM中執(zhí)行。下面將分3個(gè)階段分析系統(tǒng)引導(dǎo)過程。

boot階段

boot階段的主要工作是設(shè)置系統(tǒng)中斷向量、完成對CPU內(nèi)部寄存器的初始化、系統(tǒng)RAM初始化、為運(yùn)行C程序組織堆棧、拷貝初始化階段代碼到RAM、跳轉(zhuǎn)到C程序入口。該階段代碼直接在Flash中運(yùn)行,為提高執(zhí)行效率采用匯編語言編寫。

(1) 設(shè)置中斷向量。設(shè)置S3C44B0芯片的8種系統(tǒng)中斷的中斷向量地址(包括復(fù)位中斷、未定義指令中斷、軟件中斷、指令預(yù)取異常中斷、數(shù)據(jù)異常中斷、地址異常中斷、IRQ 中斷和F IQ 中斷) ,該地址空間從系統(tǒng)RAM的起始地址開始安排。通常情況下,在Flash的起始部分,存放的就是針對各中斷向量地址的無條件跳轉(zhuǎn)指令。

__entry :

B ResetHandler

/* for reset vector */

LDR PC, = 0x0c00000c

/* 0x0c00000: 未定義指令中斷向量地址*/

……

/* 中間省略類似跳轉(zhuǎn)*/

LDR PC, = 0x0c000024

/* 0x0c000024: F IQ中斷向量地址*/

(2) CPU內(nèi)部寄存器初始化。通過配置CPU運(yùn)行于SVC模式(采用改變CPSC寄存器中CPU運(yùn)行模式位的方式來實(shí)現(xiàn)) ,并設(shè)置相關(guān)寄存器,以實(shí)現(xiàn)對基本硬件的初始化工作,包括關(guān)閉中斷、初始化CPU通用端口和設(shè)置CPU頻率等。進(jìn)入SVC模式匯編代碼如下:

MRS a1, CPSR /* 保存當(dāng)前狀態(tài)寄存器值*/

BICa1, a1, #MODE_MASK /* 清除運(yùn)行模式位*/

ORR a1, a1, #SUP_MODE/* 設(shè)置為超級用戶模式*/

ORR a1, a1, #LOCKOUT /* 關(guān)閉F IQ和IRQ */

MSR CPSR_cxsf, a1 /* 保存到當(dāng)前狀態(tài)寄存器*/

(3) 系統(tǒng)RAM初始化。初始化系統(tǒng)RAM的主要目的是為下面使用RAM空間的操作做好準(zhǔn)備工作,如進(jìn)行代碼拷貝及堆棧初始化等。這部分工作可以分為兩個(gè)步驟。首先,根據(jù)系統(tǒng)配置的存儲(chǔ)器特性,初始化相關(guān)存儲(chǔ)塊控制寄存器的值, 在S3C44B0 中存儲(chǔ)空間被分為BANK0到BANK7共8個(gè)塊,分別由BANKCON0到BANKCON7控制各塊存儲(chǔ)器的讀寫時(shí)鐘數(shù)和片選時(shí)鐘數(shù)等信號參數(shù),對于采取不同存儲(chǔ)芯片的嵌入式系統(tǒng),可以通過查閱芯片手冊來獲取該信息,并寫入相關(guān)寄存器。

LDR r0, = rBANKCON0

LDR r1, = 0x700

STR r1, [ r0 ]

/* 中間省略BANK1到BANK6*/

LDR r0, = rBANKCON7

LDR r1, = 0x18000

STR r1, [ r0 ]

LDR r0, = rREFRESH

LDR r1, = 0xac03e1

STR r1, [ r0 ]

LDR r0, = rBANKSIZE

LDR r1, = 0x16

STR r1, [ r0 ]

[!--empirenews.page--]

然后,對存儲(chǔ)器空間中需要清零的區(qū)域進(jìn)行清零操作,該區(qū)域的范圍往往是由開發(fā)人員通知編譯器的,主要是用來存放C語言中全局變量等。

LDR a1, = Image_ZI_Base /* 獲取清零區(qū)域基地址*/

MOV a3, #0 /* 清零a3寄存器*/

LDR a2, = Image_ZI_L imit /* 獲取清零區(qū)域尾地址*/

CMP a1, a2

BEQ move_data

clear_loop: : /* 清零Image_ZI_Base到Image_ZI_Limit區(qū)域*/

STR a3, [ a1 ] , #4/* 清零4個(gè)字節(jié),即一個(gè)字*/

CMP a1, a2 /* 判斷是否到達(dá)清零區(qū)域尾部*/

BNE clear_loop /* 否則,繼續(xù)清零循環(huán)*/

(4) 為運(yùn)行C程序組織堆棧。由于在系統(tǒng)引導(dǎo)的下一階段,通常會(huì)使用C語言來完成大部分(如建立主機(jī)通信、驅(qū)動(dòng)外部端口的工作) ,故必須調(diào)整SP指針到堆棧頂,為C程序配置合適的堆棧環(huán)境。在具體實(shí)現(xiàn)過程中為避免堆棧數(shù)據(jù)被程序運(yùn)行代碼破壞,往往會(huì)把堆棧設(shè)置在RAM的高端地址,并把堆棧的生長方向設(shè)為向下生長,這樣可以最大限度地利用RAM空間,同時(shí)可以避免上述問題發(fā)生。

(5)拷貝初始化階段代碼到RAM。由于在S3C44B0芯片中Flash和RAM是統(tǒng)一編址的,只需通過簡單的循環(huán)來實(shí)現(xiàn)代碼拷貝工作。

copy_code_to_ram :

LDR r3, = Flash_Sou/* Flash_Sou為Flash中代碼首地址*/

LDR r2, =Ram_Dest /* Ram_Dest為Ram中代碼首地址*/

LDR r1, = 0

next :

LDR r0, [ r1 ] , #4

STR r0, [ r2 ] , #4 /* 復(fù)制到ram*/

CMP r1, r3

BNE next

跳轉(zhuǎn)到C程序入口:

LDR pc, =Main

系統(tǒng)初始化階段

系統(tǒng)初始化階段的主要工作是建立與主機(jī)間的通信、初始化定時(shí)器、檢測內(nèi)存映射、加載uClinux內(nèi)核鏡像和配置內(nèi)核啟動(dòng)參數(shù)等。

與主機(jī)建立通訊

面向最終用戶的嵌入式產(chǎn)品,其啟動(dòng)過程應(yīng)該是不需要人工干預(yù)的,但對于大多數(shù)嵌入式開發(fā)平臺(tái)而言,必須通過某種方式與主機(jī)間建立通訊聯(lián)系,輸出啟動(dòng)提示信息,以實(shí)現(xiàn)人工干預(yù)的系統(tǒng)啟動(dòng)過程,提供更加豐富的附加功能。一般情況下,最為廉價(jià)和簡單的方式是通過串口實(shí)現(xiàn)嵌入式系統(tǒng)與主機(jī)間通訊( S3C44B0提供2個(gè)Uart口,建立通信前必須初始化至少一個(gè)),這種情況下就必須事先對串口進(jìn)行初始化工作。

以本開發(fā)板為例,在系統(tǒng)初始化的初期,就進(jìn)行了Uart口的初始化工作,并通過該端口與用戶宿主機(jī)上的超級終端程序通信,從而提供了多種啟動(dòng)功能的選擇,包括Demo程序下載、Flash重新編程等。Uart0口初始化過程可參看以下C代碼,其中波特率因子的計(jì)算公式可以查閱S3C44B0芯片手冊。

rULCON0 = 0x3;//設(shè)置Uart0 口線控寄存器,無奇偶效驗(yàn), 8數(shù)據(jù)位, 0停止位

rUCON0 = 0x345;//設(shè)置Uart0控制寄存器

rUBRD IV0 = ( ( int) (mclk /16. /baud + 0.5) - 1 ) ;//設(shè)置波特率因子,其中mclk和baud為系統(tǒng)頻率和波特率

初始化定時(shí)器

通過設(shè)置系統(tǒng)定時(shí)器相關(guān)的寄存器,實(shí)現(xiàn)為操作系統(tǒng)提供最基本的系統(tǒng)時(shí)鐘支持。

檢測內(nèi)存映射

為防止發(fā)生內(nèi)存映射錯(cuò)誤,即系統(tǒng)映射到物理地址不存在的空間,必須對內(nèi)存地址作讀寫一致性效驗(yàn)。通常做法是以內(nèi)存頁為單位,在每個(gè)頁頭進(jìn)行讀寫操作,并比較讀寫結(jié)果。

[!--empirenews.page--]

加載uClinux內(nèi)核鏡像

加載uClinux內(nèi)核工作實(shí)際上是完成將Flash中uClinux內(nèi)核代碼拷貝到RAM指定地址單元的工作,在拷貝前必須在第二階段RAM啟動(dòng)代碼和該部分代碼之間預(yù)留一定的空間,用來存放uClinux的全局結(jié)構(gòu)變量,如: 啟動(dòng)參數(shù)、內(nèi)核頁表、ARM的頁目錄等信息。全地址空間的分配情況可參看本開發(fā)板地址空間分配示意圖1。


圖1 地址空間分配示意圖

配置內(nèi)核啟動(dòng)參數(shù)

uClinux 內(nèi)核啟動(dòng)過程中,支持參數(shù)傳入。在嵌入式系統(tǒng)中,啟動(dòng)參數(shù)的傳入主要靠bootloader程序向標(biāo)記列表( tagged list)的相關(guān)域中填寫對應(yīng)的值來完成,常見的參數(shù)如有ATAG_CORE、ATAG_MEM、ATAG_CMDL INE、ATAG_RAMD ISK、ATAG_ IN ITRD等。

uClinux內(nèi)核引導(dǎo)

在初始化階段完成uClinux啟動(dòng)參數(shù)設(shè)置后,控制權(quán)交由uClinux內(nèi)核接管,并調(diào)用解壓內(nèi)核函數(shù)( decomp ress_kernel) ,對拷貝到SDRAM的內(nèi)核映像文件進(jìn)行解壓縮,然后跳轉(zhuǎn)到內(nèi)核調(diào)用函數(shù)( call_ kernel) ,該函數(shù)實(shí)際上是執(zhí)行start_kernel ( ) ,其中包括了處理器結(jié)構(gòu)的初始化、中斷的初始化、進(jìn)程相關(guān)的初始化以及內(nèi)存初始化等重要工作。最后,將控制權(quán)交給解壓后的uClinux系統(tǒng),進(jìn)而完成整個(gè)uClinux內(nèi)核引導(dǎo)過程,參看以下偽碼: If (啟動(dòng)參數(shù)配置正確)調(diào)用decomp ress_kernel ( )調(diào)用call_kernel ( )else提示啟動(dòng)失敗decomp ress_kernel( ){解壓內(nèi)核鏡像文件}call_kernel ( ){ start_kernel( ) ;}

小 結(jié)

對于嵌入式系統(tǒng)開發(fā)人員來說,針對某一特定的嵌入式硬件平臺(tái),移植開發(fā)基于uClinux操作系統(tǒng)的應(yīng)用產(chǎn)品時(shí),往往需要自己動(dòng)手編寫或修改已有的啟動(dòng)代碼,而為uClinux內(nèi)核啟動(dòng)準(zhǔn)備合適的工作環(huán)境,占據(jù)了大部分工作量。至于uClinux引導(dǎo),在設(shè)置好啟動(dòng)參數(shù)后則是由編譯好的內(nèi)核鏡像自動(dòng)完成,對于系統(tǒng)開發(fā)人員來說基本上是透明的。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(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)勢抑制與過流保護(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)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yà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ǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(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)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決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)閉