91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入解析U-Boot核心文件board_f.c:知識點、調(diào)試要點與開發(fā)價值

jf_44130326 ? 來源:Linux1024 ? 2026-02-03 15:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)開發(fā)中,U-Boot作為應(yīng)用最廣泛的引導(dǎo)程序,其底層初始化邏輯直接決定了硬件啟動的穩(wěn)定性與可靠性。board_f.c作為U-Boot早期初始化的核心文件,承擔著從硬件上電到代碼重定位的關(guān)鍵流程。本文將從三個維度展開分析:

1.核心知識點:解析board_f.c的功能模塊與初始化流程

2.調(diào)試關(guān)注點:開發(fā)中需重點監(jiān)控的關(guān)鍵節(jié)點與問題排查方向

3.開發(fā)意義:理解該文件對嵌入式系統(tǒng)移植與定制的實際價值

一、核心知識點:board_f.c的功能與初始化流程

board_f.c的核心作用是完成U-Boot早期初始化(board_init_f,即在代碼重定位到RAM之前,完成硬件基礎(chǔ)配置、內(nèi)存規(guī)劃與環(huán)境準備。其內(nèi)部通過一個初始化函數(shù)序列(init_sequence_f)按順序執(zhí)行各項任務(wù),整體流程可歸納為以下模塊:

wKgZPGkam2qADdCaAADrtm2Q_d0144.png

1.基礎(chǔ)環(huán)境搭建

?全局數(shù)據(jù)(gd)初始化:定義全局數(shù)據(jù)結(jié)構(gòu)指針(DECLARE_GLOBAL_DATA_PTR),存儲系統(tǒng)關(guān)鍵信息(內(nèi)存大小、波特率、重定位地址等),是貫穿U-Boot初始化的核心數(shù)據(jù)載體。

?監(jiān)控程序長度計算(setup_mon_len:根據(jù)不同架構(gòu)(ARM、MIPS等)計算U-Boot代碼段(text)、數(shù)據(jù)段(data)和BSS段的總長度,為后續(xù)內(nèi)存預(yù)留做準備。

?早期日志與調(diào)試初始化:通過log_init、trace_early_init等函數(shù)開啟調(diào)試日志,支持后續(xù)初始化過程的信息輸出。

2.硬件基礎(chǔ)配置

?CPU與架構(gòu)初始化

?arch_cpu_init:架構(gòu)相關(guān)的基礎(chǔ)配置(如ARMcache禁用、MIPS寄存器初始化)。

?mach_cpu_init:具體芯片(SoC)的定制化配置,如時鐘源選擇。

?get_clocks:獲取CPU主頻、總線時鐘等關(guān)鍵時鐘參數(shù),為外設(shè)初始化提供基礎(chǔ)。

?外設(shè)初始化

?串口(serial_init):初始化調(diào)試串口,確保早期打印功能可用。

?看門狗init_func_watchdog_init):根據(jù)配置啟動硬件看門狗,防止系統(tǒng)卡死。

?I2C/SPIinit_func_i2c/init_func_spi):初始化總線控制器,為后續(xù)傳感器、存儲設(shè)備訪問做準備。

3.內(nèi)存管理與規(guī)劃

?DRAM初始化

?dram_init:探測并配置物理內(nèi)存(DRAM)的大小與地址范圍。

?dram_init_banksize:設(shè)置內(nèi)存bank的起始地址與大?。ㄖС侄?/span>bank場景)。

?show_dram_config:輸出內(nèi)存配置信息(總大小、各bank分布),用于調(diào)試驗證。

?內(nèi)存預(yù)留:從DRAM頂部向下預(yù)留各類專用內(nèi)存區(qū)域(順序不可隨意調(diào)整),流程圖如下:

+-------------------------+高地址

|未使用內(nèi)存(留給內(nèi)核)|

+-------------------------+

