1. 程式人生 > >嵌入式作業系統學習筆記:02.環境搭建兼 Eclipse Jlink 2440 ARM裸機除錯

嵌入式作業系統學習筆記:02.環境搭建兼 Eclipse Jlink 2440 ARM裸機除錯

注意本文圖片與GIF動畫較大,載入較慢,請耐心等待

環境搭配

儘管本文的環境是以Windows為例,但是Linux與Mac也是幾乎完全類似的。

硬體環境

  1. 板子:2440晶片的板子,但我只有TQ2440,所以就用這個
  2. 偵錯程式:Jlink

軟體環境

  1. Windows 10 X64
  2. Eclipse
  3. yagarto的 arm-none-gnueabi
  4. MSYS與miniGW
  5. babun(對Cygwin進行了打包配置等的Cygwin工具)
  6. Jlink官方的工具

軟體環境的搭建

1.Eclipse相關

  1. 安裝Eclipse:下載一個最新的Eclipse,並解壓,然後開啟Eclipse
  2. 安裝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視窗的輸出

),那麼說明編譯與clean沒有問題了:


如果出現下面這樣的提示,那麼就是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

這裡面主要做了以下幾個動作:
  1. 連線到gdb server
  2. 設定大小端
  3. 讓SoC進行Reset
  4. 配置記憶體
  5. 載入我們在前面第2步指定的ELF檔案
  6. 在lmosemhal_start這個符號處設定斷點
  7. 開始跑

將這段放入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更方便。

參考