首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

U-Boot AM1808 編譯通過但無法運行:TEXT_BASE 設置與加載地址不匹配排查

     編輯:程式設計綜合問答

現象描述

AM1808 平台編譯 U-Boot,`u-boot` 和 `u-boot.bin` 均生成成功,但燒寫後板卡無法啟動,懷疑是程序入口點或加載地址配置錯誤。編譯器為 `arm-none-linux-gnueabi-`。

核心原因:TEXT_BASE 與實際加載地址不一致

U-Boot 運行地址由 Makefile 中的 `CONFIG_SYS_TEXT_BASE`(即 `TEXT_BASE`)決定。若該值與 JTAG/TFTP/NAND 燒寫的實際加載地址不一致,CPU 跳轉到錯誤地址導致無法啟動。

排查與修正步驟

  1. 確認當前 TEXT_BASE:
    grep TEXT_BASE include/configs/am1808_evm.h
    # 或
    grep CONFIG_SYS_TEXT_BASE .config
    典型值如 `0xC0700000` (DDR) 或 `0x00000000` (SRAM)。
  2. 對照硬件文檔:查閱 AM1808 TRM 及板級原理圖,確認:
    • DDR 起始地址
    • Boot ROM 加載 U-Boot 的目標地址(如 NAND boot 通常加載到 DDR 某偏移)
    • JTAG 腳本/燒錄工具實際寫入地址
  3. 修改 Makefile / 配置頭文件:
    # boards/am1808_evm/Makefile 或 configs/am1808_evm_defconfig
    CONFIG_SYS_TEXT_BASE=0xC0700000  # 與實際加載地址一致
  4. 同步 TFTP/燒錄參數:
    # U-Boot 命令行
    tftpboot 0xC0700000 u-boot.bin  # 地址必須與 TEXT_BASE 一致
    nand erase 0x0 0x80000
    nand write 0xC0700000 0x0 0x80000
  5. 重新編譯驗證:
    make distclean
    make am1808_evm_defconfig
    make -j4

進階檢查點

  • 入口點 `_start` 是否在 `arch/arm/lib/vectors.S` 正確定義
  • 是否啟用 `CONFIG_SPL` (SPL 階段) 導致兩階段加載地址不同
  • 檢查 `u-boot.map` 中 `.text` 段起始地址是否等於 TEXT_BASE

總結

U-Boot 編譯成功但不運行,90% 是TEXT_BASE 與實際加載地址不匹配。務必做到:配置文件、編譯輸出、燒錄命令、JTAG 腳本 四處地址完全一致。建議在板級 README 中固化該地址,避免後續維護踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved