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

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

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

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

深入解析U-Boot TPL代碼:嵌入式啟動(dòng)的“第一棒”背后的秘密

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

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)啟動(dòng)過程中,從按下電源鍵到操作系統(tǒng)開始運(yùn)行,中間藏著一系列精密的初始化步驟。今天我們就來拆解Rockchip平臺(tái)U-Boot中的TPLTiny Program Loader)階段核心代碼tpl.c,看看這個(gè)"啟動(dòng)第一棒"是如何為整個(gè)系統(tǒng)保駕護(hù)航的。

wKgZO2kajDuAET28AADNCewxFLs428.png

什么是TPL?為什么它如此重要?

TPLU-Boot啟動(dòng)流程中最早執(zhí)行的階段之一,全稱Tiny Program Loader(小型程序加載器)。不同于后續(xù)的SPLSecondary Program Loader)和U-Boot主體,TPL運(yùn)行在系統(tǒng)資源極其有限的環(huán)境中(通常依賴片內(nèi)SRAM),卻要完成最關(guān)鍵的硬件初始化工作。

可以把嵌入式啟動(dòng)比作一場(chǎng)接力賽:

?BootROM(芯片內(nèi)置的啟動(dòng)程序)是"發(fā)令員"

?TPL"第一棒選手",負(fù)責(zé)啟動(dòng)最基礎(chǔ)的硬件

?SPL"第二棒",完成更多初始化

?U-Boot主體則是"最后一棒",最終引導(dǎo)操作系統(tǒng)

tpl.c正是"第一棒選手"的核心操作手冊(cè)。

代碼解析:TPL都做了些什么?

我們通過代碼結(jié)構(gòu),一步步揭開TPL的工作內(nèi)容:

1.最小化的"輸出系統(tǒng)":串口調(diào)試的基石

#ifndefCONFIG_TPL_LIBCOMMON_SUPPORT#defineCONFIG_SYS_NS16550_COM1 CONFIG_DEBUG_UART_BASEvoidputs(constchar*str){ while(*str)    putc(*str++);}voidputc(charc){ if(c =='n')   NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1),'r'); NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), c);}#endif

這段代碼實(shí)現(xiàn)了最基礎(chǔ)的字符串輸出功能。在TPL階段,系統(tǒng)還沒有加載完整的函數(shù)庫(kù),因此需要直接操作NS16550串口控制器實(shí)現(xiàn)putc(輸出字符)和puts(輸出字符串)函數(shù)。

特別注意到對(duì)換行符n的處理——自動(dòng)轉(zhuǎn)換為rn(回車+換行),這是為了保證在串口終端上能正確換行,細(xì)節(jié)處體現(xiàn)了調(diào)試友好性。

2.時(shí)間管理:系統(tǒng)的"心跳"初始化

#ifndefCONFIG_TPL_LIBGENERIC_SUPPORTint__weaktimer_init(void){return0; }#ifdefCONFIG_ARM64void__weak __udelay(unsignedlongusec){  u64 i, j, count; asmvolatile("MRS %0, CNTPCT_EL0":"=r"(count));  i = count;  j = usec *24; // 24MHz計(jì)數(shù)器  i += j; while(1) {   asmvolatile("MRS %0, CNTPCT_EL0":"=r"(count));   if(count > i)break;  }}#else// 非ARM64架構(gòu)的延遲實(shí)現(xiàn)#endifvoidudelay(unsignedlongusec){ __udelay(usec); }#endif

時(shí)間延遲是硬件初始化的關(guān)鍵需求(比如等待外設(shè)上電穩(wěn)定)。這段代碼通過直接操作CPU計(jì)數(shù)器寄存器

?ARM64架構(gòu)讀取CNTPCT_EL0寄存器

?為其他架構(gòu)使用mrrc p15指令

?基于24MHz的基準(zhǔn)頻率計(jì)算延遲時(shí)間

這種底層實(shí)現(xiàn)確保了在沒有操作系統(tǒng)支持的情況下,系統(tǒng)仍能獲得精確的微秒級(jí)延遲能力。

3.核心初始化流程:board_init_f的使命

作為TPL階段的主入口函數(shù),board_init_f串起了整個(gè)初始化流程:

