嵌入式作業系統學習筆記:02.環境搭建兼 Eclipse Jlink 2440 ARM裸機除錯
注意本文圖片與GIF動畫較大,載入較慢,請耐心等待
環境搭配
儘管本文的環境是以Windows為例,但是Linux與Mac也是幾乎完全類似的。硬體環境
- 板子:2440晶片的板子,但我只有TQ2440,所以就用這個
- 偵錯程式:Jlink
軟體環境
- Windows 10 X64
- Eclipse
- yagarto的 arm-none-gnueabi
- MSYS與miniGW
- babun(對Cygwin進行了打包配置等的Cygwin工具)
- Jlink官方的工具
軟體環境的搭建
1.Eclipse相關
- 安裝Eclipse:下載一個最新的Eclipse,並解壓,然後開啟Eclipse
- 安裝zylinCDT外掛:參考Zylin官方的
2. 安裝MSYS與miniGW
2.1 到SourceForge下載miniGW的Installer,如果無法訪問SourceForge可以到我後面的網盤下載
2.2 選擇安裝MSYS與miniGW
需要注意的是需要選擇MSYS Base與MiniGW32 Base,如下圖:
安裝完成後會有提示:
3. 安裝babun
參考官網的說法
4. 安裝Cross ToolChain
可以隨便找一個安裝來用,但是我驗證過好用的是yagarto-bu-2.23.1_gcc-4.7.2-c-c++_nl-1.20.0_gdb-7.5.1_eabi_20121222.exe,官方已經找不到了,但是搜尋下載。
安裝好後,確認是否設定了環境變數,例如可以在babun的mintty中看看版本,以及路徑:
建立Eclipse工程以及make目標
1. clone下lmosem的程式碼
2. 將程式碼放到Eclipse的workspace下,即Eclipse啟動的時候詢問的位置
3. 從Eclipse匯入檔案,並建立工程,工具鏈這一步可以隨便選擇
4. 建立make目標這樣子,就不需要敲命令列來編譯與clean了
在Eclipse的make target中右鍵New,然後填入all,並確定,然後重複再建立一個clean目標,示例圖如下:
5. 測試編譯環境是否有問題
雙擊make targe目標clean,然後再雙擊all,如果像下面這樣子(注意看底下的console視窗的輸出
如果出現下面這樣的提示,那麼就是MSYS沒有設定進PATH中:
那麼此時也可以在Project屬性中新增一個PATH路徑,這樣子可以不汙染系統PATH:
然後再次測試make targe的clean與all是否正常。如果正常,那麼編譯環境就OK了,以後我們就用這個編譯環境。
配置Eclipse Jlink Debug
1. 建立新的DebugConfiguration
在Run選單中選擇Debug Configrations,然後新建一個ZylinDebug Configarations(注意是Native不是Cygwin)。然後繼續下面的配置。
2. 載入的ELF Symbol檔案配置
因為偵錯程式需要載入ELF Symbol檔案,因此需要在Main標籤中指定編譯出來的ELF檔案,如下圖,注意將下面的Application Console也選中:
3. gdb配置
我們使用的是gdb來連線Jlink GdbServer的方式來除錯,而Eclipse作為一個前端,因此需要配置後端的gdb檔案,因此我們指定gdb:
這裡面使用的是前面安裝的Cross ToolChain中的gdb,這個也可以在babun中確認:
需要注意的是裡面有一個“Stop on start at:”這個選項,這裡面可以填一個我們需要gdb載入符號開始跑後,在遇到某個符號的時候停下來,我們可以在這裡配置也可以先不配置,在後面配置。
4. InitCommand配置
在使用Jlink連線了ARM晶片之後,我們還需要對SoC進行一些初始化等配置工作,這些工作就是在這裡進行的,針對於我使用的TQ2440,我是如下配置的:
target remote localhost:2331
monitor arm920t sw_bkpts enable
monitor endian little
monitor reset
monitor MemU32 0x53000000=0x00000000
monitor MemU32 0x53000000=0x00000000
monitor MemU32 0x4A000008=0xFFFFFFFF
monitor MemU32 0x4A00001C=0x000007FF
monitor MemU32 0x56000050=0x000055AA
monitor MemU32 0x4C000014=0x00000007
monitor MemU32 0x4C000000=0x00FFFFFF
monitor MemU32 0x4C000004=0x00061012
monitor MemU32 0x4C000008=0x00040042
monitor MemU32 0x48000000=0x22111120
monitor MemU32 0x48000004=0x00000700
monitor MemU32 0x48000008=0x00000700
monitor MemU32 0x4800000C=0x00000700
monitor MemU32 0x48000010=0x00001f4c
monitor MemU32 0x48000014=0x00000700
monitor MemU32 0x48000018=0x00000700
monitor MemU32 0x4800001C=0x00018005
monitor MemU32 0x48000020=0x00018005
monitor MemU32 0x48000024=0x008e04f4
monitor MemU32 0x48000028=0x00000032
monitor MemU32 0x4800002C=0x00000030
monitor MemU32 0x48000030=0x00000030
load
#break do_menu
#break _start_armboot
break lmosemhal_start
#break main
continue
這裡面主要做了以下幾個動作:
- 連線到gdb server
- 設定大小端
- 讓SoC進行Reset
- 配置記憶體
- 載入我們在前面第2步指定的ELF檔案
- 在lmosemhal_start這個符號處設定斷點
- 開始跑
將這段放入Command中:
如果是其他平臺還需要進行更改。
5. Debug段的新增
ELF檔案在原本的CFLAGS配置下是不會包含Debug資訊的,如果這樣子除錯的話,gdb會無法找到除錯時候PC指標所在檔案對應的Source Code,也就無法進行程式碼同步檢視,出現如下的問題:
這不是我們想要的結果,因此更改Makefile中的CFLAGS,讓產生的ELF檔案包含debug資訊:
即載入-g選項
6. 重新生成ELF檔案
更改了CFLAGS,那麼我們可以在make target中的雙擊clean,然後雙擊all,完成make clean與make all。
7. Jlink gdbServer配置
首先是安裝Jlink偵錯程式的對應軟體,安裝完成後有許多的工具:
然後關閉所有的防火牆或者網路攔截工具,否則下面的jdbServer無法正常被連線。
接下來就是開啟Jlink GDB Server,開啟後的狀態如下,處在等待連線狀態,注意檢視紅色部分:
然後我們從Eclipse中開啟除錯:
如果沒有問題,那麼Eclipse中的gdb會連線上Jlink gdb Server,然後Server端會顯示連線了:
同時Eclipse這段也會進行init處理,即前面我們說到的那段Init命令,效果如下動畫,注意底下的console視窗:
到此,我們就構建好了除錯與編譯環境。
更改Encoding解決檔案的亂碼問題
因為有中文,為了Editor,Makefile中不亂碼,如下面幾個圖,配置UTF-8即可。
1. Editor的配置
2. Makefile編輯器的配置
但是console的亂碼不知道該怎麼解決,Search了一把也沒有找到就放棄了,要是大家知道,麻煩告知。
其他問題
Q1. 是否可以使用DS-5替代Eclipse?
A1:分下面兩種情況
[1] 如果僅僅是使用DS-5帶的Eclipse,但是其他都按照本文前面的步驟來做,那麼答案是不可以,因為DS-5的Eclipse經過ARM公司改裝後,發現都沒有了Install New Softwares選項
[2] 如果不僅僅是使用DS-5帶的Eclipse,還要用Jlink的RDDI來替換DS-5的,然後通過這個RDDI介面來訪問Jlink,而不需要ZylinCDT的話,那麼答案是可以,以後會說明。但就現在我的嘗試而言,發現安裝官方的文件操作遇到了一個問題,看起來是dll匹配問題:
Q2. Linux Mac下面是否也可以這樣搭配環境?
A2: 可以,Linux下面更方便。操作步驟幾乎完全類似。有需求再寫。
Q3. 是否可以不是用Eclipse,直接使用gdb?
A3: 沒有問題,但是Eclipse更方便。