VELT的全稱是Visual EmbedLinuxTools,它是1個與visual gdb類似的visual studio插件,用以輔助完成Linux開發。利用這個插件,將可以在visual studio的IDE中進行Linux利用程序的開發(包括編譯和調試),也能夠進行uboot和linux內核的編譯,并根據編譯時的毛病信息正肯定位到源碼。目前的版本是0.1.4,僅支持vs2013。此插件可以在CSDN下載頻道下載(http://download.csdn.net/detail/lights_joy/8429771),安裝進程參見《用vs2013+velt-0.1.4進行嵌入式開發:插件安裝》。下面是它的基本功能:
支持x86 Linux,海思hi3516/hi3520,MinGW這幾個平臺,提供這幾個平臺的項目模板。
完成UBOOT的編譯,并根據編譯的毛病信息自動定位到相應的文件位置。
完成LINUX內核的編譯,并根據編譯的毛病信息自動定位到相應的文件位置。
在VS下完成Linux內核的配置。
不使用Makefile進行Linux利用程序的編譯。
使用Makefile進行Linux利用程序的開發。
使用SSH連接目標機器并用gdb進行利用程序的調試。
使用Telnet連接目標機器并用gdb進行利用程序的調試。
在VS中集成Linux終端(Poderosa),支持SSH/Telnet/Com,在打開終端時自動將VS的變量導出為bash里的變量,如ProjectDir等。
接下來嘗試通過串口調試Linux內核。
以hi3520的內核為實驗對象。
首先打開內核的調試開關:
加上內核的調試信息:
打開kgdb
在UBOOT下配置傳遞給內核的參數:
Kernel command line: mem=127m console=ttyAMA0,115200ip=192.168.110.10:::255.255.255.0::eth0: root=mtd:work02 init=/sbin/initmtdparts=hi_sfc:256K(uboot01),64K(env01),64K(sysinfo01),3712k(configs01),8M(boot01),20M(work01),256K(uboot02),64K(env02),64K(sysinfo02),3712k(configs02),8M(boot02),20M(work02)kgdboc=ttyAMA0,115200 kgdbwait
這里最重要的是kgdboc和kgdbwait兩個參數,前1個參數指明要使用的串口參數,后1個參數讓kgdb在內核啟動的時候進行等待。
加載內核:
kgdb: Registered I/O driver kgdboc.
kgdb: Waiting for connection from remote gdb...
然后系統開始等待。
直接用MinGW gdb打開編譯內核時生成的vmlinux文件,
然后用
target remote COM1
連接串口,很遺憾,超時!
檢查了1下內核的代碼,在等待連接時內核停在了下面的位置:
它將不停地查詢串口上是不是有數據,剛開始時懷疑是串口參數配置不正確致使讀取不到數據,但跟蹤進去后發現這里的read_char可以正確地調用串口驅動(amba-pl011.c)中的查詢函數:
只不過在讀取UART01x_FR寄存器時總是返回無數據的結果。
進1步的檢查發現這個時候串口的接收使能是關閉的,而發送使能則是打開的!因此串口固然只能發送數據不能接收了!
不太想追究為何會這樣,直接在shutdown函數中打開接收使能:
修改了這1行:
原來的代碼是這樣的:
直接給上加上使能標記!
再履行gdb的target remote COM1命令,可以正常連接了!!
在HI3520的內核中已帶了kdb的支持:
當選上最下面的那個選項時將啟用kdb,這樣我們就能夠在目標機器上履行1些簡單的調試命令了,也不需要依賴于主機上的gdb。
但由于我們希望通過gdb結合源碼進行調試,因此不選擇kdb,僅僅用kgdb。