VELT的全稱是Visual EmbedLinuxTools,它是1個(gè)與visual gdb類似的visual studio插件,用以輔助完成Linux開發(fā)。利用這個(gè)插件,將可以在visual studio的IDE中進(jìn)行Linux利用程序的開發(fā)(包括編譯和調(diào)試),也能夠進(jìn)行uboot和linux內(nèi)核的編譯,并根據(jù)編譯時(shí)的毛病信息正肯定位到源碼。目前的版本是0.1.4,僅支持vs2013。此插件可以在CSDN下載頻道下載(http://download.csdn.net/detail/lights_joy/8429771),安裝進(jìn)程參見《用vs2013+velt-0.1.4進(jìn)行嵌入式開發(fā):插件安裝》。下面是它的基本功能:
支持x86 Linux,海思hi3516/hi3520,MinGW這幾個(gè)平臺(tái),提供這幾個(gè)平臺(tái)的項(xiàng)目模板。
完成UBOOT的編譯,并根據(jù)編譯的毛病信息自動(dòng)定位到相應(yīng)的文件位置。
完成LINUX內(nèi)核的編譯,并根據(jù)編譯的毛病信息自動(dòng)定位到相應(yīng)的文件位置。
在VS下完成Linux內(nèi)核的配置。
不使用Makefile進(jìn)行Linux利用程序的編譯。
使用Makefile進(jìn)行Linux利用程序的開發(fā)。
使用SSH連接目標(biāo)機(jī)器并用gdb進(jìn)行利用程序的調(diào)試。
使用Telnet連接目標(biāo)機(jī)器并用gdb進(jìn)行利用程序的調(diào)試。
在VS中集成Linux終端(Poderosa),支持SSH/Telnet/Com,在打開終端時(shí)自動(dòng)將VS的變量導(dǎo)出為bash里的變量,如ProjectDir等。
接下來(lái)嘗試通過(guò)串口調(diào)試Linux內(nèi)核。
以hi3520的內(nèi)核為實(shí)驗(yàn)對(duì)象。
首先打開內(nèi)核的調(diào)試開關(guān):
加上內(nèi)核的調(diào)試信息:
打開kgdb
在UBOOT下配置傳遞給內(nèi)核的參數(shù):
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兩個(gè)參數(shù),前1個(gè)參數(shù)指明要使用的串口參數(shù),后1個(gè)參數(shù)讓kgdb在內(nèi)核啟動(dòng)的時(shí)候進(jìn)行等待。
加載內(nèi)核:
kgdb: Registered I/O driver kgdboc.
kgdb: Waiting for connection from remote gdb...
然后系統(tǒng)開始等待。
直接用MinGW gdb打開編譯內(nèi)核時(shí)生成的vmlinux文件,
然后用
target remote COM1
連接串口,很遺憾,超時(shí)!
檢查了1下內(nèi)核的代碼,在等待連接時(shí)內(nèi)核停在了下面的位置:
它將不停地查詢串口上是不是有數(shù)據(jù),剛開始時(shí)懷疑是串口參數(shù)配置不正確致使讀取不到數(shù)據(jù),但跟蹤進(jìn)去后發(fā)現(xiàn)這里的read_char可以正確地調(diào)用串口驅(qū)動(dòng)(amba-pl011.c)中的查詢函數(shù):
只不過(guò)在讀取UART01x_FR寄存器時(shí)總是返回?zé)o數(shù)據(jù)的結(jié)果。
進(jìn)1步的檢查發(fā)現(xiàn)這個(gè)時(shí)候串口的接收使能是關(guān)閉的,而發(fā)送使能則是打開的!因此串口固然只能發(fā)送數(shù)據(jù)不能接收了!
不太想追究為何會(huì)這樣,直接在shutdown函數(shù)中打開接收使能:
修改了這1行:
原來(lái)的代碼是這樣的:
直接給上加上使能標(biāo)記!
再履行gdb的target remote COM1命令,可以正常連接了!!
在HI3520的內(nèi)核中已帶了kdb的支持:
當(dāng)選上最下面的那個(gè)選項(xiàng)時(shí)將啟用kdb,這樣我們就能夠在目標(biāo)機(jī)器上履行1些簡(jiǎn)單的調(diào)試命令了,也不需要依賴于主機(jī)上的gdb。
但由于我們希望通過(guò)gdb結(jié)合源碼進(jìn)行調(diào)試,因此不選擇kdb,僅僅用kgdb。