對于驅動開發,系統移植來說,我們的代碼可能會出現無數種bug,但是結果只有一個:驅動失敗!本文簡單介紹以下openjtag的裸機調試.
開發環境
操作系統:ubuntu10.04
硬件設備:xinna2440
軟件:openocd 0.3.1、u-boot-2009-03
調試方法
首先我們必須得對我們的程序每條指令位于哪個地址了如指掌,所以,我們需要對我們編譯好的u-boot進行反編譯:使用arm-linux-objdump命令。
在u-boot源碼根目錄,運行:arm-linux-objdump -d u-boot > u-boot.S,這樣,反編譯后的代碼,就在u-boot.S中,我們用vim打開看看

很清楚的看到,我們的程序在0x33f80090處調用了nand_init_ll函數,那么我們就在這里設置好斷點。但是有一點要注意,我們程序的鏈接起始地址是0x33f80000,所以,對于地址0x33f80090在sram中的真實地址是0x00000090,所以我們要在地址0x00000090處設置斷點.
在openocd中,當你halt住cpu之后,可以使用bp命令設置斷點

設置好斷點之后,我們直接輸入bp命令,不加任何參數,可以看到目前設置了幾個斷點。現在,我們把cpu的pc寄存器指向0x0地址,準備從頭運行程序

然后,我們使用resume命令,讓cpu恢復運行狀態,然后程序會在0x00000090處停下來,如下圖:

然后我們使用step命令,可以讓程序單步執行

用這種調試方法,我們可以精確的知道,我們的程序跑到了哪里,對我們診斷問題有非常大的幫助。
關鍵字:U-Boot 移植 調試
引用地址:
U-Boot-2009-03移植筆記(調試篇)
推薦閱讀最新更新時間:2025-04-23 17:38
u-boot 移植 --->3、S5PV210啟動序列
S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,了解到S5PVS10這款芯片的復位過程啟動序列。芯片在出廠時就在內部固化了一段程序internal ROM簡稱iROM,這段代碼在芯片復位一后會自動運行,他主要負責初始化系統的時鐘等具體如下: 1. Disable the Watch-Dog Timer \關閉看門狗 2. Initialize the instruction cache \關閉指定cache 3. Initialize the stack region (see “memory map” on chap 2.5) \設置不同模式的棧指針 4. Init
[單片機]
OK6410A 開發板 (三) 21 u-boot-2021.01 boot 解析 U-boot 鏡像運行部分 standalone
首先搭建 standalone 環境 然后 再驗證 initr_jumptable standalone 環境的搭建 其實就是 一個 加載,執行的過程 加載可用 tftp // 當然也可以用 fatload 或者其他方法,之所以用tftp ,是因為 在這種情況下tftp 是最快速的驗證方法 執行可用 go 1先完成tftp 服務器的安裝 2再完成網絡的設置 3再放置一個 可執行的bin 文件到 tftp 服務器的下載目錄中 4然后在u-boot cmdline 中執行下列code // 為什么 tftp 到 51000000 , 是因為, 這個地址存在且沒被使用 tftp 51000000 2led_c.bin go 51
[單片機]
CPU 的初始化(ARM & u-boot)
1. 設定 CPU 內部寄存器, 包括狀態寄存器和SP等. start_code: /* * set the cpu to SVC32 mode */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr, r0 2. 關閉看門狗. ldr r0, =pWTCON mov r1, #0x0 str r1, 3. 設定中斷向量表. /* * mask all IRQs by setting all bits in the INTMR - default */
[單片機]
uCosII移植到STM32觸發中斷、任務切換的匯編學習
STM32匯編關鍵字含義: IMPORT OSxx ;//IMPORT聲明了OSxx在外文件定義 EXPORT OSxx ;//EXPORT聲明OSxx可以被外文件使用,相當于全局性聲明 LDR R0,=label ;//這是ARM的RISC指令下一個用于內存和CPU寄存器交換數據的指令,用法比較復雜。具體百度。 ;//這里的含義就是把label的地址值賦值給R0,和 LDR R0,label 不同,沒有'='的是取其地址的值傳遞給R0 ;// LDR R0,label ;//取label其地址的值傳遞給R0 LDR?R0,0x12345678 ;//就是把0x12345678這個地址中的值存放到r0
[單片機]
003_STM32程序移植之_W25Q64
1. 測試環境:STM32C8T6 2. 測試模塊:W25Q64FLASH模塊 3. 測試接口: 1. W25Q64FLASH模塊接口: VCC3.3--------------------VCC3.3 GND----------------------GND CS------------------------PB12 DO-----------------------PB14 CLK ---------------------PB13 DI------------------------PB15 2. 串口使用串口一,波特率9600 單片機引腳 CH340引腳 VCC----------------
[單片機]
018_STM32程序移植之_串口接收中文
(一)在平時數據傳輸中很少用到接收中文的情況,但是最近需要用到就花了半天時間來弄弄 (二)接收原理,從現在接收情況分析:一個中文占兩個數據的空間,也就是兩個十六進制可以轉化成為一個中文 (三)示例情況,用Hex Editor來看看中文 “你好”,可以看到四個十六進制數據:0xc4,0xe3,0xba,0xc3 (四)我們的目的還是單片機通過串口來進行數據的接收,用CH340短接T和R看看發送“你好”也是會接收到十六進制0xc4,0xe3,0xba,0xc3 (五)從上面兩點來看,一個中文占據兩個數據,也就是說當我們發送“你好”給單片機時候實際中斷了四次,接收到的數據分別為0xc4,0xe3,0xba,0xc3 那么我們
[單片機]
u-boot-2009.08在mini2440上的移植 增加LCD顯示功能
移植環境 1,主機環境:VMare下CentOS 5.5 ,1G內存。 2,集成開發環境:Elipse IDE 3,編譯編譯環境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,開發板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 7.1添加 LCD 顯示功能 對于這個 LCD 的支持是參考Openmoko 的代碼移植的。Openmoko 的GTA2 使用的是S3C2442 的CPU,在LCD 控制器上是一樣的。而GTA2 在U-boot 的可以在LCD 上顯示字符,而且對于軟件分層的U-
[單片機]
Android + Mini2440 無線網絡視頻監控系統 mjpg-streamer的移植
一、環境 主機環境 : Ubuntu 10.10 目標機 :FS2410(S3C2410) 主機工具鏈 :gcc-4.4.5 交叉工具鏈 :arm-none-linux-gnueabi-gcc-4.3.2 攝像頭 :ZC301 二、移植過程 1、配置內核是內核支持芯片為ZC301的攝像頭 Make menuconfig Device Drivers --- * Multimedia support --- * Video For Linux Enable Video For Linu
[單片機]