掃自己的盲,給別人看。 依然源自《主流ARM嵌入式系統設計技術與執行個體精解》
*******************************************************************************
關於開發工具和調試
*******************************************************************************
關於硬體調試
工具箱:萬用表,示波器,電烙鐵等
調試方法,注意模組化
1) 一般從電源供電部分開始,最好單獨調試這一塊,比如有可能的話切斷對後
端負載的供電,保證各路供電電壓正常,然後用示波器測試各路供電電壓的紋
波,一般在50mV以內都算正常。
2) 然後接上負載,測量各處晶振的工作情況。無源晶振一般波形近於正弦波,
有源晶振多近於方波。
3) 調試最小系統,確保JTAG部分的串連正確,測量Flash和SDRAM上的時鐘訊號,
執行Reset操作測量CPU的Reset訊號。如果工作正確,使用適當軟體可以燒寫Boot
Loader了。Boot Loader啟動以後就可以通過某個特定外設來燒寫檔案系統和內
核了。
4) 根據具體應用對各外圍子系統分別進行調試。
5) 整體調試
這是學究式的教條式做法,具體實踐中可以靈活變通,實用為王。
工具箱
開發板(通常必須)
硬體模擬器(可選)
下載調試工具(JTAG)(必須)
開發編譯環境(必須)
編譯器arm-linux-gcc
彙編器arm-linux-as
連結器arm-linux-ld
庫管理arm-linux-ar
版本管理 CVS, SVN, GIT等
LDS連結指令碼,Makefile等(略)
*******************************************************************************
關於啟動
*******************************************************************************
Boot過程,一般包括
大小端配置,ARM一般預設為小端格式,但是可以配置為大端格式。一般在上電時確定
外圍記憶體介面配置,通常對Flash的初始化代碼一般都位於bootloader裡
啟動模式選擇,一般是通過硬體連線來確定的,比如從哪個位置以16位還是32位啟動
記憶體位址重新對應,主要是由於異常向量入口需要重新對應。
關於記憶體重新對應
CPU設計人員為了簡化晶片設計,一般將所有異常入口集中放置在非易失性儲存空間中,
並在系統上電時將其映射到一個固定的連續地址空間上。由於讀取非易失性儲存空間的
速度限制以及可能的位寬不匹配問題引入的效能問題,所以引入了重新對應技術。就是
對已經確立的儲存空間映射再次修改,即重新分配地址資源。MAP發生在系統上電的時
候,REMAP則在系統上電穩定後發生,並且REMAP並不是必須的。
REMAP一般開始於系統的Boot Loader,一般是Boot Loader將非易失性儲存空間中的異常
向量複製到主存中,然後執行REMAP命令,將位於主存的異常向量區塊對應到以稱向量表
地址空間上。這樣以後系統產生的異常處理將從主存中開始執行。
*******************************************************************************
關於Boot Loader
*******************************************************************************
一般基於ARM處理器的Linux嵌入式開發,基本都是硬體板卡設計和軟體系統設計同步進行。
硬體準備好之後,首先要將Boot Loader,核心,檔案系統等移植到硬體系統上。最先一步
就是要移植Boot Loader先啟動系統。
Boot Loader的主要工作:初始化板上硬體,收集硬體資源資訊以提供給作業系統,引導、
載入作業系統。
常用Boot Loader,可以參見wikipedia上關於它的介紹,要選擇適用於嵌入式系統的。
http://en.wikipedia.org/wiki/Comparison_of_boot_loaders
這裡只介紹U-Boot,目前該項目位於:
http://www.denx.de/wiki/U-Boot/
關於U-Boot
Universal Boot Loader,曆史淵源可以去看它的網站上的介紹。最大特點在於對眾多處理
器架構的支援。
U-Boot提供兩種模式,啟動載入模式(boot loading)和下載模式(downloading)。
U-Boot提供了大量功能,包括乙太網路支援,BOOTP/TFTP,線上讀寫FLASH等外設,串口支
持,識別多種二進位格式(ELF32,pImage等),指令碼支援,監控等。
U-Boot常用命令
1) 列印環境變數, printenv
2) 設定環境變數, setenv
3) 儲存環境變數, saveenv
4) 通過串口下載, loadb
5) tftp網路下載,一般要先設定網路環境,然後通過網路下載映像檔案到特定位置
U-boot> setenv ethaddr xx:xx:xx:xx:xx:xx
U-boot> setenv ipaddr xx.xx.xx.xx
U-boot> setenv serverip xx.xx.xx.xx (tftp server address)
U-boot> tftp xxxxxxxx kernel.bin
6) 記憶體操作命令:md, mm, nm, mw, cp, cmp, mtest
7) 快閃記憶體操作命令:protect, erase, flinfo
8) 檔案系統命令:fatls, fatload, nfs
9) 指令碼: run, bootcmd
a) CPU控制命令:go, bootm, bootp, kgo
b) 其他命令:usb, help, ?, ping
一般Boot loader的工作流程
1) 系統複位
2) 從複位向量地址開始執行,通常是某cpu下面的Start.S彙編代碼。這裡完成定義
異常向量表(需要關中斷),初始化SDRAM,配置CPU模式,初始化工作時鐘等
3) 把啟動代碼複製到RAM中,然後進行地址重新對應,然後開始執行啟動常式(一般用
C編寫),這裡初始化各種將要用到板上外設。
移植U-Boot主要是針對特定板子的移植,包括快閃記憶體、記憶體配置,串口配置等。如果有需要
在boot階段需要啟動的特殊硬體模組,那麼需要自行添加對應的驅動支援。具體來說一般
需要移植如下幾塊:
CPU初始化部分,包括工作頻率,時鐘模組,大小端配置,Cache初始化
記憶體(SDRAM和FLASH)初始化,對應的介面寄存器設定各個參數,Flash初始化
常用必備外設介面初始化:串口、網卡介面、GPIO介面等
啟動參數修改
連結編譯的地址分配,主要在.lds檔案中
編譯參數的修改,主要修改Makefile檔案