田海燕
(中國兵器工業(yè)第五八研究所智能檢測事業(yè)部,四川 綿陽 621000)
CodeWarrior系列集成開發(fā)環(huán)境是Metrowerks公司所設(shè)計(jì)的軟件開發(fā)工具,專用于嵌入式微控制器的調(diào)試開發(fā)。在商用嵌入式軟件開發(fā)工具的使用率方面,該開發(fā)工具排名第一。它結(jié)合了尖端的調(diào)試技術(shù)和建議健全的開發(fā)環(huán)境,把C/C++源級別的調(diào)試和對嵌入式應(yīng)用的開發(fā)帶上了新的臺階。
在本設(shè)計(jì)中,所用到的開發(fā)工具為ARM公司開發(fā)的結(jié)合了CodeWarrior和AXD的GUI開發(fā)環(huán)境,專為ARM設(shè)計(jì)開發(fā)的專用版 CodeWarrior for ARM Develop Suite v 1.2,簡稱為ADS1.2。其圖形用戶界面直觀,功能強(qiáng)大,并且支持源代碼/匯編語言混合調(diào)試,易于使用。
ADS由ARM實(shí)時(shí)庫,命令行開發(fā)工具,實(shí)用程序,GUI開發(fā)環(huán)境(AXD和CodeWarrior)和支持軟件組成。用戶可以輕松地使用這些部件編寫和調(diào)試自己的程序。
LPC2478是恩智浦(原飛利浦)公司開發(fā)的一款基于ARM7TDMI-S內(nèi)核的微控制器。其帶有JTAG口作為實(shí)時(shí)調(diào)試接口,可以執(zhí)行32位的ARM指令,運(yùn)行頻率為72 MHz,帶有512 kB片內(nèi)flash編程存儲器[1]。
本文要討論的硬件平臺為一塊基于LPC2478微控制器開發(fā)的實(shí)驗(yàn)板,其主要功能為通過UART口,實(shí)現(xiàn)微控制器和外部的光電轉(zhuǎn)換器的通信。最小系統(tǒng)電路原理圖如圖1所示。
圖1 LPC2478 JTAG口電路原理
與以往的開發(fā)系統(tǒng)不同,ADS 1.2不必外加昂貴的仿真器連接微控制處理器管腳上的信號,而是通過帶有小型EasyJTAG-H轉(zhuǎn)接頭的JTAG電纜直接與微控制處理器的JTAG調(diào)試口連接,JTAG調(diào)試電纜一端連在計(jì)算機(jī)的并口,一端與微控制器的JTAG口相連,如圖2所示。調(diào)試所需的工裝設(shè)備僅為一根帶有EasyJTAG-H轉(zhuǎn)接頭的JTAG調(diào)試電纜,將仿真功能嵌入到芯片內(nèi)部,省掉了高價(jià)的仿真器,大大簡化了調(diào)試設(shè)備,節(jié)省了開發(fā)費(fèi)用。
JTAG調(diào)試用到了 TCK、TMS、TDI、TDO和 TRST這幾個(gè)腳。實(shí)時(shí)調(diào)試接口JTAG口的電路圖如圖3所示。
圖2 H-JTAG連接示意圖
圖3 LPC2478 JTAG口電路原理
利用ADS1.2開發(fā)軟件的目的就是將調(diào)試環(huán)境下的嵌入式應(yīng)用程序轉(zhuǎn)移到最終獨(dú)立運(yùn)行的LPC2478微控制器中去,這章就詳細(xì)介紹具體調(diào)試過程。
使用EasyJTAG-H下載程序時(shí),需要首先對EasyJTAG-H轉(zhuǎn)接頭配套的軟件進(jìn)行配置[2],如圖4,圖5所示。
圖4 H-JTAG主窗口
圖5 選擇片內(nèi)FLASH
調(diào)用 CodeWarrior for ARM Develop Suite v 1.2,進(jìn)入 ADS 1.2的程序編寫與編譯的GUI環(huán)境,如圖6所示。
圖6 CodeWarrio編譯GUI環(huán)境
在CodeWarrior for ARM Develop Suite v 1.2環(huán)境中,點(diǎn)擊Debug,進(jìn)入AXD調(diào)試下載環(huán)境??稍谟^察窗口監(jiān)測所關(guān)心的變量值,如圖7所示。
圖7 AXD調(diào)試GUI環(huán)境
1)工程名別用中文名路徑,必須全為英文的。
2)如果工程路徑改變,編譯不會(huì)通過,需點(diǎn)擊Project下的Remove Object Code,然后在重新編譯下就OK了。
3)JTAG 的nRST、TDI、TMS、RTCK 等引腳注意要接上下拉電阻,以確保JTAG在上電時(shí)有一個(gè)穩(wěn)定的初始狀態(tài)。
4)當(dāng)在非GPIO模式下操作IOnDIR時(shí),會(huì)出現(xiàn)JTAG調(diào)試中無法暫停的情況,并且AXD會(huì)彈出以下信息的窗口并被迫關(guān)閉:“RDI Severe Error 00602:Can’t halt target and make it enter DEBUG state.”當(dāng)出現(xiàn)這種情況后,需要重新上電,然后重新打開H-JTAG軟件和AXD等。
5)在AXD調(diào)試環(huán)境中,在ROM中設(shè)置的斷點(diǎn)數(shù)僅限2個(gè),且單步運(yùn)行時(shí)內(nèi)部還要占用斷點(diǎn)。進(jìn)行下一步調(diào)試時(shí),需清除上一步的斷點(diǎn)。
在ADS 1.2開發(fā)環(huán)境下,在實(shí)際調(diào)試中,多次遇到全局變量的初值被莫名篡改的情況。如以下情況:則發(fā)送的數(shù)據(jù)完全正確。在MAIN文件中定義的全局變量,隨時(shí)可能在其他子函數(shù)中被篡改,可見,ADS 1.2對全局變量的定義和賦值要求非常苛刻。在此,根據(jù)調(diào)試經(jīng)驗(yàn)提出了幾方面的解決方案。
如圖8所示,直接將全局變量定義到指定地址上,不過定義時(shí)要避開系統(tǒng)的保留地址。此方法可以完全解決ADS 1.2中全局變量的初始化定義問題,只是對于初值不定,需要在主程序中手動(dòng)賦初值。
圖8 將全局變量定義到指定地址上
Volatile主要用在變量會(huì)異步改變的時(shí)候,尤其是CPU外設(shè)寄存器的定義中,中斷和主循環(huán)都會(huì)用到的全局變量等,但據(jù)調(diào)試實(shí)踐,用此方法不能完全解決全局變量的值被篡改的問題。
Const限定了一個(gè)變量不能被改變,一定程度上提高了變量的穩(wěn)定性和安全性。尤其是在定義顯示屏的字庫數(shù)組變量時(shí),一定要在定義前加Const申明數(shù)組為常量,能保證顯示數(shù)據(jù)部會(huì)出錯(cuò)。如圖9所示。
圖9 將常量數(shù)據(jù)定義為Const類型
本文介紹了利用ADS 1.2對周立功的ARM微控制器LPC2478進(jìn)行調(diào)試開發(fā)的過程,探討了開發(fā)過程中的經(jīng)驗(yàn),并給出了在ADS 1.2中解決全局變量被篡改賦值的方法。經(jīng)過具體實(shí)踐,該調(diào)試過程已成功運(yùn)用于試驗(yàn)開發(fā)板的調(diào)試,是很可貴的調(diào)試總結(jié)及經(jīng)驗(yàn)。
[1]Metrowerks.CodeWarrior IDE User Guide[Z].2008.
[2]周立功.ARM嵌入式系統(tǒng)應(yīng)用技術(shù)筆記-基于LPC2400[M].廣州:廣州致遠(yuǎn)電子有限公司,2008.
[3]楊帆,程雯,夏亦冰,等.多傳感器信息融合測控體系在溫室測控中的應(yīng)用研究[J].武漢理工大學(xué)學(xué)報(bào),2011(9):157-159.