|保護內(nèi)存(CONFIG_PRAM|<- reserve_pram()

+-------------------------+

| MMU頁表(ARM架構(gòu)) |<- reserve_mmu()

+-------------------------+

|視頻幀緩存(LCD/HDMI|<- reserve_video()

+-------------------------+

|調(diào)試跟蹤緩沖區(qū)(TRACE|<- reserve_trace()

+-------------------------+

| U-Boot代碼與數(shù)據(jù) |<- reserve_uboot()

+-------------------------+

|堆內(nèi)存(malloc |<- reserve_malloc()

+-------------------------+

|板級信息結(jié)構(gòu)體(bd_t|<- reserve_board()

+-------------------------+

|全局數(shù)據(jù)(gd_t |<- reserve_global_data()

+-------------------------+

|設(shè)備樹(FDT |<- reserve_fdt()

+-------------------------+

|棧內(nèi)存(stack |<- reserve_stacks()

+-------------------------+低地址

4.代碼重定位(Relocation

由于U-Boot通常從Flash啟動,而Flash速度較慢,需將代碼復(fù)制到RAM中執(zhí)行以提升效率。核心步驟包括:

?setup_dest_addr:計算重定位目標地址(基于DRAM頂部,避開預(yù)留區(qū)域)。

?reloc_fdt/reloc_bootstage:將設(shè)備樹、啟動階段記錄等數(shù)據(jù)復(fù)制到RAM

?setup_reloc:計算重定位偏移量,更新全局數(shù)據(jù)中的地址信息。

?jump_to_copy:跳轉(zhuǎn)至RAM中重定位后的代碼,完成初始化階段切換。

二、調(diào)試關(guān)注點:關(guān)鍵節(jié)點與問題排查

在調(diào)試啟動問題時,board_f.c的初始化流程是核心排查對象,需重點關(guān)注以下節(jié)點:

1.初始化序列執(zhí)行狀態(tài)

init_sequence_f中的函數(shù)按順序執(zhí)行,任何一個函數(shù)返回非0值都會導(dǎo)致系統(tǒng)掛起(hang)??赏ㄟ^以下方式定位異常:

?添加打印信息:在關(guān)鍵函數(shù)(如dram_init、reserve_uboot)前后增加printf,確認執(zhí)行進度。

?利用bootstage:通過bootstage_mark_name記錄各階段耗時,識別卡滯環(huán)節(jié)(需開啟CONFIG_BOOTSTAGE)。

2.內(nèi)存配置正確性

內(nèi)存初始化錯誤會導(dǎo)致后續(xù)重定位失敗,表現(xiàn)為系統(tǒng)崩潰或無響應(yīng)。需驗證:

?DRAM大小與地址:通過show_dram_config輸出確認探測到的內(nèi)存大小是否與硬件匹配。

?內(nèi)存預(yù)留沖突:若新增設(shè)備(如LCD)需要預(yù)留內(nèi)存,需檢查reserve_video等函數(shù)是否導(dǎo)致內(nèi)存重疊(可通過debug日志中的“Reserving xxx at: yyy”確認)。

3.外設(shè)初始化狀態(tài)

?串口:若串口無輸出,需檢查serial_init是否正確配置波特率(init_baud_rate)、引腳復(fù)用是否正確。

?看門狗:若系統(tǒng)頻繁復(fù)位,可能是看門狗未及時喂狗(需在長耗時操作中調(diào)用WATCHDOG_RESET ())。

?設(shè)備樹(FDT:通過reloc_fdt確認設(shè)備樹是否成功復(fù)制到RAM,地址是否正確(避免與其他區(qū)域沖突)。

4.重定位過程驗證

重定位失敗會導(dǎo)致代碼執(zhí)行異常,需關(guān)注:

?重定位地址計算:通過“Relocation Offset: xxx”日志確認偏移量是否正確(目標地址=原地址+偏移量)。

?棧指針(SPdisplay_new_sp輸出的棧地址需在預(yù)留的棧內(nèi)存區(qū)域內(nèi),否則會導(dǎo)致棧溢出。

三、開發(fā)意義:嵌入式移植與定制的核心依據(jù)

board_f.cU-Boot移植到新硬件的關(guān)鍵修改點,其開發(fā)意義體現(xiàn)在:

1.硬件適配的入口

?新增硬件(如自定義開發(fā)板)需通過修改init_sequence_f添加專屬初始化函數(shù)(如board_early_init_f),配置引腳復(fù)用、時鐘等底層參數(shù)。

?對于特殊內(nèi)存布局(如帶安全區(qū)域的DRAM),需重寫board_get_usable_ram_top調(diào)整內(nèi)存頂?shù)刂酚嬎氵壿嫛?/span>

2.系統(tǒng)優(yōu)化的關(guān)鍵

?內(nèi)存預(yù)留策略可根據(jù)需求調(diào)整(如減小malloc區(qū)域大小以節(jié)省內(nèi)存,或增大視頻緩存支持更高分辨率)。

?通過裁剪init_sequence_f中不必要的初始化步驟(如禁用未使用的I2C/SPI),可縮短啟動時間。

3.問題定位的基礎(chǔ)

理解board_f.c的流程是解決啟動問題的前提:

?若內(nèi)核啟動時提示內(nèi)存大小錯誤,需檢查dram_init_banksize是否正確設(shè)置bi_dram結(jié)構(gòu)體。

?若重定位后程序崩潰,需驗證reloc_off計算是否正確,或是否遺漏了某些數(shù)據(jù)的復(fù)制(如私有的全局變量)。

總結(jié)

board_f.c作為U-Boot早期初始化的總指揮,串聯(lián)了硬件配置、內(nèi)存管理與代碼重定位的核心流程。掌握其知識點有助于理解嵌入式系統(tǒng)的啟動原理,明確調(diào)試關(guān)注點可快速定位啟動故障,而深入其開發(fā)意義則為硬件移植與系統(tǒng)優(yōu)化提供了清晰路徑。無論是調(diào)試現(xiàn)有問題還是定制新平臺,board_f.c都是嵌入式工程師必須吃透的關(guān)鍵文件。



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20434

    瀏覽量

    333885
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    646

    瀏覽量

    35633
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

    39738
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    imx6ull開發(fā)u-boot下網(wǎng)絡(luò)部分的移植和調(diào)試

    今天給大家講一講如何將u-boot網(wǎng)絡(luò)部分的移植和調(diào)試。
    發(fā)表于 07-12 15:11 ?4549次閱讀
    imx6ull<b class='flag-5'>開發(fā)</b>板<b class='flag-5'>u-boot</b>下網(wǎng)絡(luò)部分的移植和<b class='flag-5'>調(diào)試</b>

    U-boot的基本介紹

    從本文開始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認硬件開發(fā)
    發(fā)表于 07-14 16:52 ?4179次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    U-Boot的啟動及移植分析

    bootloader 開發(fā)是嵌入式系統(tǒng)必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發(fā)軟件。本文詳細分析了U-Boot 的啟動流程,并結(jié)合其源碼,闡述了
    發(fā)表于 09-01 16:34 ?27次下載

    基于S3C2440的U-Boot開機logo的設(shè)計

    在對U-Boot進行深入分析的基礎(chǔ)上,同時對S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理進行分析,最后結(jié)合系統(tǒng)軟硬件特性實現(xiàn)基于U-Boot的開機logo。
    發(fā)表于 12-06 15:14 ?96次下載
    基于S3<b class='flag-5'>C</b>2440的<b class='flag-5'>U-Boot</b>開機logo的設(shè)計

    u-boot簡介

    演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進行簡化而形成的,尤其是一些設(shè)備的驅(qū)動程序,這從U-Boot源碼的注釋中能體現(xiàn)這一
    發(fā)表于 10-14 11:17 ?3949次閱讀

    如何使用Xilinx SDK調(diào)試u-boot代碼

    了解如何使用Xilinx SDK調(diào)試u-boot代碼。 概述了技術(shù)以獲得重定位偏移量,以便可以在SDK中應(yīng)用它。
    的頭像 發(fā)表于 11-27 06:36 ?4919次閱讀

    fireflyAIO-3399C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-04 10:31 ?1961次閱讀

    fireflyAIO-3288C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-16 13:52 ?1724次閱讀
    fireflyAIO-3288<b class='flag-5'>C</b>主板<b class='flag-5'>U-Boot</b>介紹

    U-Boot架構(gòu)淺析

    導(dǎo)讀:嵌入式Linux系統(tǒng)搭建,bootloader是必不可少的一環(huán),而U-Boot已成嵌入式Linux事實標準。所以較為深入的分析U-Boot的設(shè)計,對于更...
    發(fā)表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構(gòu)淺析

    Linux U-Boot開發(fā)指南

    介紹 U-Boot 的編譯打包、基本配置、常用命令的使用、基本調(diào)試方法等, 為 U-BOOT 的移植及應(yīng)用開發(fā)提供了基礎(chǔ)。
    的頭像 發(fā)表于 03-06 10:28 ?2433次閱讀
    Linux <b class='flag-5'>U-Boot</b><b class='flag-5'>開發(fā)</b>指南

    u-boot armv8鏈接腳本

    /u-boot-spl.lds進行鏈接,因為每個board的情況可能不同,所以u-boot可以通過Kconfig來自定義u-boot-spl.lds和
    的頭像 發(fā)表于 12-07 11:19 ?1545次閱讀

    U-Boot SPL核心文件spl.c深度解析:從啟動流程到調(diào)試優(yōu)化

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價值,并通過流程
    的頭像 發(fā)表于 02-05 14:08 ?127次閱讀
    <b class='flag-5'>U-Boot</b> SPL<b class='flag-5'>核心</b><b class='flag-5'>文件</b>spl.<b class='flag-5'>c</b>深度<b class='flag-5'>解析</b>:從啟動流程到<b class='flag-5'>調(diào)試</b>優(yōu)化

    深入解析U-Boot命令處理核心文件:功能、調(diào)試開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動啟動流程是核心功能模塊。本文將圍繞command.c、cli.c
    的頭像 發(fā)表于 02-03 15:44 ?870次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令處理<b class='flag-5'>核心</b><b class='flag-5'>文件</b>:功能、<b class='flag-5'>調(diào)試</b>與<b class='flag-5'>開發(fā)價值</b>

    解析Rockchip平臺U-Boot核心文件boot_rkimg.c到底做了什么?

    在嵌入式開發(fā)中,U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負責初始化硬件、加載內(nèi)核并啟動系統(tǒng)。對于 Rockchip 平臺的設(shè)備(如常見的開發(fā)板、智能終端),boot_rkimg.c
    的頭像 發(fā)表于 02-03 15:29 ?736次閱讀
    <b class='flag-5'>解析</b>Rockchip平臺<b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b><b class='flag-5'>文件</b>:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯

    在瑞芯微(RK)平臺的嵌入式開發(fā)中,U-Boot作為核心的啟動加載程序,負責完成鏡像解析、校驗、加載等關(guān)鍵流程。而image.c正是
    的頭像 發(fā)表于 02-24 16:46 ?1403次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> image.<b class='flag-5'>c</b>:RK平臺鏡像處理<b class='flag-5'>核心</b>邏輯