chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

1.核心知識(shí)點(diǎn):解析board_f.c的功能模塊與初始化流程

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

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

一、核心知識(shí)點(diǎn):board_f.c的功能與初始化流程

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

wKgZPGkam2qADdCaAADrtm2Q_d0144.png

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

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

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

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

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

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

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

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

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

?外設(shè)初始化

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

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

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

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

?DRAM初始化

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

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

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

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

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

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

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

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

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

| MMU頁(yè)表(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()

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

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

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

|全局?jǐn)?shù)據(jù)(gd_t |<- reserve_global_data()

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

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

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

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

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

4.代碼重定位(Relocation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.重定位過(guò)程驗(yàn)證

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

?重定位地址計(jì)算:通過(guò)“Relocation Offset: xxx”日志確認(rèn)偏移量是否正確(目標(biāo)地址=原地址+偏移量)。

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

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

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

1.硬件適配的入口

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

?對(duì)于特殊內(nèi)存布局(如帶安全區(qū)域的DRAM),需重寫(xiě)board_get_usable_ram_top調(diào)整內(nèi)存頂?shù)刂酚?jì)算邏輯。

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

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

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

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

理解board_f.c的流程是解決啟動(dòng)問(wèn)題的前提:

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

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

總結(jié)

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



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

    關(guān)注

    5198

    文章

    20435

    瀏覽量

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

    關(guān)注

    7

    文章

    646

    瀏覽量

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

    關(guān)注

    0

    文章

    135

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    U-boot的基本介紹

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

    U-Boot的啟動(dòng)及移植分析

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

    基于S3C2440的U-Boot開(kāi)機(jī)logo的設(shè)計(jì)

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

    u-boot簡(jiǎn)介

    演化而來(lái)。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進(jìn)行簡(jiǎn)化而形成的,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎ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 基于開(kāi)源的 U-Boot 進(jìn)行開(kāi)發(fā),工作模式有啟動(dòng)加載模式和下載模式。
    的頭像 發(fā)表于 12-04 10:31 ?1962次閱讀

    fireflyAIO-3288C主板U-Boot介紹

    RK U-Boot 基于開(kāi)源的 U-Boot 進(jìn)行開(kāi)發(fā),工作模式有啟動(dòng)加載模式和下載模式。
    的頭像 發(fā)表于 12-16 13:52 ?1732次閱讀
    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事實(shí)標(biāo)準(zhǔn)。所以較為深入的分析U-Boot的設(shè)計(jì),對(duì)于更...
    發(fā)表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構(gòu)淺析

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

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

    u-boot armv8鏈接腳本

    /u-boot-spl.lds進(jìn)行鏈接,因?yàn)槊總€(gè)board的情況可能不同,所以u-boot可以通過(guò)Kconfig來(lái)自定義u-boot-spl.lds和
    的頭像 發(fā)表于 12-07 11:19 ?1546次閱讀

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

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

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

    在嵌入式系統(tǒng)開(kāi)發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動(dòng)啟動(dòng)流程是核心功能模塊。本文將圍繞command.c、cli.c
    的頭像 發(fā)表于 02-03 15:44 ?873次閱讀
    <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'>開(kāi)發(fā)價(jià)值</b>

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

    在嵌入式開(kāi)發(fā)中,U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負(fù)責(zé)初始化硬件、加載內(nèi)核并啟動(dòng)系統(tǒng)。對(duì)于 Rockchip 平臺(tái)的設(shè)備(如常見(jiàn)的開(kāi)發(fā)板、智能終端),boot_rkimg.c
    的頭像 發(fā)表于 02-03 15:29 ?738次閱讀
    <b class='flag-5'>解析</b>Rockchip平臺(tái)<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平臺(tái)鏡像處理核心邏輯

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