<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 利用JTAG OCD加速Linux設備開(kāi)發(fā)

利用JTAG OCD加速Linux設備開(kāi)發(fā)

作者:風(fēng)河系統公司 韓青 時(shí)間:2008-05-06 來(lái)源:《電子設計應用》 收藏

  引言

本文引用地址:http://dyxdggzs.com/article/82189.htm

  傳統上,調試嵌入式產(chǎn)品需要將硬件和軟件工具結合起來(lái),如用JTAG工具進(jìn)行硬件bring-up,用基于代理(agent-based)的解決方案進(jìn)行軟件開(kāi)發(fā)。這些JTAG和基于代理的工具相結合的方法通??梢越鉀Q單點(diǎn)問(wèn)題,但它們最初并不是專(zhuān)門(mén)針對集成化的開(kāi)發(fā)而設計的。因而,在當今集成化的產(chǎn)品開(kāi)發(fā)中,這些傳統方法常常是不可行的。

  但是,我們可以在內核的配置、補丁管理以及在基于Eclipse的IDE環(huán)境中的用戶(hù)空間應用開(kāi)發(fā)、調試和分析之中,將傳統JTAG硬件調試融入其中得到一種全新的方法,從而完全改變開(kāi)發(fā)人員使用JTAG連接進(jìn)行Linux設備軟件調試的方法,這就是Wind RiverWorkbench。

  Linux設備調試的復雜性

  在嵌入式設備領(lǐng)域,Linux的應用正在迅速增加。根據技術(shù)市場(chǎng)研究機構VDC的報告,在新的設備研發(fā)項目中,有23%會(huì )采用Linux。由于開(kāi)發(fā)工作跨越、Linux內核、內核模塊和應用,調試工作很可能極為復雜。Linux開(kāi)發(fā)人員必須面對的問(wèn)題包括為建立目標配置文件,在用戶(hù)模式和內核模式之間雙向對硬Linux虛擬地址、映射內核符號信息以及排除遍布于用戶(hù)和內核空間之中的差錯。包括內核GNU調試器和GNU調試器在內,在基于代理的調試方案中,要想解決上述任何問(wèn)題都會(huì )遇到極大困難。

  調試

  如果浪費太多的時(shí)間在BootLoader的開(kāi)發(fā)與調試上,將會(huì )嚴重影響開(kāi)發(fā)人員對于系統穩定性、設備軟件與應用開(kāi)發(fā)的精力投入。因此,開(kāi)發(fā)人員應當借助于先進(jìn)的工具,盡快逾越這個(gè)階段。

  Linux需要依靠BootLoader來(lái)啟動(dòng)操作系統。這段代碼存放在Flash或者其他非易失性存儲器之中,在系統開(kāi)機或者復位之后立即運行。Boot Loader的調試可能會(huì )非常復雜。這段代碼與硬件密切相關(guān),在系統啟動(dòng)之后開(kāi)發(fā)人員必須把它從Flash存儲重新定位到RAM之中。在今天的SoC處理器中可能包括了數百個(gè)配置寄存器,都需要在此時(shí)進(jìn)行初始化,這項工作需要熟悉數千頁(yè)的特殊設定文檔。如果設定寄存器錯誤,可能導致隨后Linux內核或者應用調試的異常。并且手工編輯寄存器設定是一項極為繁瑣易錯的工作。

  Boot Loader開(kāi)發(fā)的另一項常見(jiàn)挑戰出現在Boot Loader把Linux裝入RAM并啟動(dòng)操作系統的時(shí)候?;诖淼恼{試解決方案不支持BootLoader調試,因為在此過(guò)程中還沒(méi)有開(kāi)始發(fā)揮作用。因此,開(kāi)發(fā)人員只能寄希望于JTAG工具。

  JTAG調試解決方案提供了很強的能力來(lái)幫助開(kāi)發(fā)人員快速有效地完成Boot Loader的測試與故障排除工作。它使寄存器設置工作大大簡(jiǎn)化,通過(guò)設置硬件斷點(diǎn)以及單步執行Flash中的代碼,可以快速發(fā)現原代碼中的錯誤。IDE可以支持反匯編,還可以讓你混合查閱源代碼和匯編代碼,符號管理功能比較便于代碼從Flash向RAM的重新定位,使整個(gè)調試工作得到很大幫助。

  JTAG調試解決方案不需要通過(guò)Boot Loader即可裝載Linux內核。對于那些在Boot Loader尚未完成之前就希望開(kāi)始系統開(kāi)發(fā)的項目管理人員來(lái)說(shuō),這項功能具有特殊的重要意義。提供了引導行能力的JTAG調試解決方案可以支持Boot Loader和操作系統穩定化的并行開(kāi)發(fā),從而加速軟件開(kāi)發(fā)項目的整體進(jìn)程。

  Linux內核及內核模塊調試

  Linux內核及內核模塊是Linux操作系統的核心構建。在系統被Boot Loader初始化之后,首先裝載的就是Linux內核。Linux模塊則根據需要進(jìn)行裝載。在進(jìn)行操作系統bring-up時(shí),開(kāi)發(fā)人員必須專(zhuān)注于Linux操作系統的優(yōu)化或剪裁以及內核模塊的開(kāi)發(fā),需要必須密切監控硬件與軟件之間的互動(dòng)。Linux內核調試要求具備觀(guān)察寄存器、數據緩存器及其它底層數據。LinuxKGDB要求具備穩定的Linux內核,并且確保諸如設備驅動(dòng)之類(lèi)的客戶(hù)硬件接口處于就緒狀態(tài),其中的代理才能工作?;诖淼恼{試不具備底層硬件的可視化能力,也不能提供完全的診斷功能,因而無(wú)法讓開(kāi)發(fā)者了解硬件與Linux內核之間的互動(dòng)。

  如果采用代理來(lái)調試Linux內核和內核模塊,在進(jìn)入調試斷點(diǎn)時(shí)可能會(huì )涉及系統暫?;蛘邇鼋Y方面的問(wèn)題。例如,KGDB無(wú)法暫停CPU(特別是在多核或者多處理器環(huán)境中)來(lái)讓開(kāi)發(fā)人員檢查CPU的現行狀態(tài),它也不能幫助開(kāi)發(fā)人員對崩潰的系統進(jìn)行調試,因為崩潰的操作系統顯然已經(jīng)不能再運行代理。而且,KGDB還需要以太網(wǎng)等通信接口實(shí)現主機系統與目標之間的溝通??傊?,采用代理來(lái)實(shí)現Linux內核模式調試,需要具備由IP棧、穩定的Linux內核和處于運行狀態(tài)的設備驅動(dòng)。在上述條件尚未具備,或者上述軟件本身還需要調試的時(shí)候,基于代理的調試顯然就無(wú)能為力。

  為了實(shí)現并驗證一個(gè)目標系統中的Linux內核,必須擁有可以監控和管理Linux內核和內核模塊的全面調試解決方案?;贘TAG的調試解決方案功能特性包括查看局部/全局符號和寄存器以及指令和數據緩存器。已經(jīng)有商業(yè)化的JTAG調試解決方案可以把物理內存和虛擬內存順暢地映射過(guò)來(lái),從而幫助開(kāi)發(fā)人員正確地觀(guān)察內存地址和內容,也具有對Linux內核模塊進(jìn)行調試的能力,以及在不必反復連接和切斷目標系統的前提下多次裝載和卸載。

  JTAG調試解決方案的另一個(gè)重要能力是把系統完全置于暫停狀態(tài)并且全面觀(guān)察操作系統和應用的狀態(tài)。這種能力又被稱(chēng)為“系統模式調試(system mode debug)”,對于Linux內核和Linux內核模塊的調試是極為有用的。有了系統模式調試能力,開(kāi)發(fā)人員就可以把整個(gè)系統完全暫停下來(lái),包括處理器、操作系統和所有的線(xiàn)程以及中斷處理程序。以這種方式暫停系統,就有可能獲得系統硬件和軟件的完整細節視圖,當然也可以讓系統繼續執行或者分步驟執行某些代碼。

  因此,在一些KGDB無(wú)法使用的情況下,JTAG解決方案就可大派用場(chǎng),特別是在Linux內核出錯或者目標崩潰的情況下更是如此。因此JTAG解決方案在提升操作系統和設備驅動(dòng)穩定性方面特別有用。

       

  Linux應用調試

  Linux應用是在Linux內核控制之下運行的用戶(hù)程序,它通過(guò)系統調用來(lái)訪(fǎng)問(wèn)系統資源。Linux內核負責處理系統調用并且決定如何來(lái)提供硬件和內存訪(fǎng)問(wèn)。

  對于用戶(hù)模式下的應用調試,開(kāi)發(fā)人員需要通過(guò)啟動(dòng)和停止線(xiàn)程、查看變量和堆棧來(lái)直接訪(fǎng)問(wèn)應用線(xiàn)程。由于一個(gè)應用可能由多個(gè)進(jìn)程或者線(xiàn)程組成,所以有可能需要停止與正在調試的應用線(xiàn)程相關(guān)的所有線(xiàn)程。開(kāi)發(fā)人員也常常需要跨越不同的進(jìn)程和CPU來(lái)查看外設寄存器。然而,GDB只能在線(xiàn)程的級別上操作,而且只能啟動(dòng)和停止單個(gè)線(xiàn)程,根本不具備啟動(dòng)和停止整個(gè)系統或者同時(shí)啟動(dòng)/停止多個(gè)線(xiàn)程的能力。

  另外,在用戶(hù)模式下進(jìn)行調試的時(shí)候,可能會(huì )因為單步運行系統調用而從用戶(hù)模式進(jìn)入Linux內核模式,然后又單步執行回到用戶(hù)模式。在Linux的虛擬內存結構下,在兩種模式之間來(lái)回轉換的同時(shí)還要保持內存地址跟蹤,僅僅依賴(lài)于物理地址將會(huì )效果有限。于是,基于代理的解決方案需要同時(shí)采用GDB和KGDB來(lái)跟蹤系統調用進(jìn)入Linux內核和內核模塊。同時(shí),這個(gè)過(guò)程將會(huì )非常復雜。

  Linux應用開(kāi)發(fā)人員也常常遇到?jīng)]有配備以太網(wǎng)或者串行通信接口的設備開(kāi)發(fā)項目。即便是配有這些通信接口,相應的軟件也不一定能很快就開(kāi)發(fā)完成。而基于代理的調試方法必須依賴(lài)這些通信接口才能工作。如果目標設備沒(méi)有通信接口,或者這些通信接口本身還需要開(kāi)發(fā)與調試,或者內存對于IP?;虼碥浖豢捎?,在這些情況下,基于代理的方法也不能使用。

  基于JTAG的調試方法對于運行在Linux用戶(hù)模式下的應用則具有深度可視化能力。對于提出系統調用的應用,雙模式的JTAG調試解決方案還將可視化的深度延伸到Linux內核,所有的應用線(xiàn)程、運行環(huán)境以及在線(xiàn)程變量中用到的參數都一覽無(wú)遺,而且這些功能的實(shí)現不會(huì )對Linux內核本身造成任何影響。對于沒(méi)有通信接口的目標設備,例如移動(dòng)電話(huà)、醫療設備、車(chē)載設備等,基于JTAG的調試解決方案都顯示出遠高于基于代理調試的優(yōu)越性。一個(gè)Linux的軟件與硬件連接如圖1所示。

  采用系統模式調試可以讓多線(xiàn)程應用調試大大簡(jiǎn)化,這是因為開(kāi)發(fā)人員獲得了暫停處理器并觀(guān)察操作系統和全部線(xiàn)程運行狀態(tài)的能力。如前所述,許多問(wèn)題的發(fā)生是因為多個(gè)線(xiàn)程之間的交互。而基于代理的調試根本不具備停止全部線(xiàn)程的能力,自然也就難以發(fā)現問(wèn)題所在,這就意味著(zhù)工程進(jìn)度將會(huì )因為調試工作的低效率而被大大延遲。

  基于JTAG的調試解決方案與目標硬件的連接是非干擾性的,可以連接到一個(gè)已經(jīng)運行并且發(fā)生錯誤的目標系統之中,也可以不改變處理器寄存器的狀態(tài),即可觀(guān)察到Linux內核和應用的運行狀況并進(jìn)行調試。例如,如果一個(gè)Linux的目標設備進(jìn)入死鎖狀態(tài),利用JTAG調試工具,開(kāi)發(fā)人員就可以在不會(huì )破壞現場(chǎng)狀態(tài)的前提下與目標系統連接,進(jìn)而觀(guān)察其中的Linux內核對象、應用運行情況,找到引發(fā)錯誤的線(xiàn)程、系統調用以及調用參數。在有些情況下,基于代理的調試工具根本無(wú)法使用,而基于JTAG的調試工具卻可以簡(jiǎn)化調試工作,加快調試進(jìn)度。

  Wind River基于JTAG的Linux調試工具

  Wind Rivet推出的基于JTAG的OCD((On-Chip Debugging,片上調試)解決方案運行在符合工業(yè)標準的Eclipse平臺上,為嵌入式Linux設備提供了先進(jìn)的基于JTAG的調試功能特性。

  Workbench OCD主要支持Wind River Linux。不過(guò),對于開(kāi)發(fā)者自行獲得的Linux或者半導體廠(chǎng)商提供的Linux版本,Wind River也可提供片上調試功能,也為kernel.org Linux提供基于JTAG的內核及用戶(hù)模式調試。Wind River調試解決方案還支持廣泛的目標硬件,包括先進(jìn)的多核處理器。它還支持移動(dòng)終端設備市場(chǎng)上所有最新的主流處理器,實(shí)現各種量身定制的增強功能特性,使設備軟件和硬件的開(kāi)發(fā)調試變得更加簡(jiǎn)單、更加直觀(guān)。

  Workbench實(shí)現了與Eclipse全整合,并且通過(guò)在Workbench基于Eclipse的環(huán)境中加入新的視圖和功能模塊,進(jìn)一步加強了IDE的支持。

  目前,大多數移動(dòng)終端設備都采用了多處理內核,對很多片上調試解決方案都造成很大的挑戰。JTAG Server和JTAG Accelerator技術(shù)提供了面向多內核處理器的高速JTAG調試能力。JTAG Accelerator技術(shù)支持當前最復雜的32位和64位處理器,實(shí)現了JTAG帶寬利用率的最大化。JTAG Servet技術(shù)則使開(kāi)發(fā)人員能夠同時(shí)連接多達128個(gè)處理器,并且在單個(gè)IDE實(shí)例中動(dòng)態(tài)地調試多個(gè)處理器。

  這樣,Linux開(kāi)發(fā)人員可以靈活地采用JTAG連接來(lái)進(jìn)行硬件bring-up、Linux內核、中間件和用戶(hù)模式應用的調試,并且在適當的時(shí)候轉移到基于代理的調試方式之下,而且不論是JTAG或是代理模式都在同一個(gè)IDE架構之中,這種功能可以顯著(zhù)改善多個(gè)開(kāi)發(fā)團隊之間的協(xié)同效率,節省排除差錯的時(shí)間。

  結語(yǔ)

  由于嵌入式系統已經(jīng)變得越來(lái)越復雜,軟件開(kāi)發(fā)人員在調試工作上所面臨的挑戰也越來(lái)越多。傳統基于代理的Linux調試解決方案在用戶(hù)模式和內核模式的調試上的有效性都面臨尷尬?;贘TAG的調試可以在Linux開(kāi)發(fā)中扮演極有價(jià)值的角色,當它與Eclipse之類(lèi)的標準化開(kāi)發(fā)環(huán)境相結合,就可以顯著(zhù)改善編輯-編譯-調試過(guò)程。在產(chǎn)品上市速度已經(jīng)成為關(guān)鍵因素的今天,擁有高效率的Wind RiverWorkbench調試工具無(wú)疑是明智的選擇。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


關(guān)鍵詞: JTAG OCD Linux Boot Loader

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>