voidboard_init_f(ulongdummy){  rockchip_stimer_init(); // 系統(tǒng)定時(shí)器初始化  arch_cpu_init();    // CPU架構(gòu)初始化#ifdef EARLY_DEBUG  debug_uart_init();   // 調(diào)試串口初始化  printascii("U-Boot TPL "PLAIN_VERSION"...n"); // 版本信息打印#endif  timer_init();      // 定時(shí)器初始化 // DRAM初始化(根據(jù)配置選擇設(shè)備模型或直接調(diào)用)#ifdefined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK)  ret = uclass_get_device(UCLASS_RAM,0, &dev);#else  sdram_init();#endif // 條件允許時(shí)返回BootROM執(zhí)行下一階段#ifdefined(CONFIG_TPL_ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_TPL_BOARD_INIT)  back_to_bootrom(BROM_BOOT_NEXTSTAGE);#endif}

這個(gè)函數(shù)的執(zhí)行邏輯清晰展現(xiàn)了TPL的核心任務(wù):

1.初始化系統(tǒng)定時(shí)器,建立時(shí)間基準(zhǔn)

2.完成CPU架構(gòu)相關(guān)初始化

3.啟動(dòng)調(diào)試串口,輸出版本信息(關(guān)鍵的調(diào)試點(diǎn))

4.初始化DRAM(內(nèi)存),為后續(xù)階段提供運(yùn)行空間

5.交接控制權(quán)到下一階段

對(duì)啟動(dòng)流程的關(guān)鍵作用

TPL作為啟動(dòng)的"第一棒",其工作質(zhì)量直接決定了系統(tǒng)能否正常啟動(dòng):

1.硬件最小化初始化:在資源受限的環(huán)境下,優(yōu)先初始化串口、定時(shí)器、內(nèi)存等關(guān)鍵硬件,為后續(xù)階段鋪路

2.啟動(dòng)流程銜接:通過back_to_bootrom函數(shù)與BootROM協(xié)作,確保啟動(dòng)流程按順序推進(jìn)

3.兼容性適配:通過條件編譯(如CONFIG_ARM64、CONFIG_TPL_LIBCOMMON_SUPPORT)支持不同架構(gòu)和配置,提高代碼復(fù)用性

4.故障隔離:如果TPL階段失?。ㄈ?/span>DRAM初始化出錯(cuò)),系統(tǒng)會(huì)在早期掛起,避免錯(cuò)誤擴(kuò)散

對(duì)調(diào)試工作的特殊意義

對(duì)于嵌入式開發(fā)者來說,TPL階段的調(diào)試支持堪稱"救命稻草"

1.早期日志輸出:通過debug_uart_initprintascii實(shí)現(xiàn)的早期打印,能幫助定位啟動(dòng)失敗的第一現(xiàn)場(chǎng)。想象一下,如果連"U-Boot TPL版本信息"都打印不出來,排查問題會(huì)有多困難!

2.時(shí)序問題排查:精確的udelay函數(shù)確保硬件初始化時(shí)序正確,減少因時(shí)序錯(cuò)誤導(dǎo)致的"偶發(fā)故障"

3.版本追溯:?jiǎn)?dòng)時(shí)打印的版本號(hào)(PLAIN_VERSION)和編譯時(shí)間,能快速確認(rèn)是否使用了正確的代碼版本

4.錯(cuò)誤定位hang函數(shù)在出錯(cuò)時(shí)進(jìn)入死循環(huán),配合JTAG等工具可捕獲現(xiàn)場(chǎng)狀態(tài),避免系統(tǒng)"crash后無痕跡"

總結(jié):TPL——啟動(dòng)流程的"基石"

tpl.c雖然代碼量不大,卻承載了嵌入式系統(tǒng)啟動(dòng)最基礎(chǔ)也最關(guān)鍵的工作。它像一位嚴(yán)謹(jǐn)?shù)?/span>"系統(tǒng)初始化工程師",在資源極度有限的環(huán)境下,有條不紊地完成硬件喚醒、環(huán)境準(zhǔn)備和流程交接。

對(duì)于開發(fā)者而言,理解TPL代碼不僅能幫助我們快速定位啟動(dòng)問題,更能深入理解嵌入式系統(tǒng)從"斷電""運(yùn)行"的整個(gè)喚醒過程。下次調(diào)試啟動(dòng)故障時(shí),不妨先看看TPL階段的日志輸出——答案往往就藏在這些最早期的信息里。

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

    關(guān)注

    41

    文章

    3744

    瀏覽量

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

    關(guān)注

    0

    文章

    135

    瀏覽量

    39737
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    嵌入式Linux啟動(dòng)時(shí)間優(yōu)化的秘密之五-Bootloader

    本文主要講述嵌入式Linux啟動(dòng)時(shí)間優(yōu)化的秘密,我們繼續(xù)上篇沒有講完的嵌入式Linux啟動(dòng)時(shí)間優(yōu)化方法,本文主要會(huì)講Bootloader。想
    發(fā)表于 04-21 17:24 ?3417次閱讀
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>啟動(dòng)</b>時(shí)間優(yōu)化的<b class='flag-5'>秘密</b>之五-Bootloader

    嵌入式系統(tǒng)中U-Boot 基本特點(diǎn)及其移植方法

    在介紹U-Boot 基本特點(diǎn)的基礎(chǔ)上,結(jié)合U-Boot 移植經(jīng)歷,以MPC8xx 和嵌入式Linux 為背景,分析、探討U-Boot 的移植方法、過程與相關(guān)移植要點(diǎn), 并給出
    發(fā)表于 04-15 09:25 ?17次下載

    嵌入式系統(tǒng)中U-Boot 基本特點(diǎn)及其移植方法

    在介紹U-Boot 基本特點(diǎn)的基礎(chǔ)上,結(jié)合U-Boot 移植經(jīng)歷,以MPC8xx 和嵌入式Linux 為背景,分析、探討U-Boot 的移植方法、過程與相關(guān)移植要點(diǎn), 并給出
    發(fā)表于 05-16 14:52 ?12次下載

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

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

    種在U-BOOT嵌入千兆網(wǎng)絡(luò)功能的方法

    種在U-BOOT嵌入千兆網(wǎng)絡(luò)功能的方法摘 要:U-BOOT種開放源碼的、用于多種嵌入式
    發(fā)表于 02-05 17:38 ?17次下載

    嵌入式U-BOOT啟動(dòng)流程及移植

    摘要:嵌入式系統(tǒng)般沒有通用的bootloader,u-boot是功能強(qiáng)大的bootloader開發(fā)軟件,但相對(duì)也比較復(fù)雜。文中對(duì)u-boot啟動(dòng)
    發(fā)表于 02-25 16:00 ?59次下載

    基于ARM9的U-Boot自動(dòng)識(shí)別啟動(dòng)實(shí)現(xiàn)

    嵌入式ARM9系列處理器支持U-Boot從Nor FLASH或者Nand FLASH啟動(dòng),也支持U-Boot直接下載到內(nèi)存中調(diào)試運(yùn)行,根據(jù)U-Boo
    發(fā)表于 03-04 16:23 ?91次下載
    基于ARM9的<b class='flag-5'>U-Boot</b>自動(dòng)識(shí)別<b class='flag-5'>啟動(dòng)</b>實(shí)現(xiàn)

    u-boot學(xué)習(xí)指南

    u-boot 是免費(fèi)的,我們做嵌入式般只需要使用 u-boot 即可,但如果你想成為個(gè)比較強(qiáng)的嵌入
    發(fā)表于 11-17 15:54 ?2次下載

    嵌入式Linux系統(tǒng)移植開發(fā)-(1)基于Yocto構(gòu)建嵌入式u-boot,內(nèi)核,文件系統(tǒng)

    基于Yocto構(gòu)建嵌入式u-boot,內(nèi)核,文件系統(tǒng)Yocto是什么?簡(jiǎn)單地概括,它是個(gè)工具,可以用來構(gòu)建u-boot,kernel,文件系統(tǒng),交叉編譯工具鏈,等等。Yocto提供了
    發(fā)表于 11-01 17:38 ?14次下載
    <b class='flag-5'>嵌入式</b>Linux系統(tǒng)移植開發(fā)-(1)基于Yocto構(gòu)建<b class='flag-5'>嵌入式</b><b class='flag-5'>u-boot</b>,內(nèi)核,文件系統(tǒng)

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

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

    tiny4412編譯與移植U-Boot

    U-Boot個(gè)主要用于嵌入式系統(tǒng)的引導(dǎo)加載程序, U-Boot本質(zhì)是個(gè)裸機(jī)程序,是
    的頭像 發(fā)表于 08-31 08:59 ?3197次閱讀
    tiny4412編譯與移植<b class='flag-5'>U-Boot</b>

    嵌入式系統(tǒng)中u-boot和bootloader詳解

    嵌入式軟件工程師聽說過 u-boot 和 bootloader,但很多工程師依然不知道他們到底是啥。
    發(fā)表于 10-20 13:12 ?2606次閱讀

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

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

    深入理解?RK3506 U-Boot?重定位:從代碼到原理

    嵌入式系統(tǒng)中,U-Boot?作為引導(dǎo)加載程序,其啟動(dòng)流程的核心環(huán)節(jié)之就是 重定位(Relocation) 。對(duì)于?RK3506?這類基于?ARM Cortex-A?架構(gòu)的芯片,重定
    的頭像 發(fā)表于 11-28 07:05 ?570次閱讀
    <b class='flag-5'>深入</b>理解?RK3506 <b class='flag-5'>U-Boot</b>?重定位:從<b class='flag-5'>代碼</b>到原理

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

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