www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]Keil 的調(diào)試命令、在線匯編與斷點設(shè)置上一講中我們學(xué)習(xí)了如何建立工程、匯編、連接工程,并獲得目標代碼,但是做到這一步僅僅代表你的源程序沒有語法錯誤,至于源程序中存在著的其它錯誤,必須通過調(diào)試才能發(fā)現(xiàn)并解決

Keil 的調(diào)試命令、在線匯編與斷點設(shè)置

上一講中我們學(xué)習(xí)了如何建立工程、匯編、連接工程,并獲得目標代碼,但是做到這一步僅僅代表你的源程序沒有語法錯誤,至于源程序中存在著的其它錯誤,必須通過調(diào)試才能發(fā)現(xiàn)并解決,事實上,除了極簡單的程序以外,絕大部份的程序都要通過反復(fù)調(diào)試才能得到正確的結(jié)果,因此,調(diào)試是軟件開發(fā)中重要的一個環(huán)節(jié),這一講將介紹常用的調(diào)試命令、利用在線匯編、各種設(shè)置斷點進行程序調(diào)試的方法,并通過實例介紹這些方法的使用。

一、常用調(diào)試命令

在對工程成功地進行匯編、連接以后,按 Ctrl+F5 或者使用菜單 Debug->Start/Stop Debug Session 即可進入調(diào)試狀態(tài),Keil 內(nèi)建了一個仿真 CPU 用來模擬執(zhí)行程序,該仿真 CPU 功能強大,可以在沒有硬件和仿真機的情況下進行程序的調(diào)試,下面將要學(xué)的就是該模擬調(diào)試功能。不過在學(xué)習(xí)之前必須明確,模擬畢竟只是模擬,與真實的硬件執(zhí)行程序肯定還是有區(qū)別的,其中最明顯的就是時序,軟件模擬是不可能和真實的硬件具有相同的時序的,具體的表現(xiàn)就是程序執(zhí)行的速度和各人使用的計算機有關(guān),計算機性能越好,運行速度越快。

進入調(diào)試狀態(tài)后,界面與編緝狀態(tài)相比有明顯的變化,Debug 菜單項中原來不能用的命令現(xiàn)在已可以使用了,工具欄會多出一個用于運行和調(diào)試的工具條,如圖 1 所示,Debug 菜單上的大部份命令可以在此找到對應(yīng)的快捷按鈕,從左到右依次是復(fù)位、運行、暫停、單步、過程單步、執(zhí)行完當(dāng)前子程序、運行到當(dāng)前行、下一狀態(tài)、打開跟蹤、觀察跟蹤、反匯編窗口、觀察窗口、代碼作用范圍分析、1#串行窗口、內(nèi)存窗口、性能分析、工具按鈕等命令。

圖 1 調(diào)試工具條 學(xué)習(xí)程序調(diào)試,必須明確兩個重要的概念,即單步執(zhí)行與全速運行。全速執(zhí)行是指一行程序執(zhí)行完以后緊接著執(zhí)行下一行程序,中間不停止,這樣程序執(zhí)行的速度很快,并可以看到該段程序執(zhí)行的總體效果,即最終結(jié)果正確還是錯誤,但如果程序有錯,則難以確認錯誤出現(xiàn)在哪些程 序行。單步執(zhí)行是每次執(zhí)行一行程序,執(zhí)行完該行程序以后即停止,等待命令執(zhí)行下一行程序,此時可以觀察該行程序 執(zhí)行完以后得到的結(jié)果,是否與我們寫該行程序所想要得到的結(jié)果相同,借此可以找到程序中問題所在。程序調(diào)試中, 這兩種運行方式都要用到。

使用菜單 STEP 或相應(yīng)的命令按鈕或使用快捷鍵 F11 可 以單步執(zhí)行程序,使用菜單 STEP OVER 或功能鍵 F10 可以以過程單步形式執(zhí)行命令,所謂過程單步,是指將匯編語言 中的子程序或高級語言中的函數(shù)作為一個語句來全速執(zhí)行。

圖 2 調(diào)試窗口

按下 F11 鍵,可以看到源程序窗口的左邊出現(xiàn)了一個黃色調(diào)試箭頭,指向源程序的第一行,如圖 2 所示。每按一次 F11,即執(zhí)行該箭頭所指程序行,然后箭頭指向下一行,當(dāng)箭頭 指向 LCALL DELAY 行時,再次按下 F11,會發(fā)現(xiàn),箭頭指向了延時子程序 DELAY 的第 一行。不斷按 F11 鍵,即可逐步執(zhí)行延時子程序。

通過單步執(zhí)行程序,可以找出一些問題的所在,但是僅依靠單步執(zhí)行來查錯有時是困難的,或雖能查出錯誤但效率很低,為此必須輔之以其它的方法,如本例中的延時程序是通過將 D2: DJNZ R6,D2 這一行程序執(zhí)行六萬多次來達到延時的目的,如果用按 F11 六萬多次的方法來執(zhí)行完該程序行,顯然不合適,為此,可以采取以下一些方法,第一,用鼠標在 子程序的最后一行( ret)點一下,把光標定位于該行,然后用菜單 Debug->Run to Cursor line(執(zhí)行到光標所在行),即可全速執(zhí)行完黃色箭頭與光標之間的程序行。第二,在進入該子程序后,使用菜單 Debug->Step Out of Current Function(單步執(zhí)行到該函數(shù)外),使用該命令后,即全速執(zhí)行完調(diào)試光標所在的子程序或子函數(shù)并指向主程序中的下一行程序(這里是 JMP LOOP 行)。第三種方法,在開始調(diào)試的,按 F10 而非 F11,程序也將單步執(zhí)行,不同 的是,執(zhí)行到 lcall delay 行時,按下 F10 鍵,調(diào)試光標不進入子程序的內(nèi)部,而是全速 執(zhí)行完該子程序,然后直接指向下一行“JMP LOOP”。靈活應(yīng)用這幾種方法,可以大大提高查錯的效率。

二、在線匯編

圖 3 在線匯編窗口 在進入 Keil 的調(diào)試環(huán)境以后,如果發(fā)現(xiàn)程序有錯,可以直接對源程序進行修改,但是要使修改后的代碼起作用,必須先退出調(diào)試環(huán)境,重新進行編譯、連接后再次進入調(diào)試,如果只是需要對某些程序行進行測試,或僅需對源程序進行臨時的修改,這樣的過程未免有些 麻煩,為此 Keil 軟件提供了在線匯編的能力,將光標定位于需要修改的程序行上,用菜單 Debug->Inline Assambly… 即可出現(xiàn)如圖3 的對話框,在 Enter New 后面的編緝框內(nèi)直接輸入需更改的程序語句,輸入完后鍵入回車將自動指向下 一條語句,可以繼續(xù)修改,如果不再需要修改,可以點擊右上角的關(guān)閉按鈕關(guān)閉窗口。

三、斷點設(shè)置

程序調(diào)試時,一些程序行必須滿足一定的條件才能被執(zhí)行到(如程序中某變量達到一定的值、按鍵被按下、串口接收到數(shù)據(jù)、有中斷產(chǎn)生等),這些條件往往是異步發(fā)生或難以預(yù)先設(shè)定的,這類問題使用單步執(zhí)行的方法是很難調(diào)試的,這時就要使用到程序調(diào)試中的另一種非常重要的方法——斷點設(shè)置。斷點設(shè)置的方法有多種,常用的是在某一程序行設(shè)置斷點,設(shè)置好斷點后可以全速運行程序,一旦執(zhí)行到該程序行即停止,可在此觀察有關(guān)變量值,以確定問題所在。在程序行設(shè)置/移除斷點的方法是將光標定位于需要設(shè)置斷點的程序行,使 用菜單 Debug->Insert/Remove BreakPoint 設(shè)置或移除斷點(也可以用鼠標在該行雙擊實現(xiàn)同 樣的功能);Debug->Enable/D isable Breakpoint 是開啟或暫停光標所在行的斷點功能; Debug->Disable All Breakpoint 暫停所有斷點;Debug->Kill All BreakPoint 清除所有的斷點設(shè) 置。這些功能也可以用工具條上的快捷按鈕進行設(shè)置。

除了在某程序行設(shè)置斷點這一基本方法以外,Keil 軟件還提供了多種設(shè)置斷點的方法,按 Debug->Breakpoints… 即出現(xiàn)一個對話框,該對話框用于對斷點進行詳細的設(shè)置,如圖 4所示。

圖 4 中 Expression 后的編緝框內(nèi)用于輸入表達式,該表達式用于確定程序停止運行的條 件,這里表達式的定義功能非常強大,涉及到 Keil 內(nèi)置的一套調(diào)試語法,這里不作詳細說 明,僅舉若干實例,希望讀者可以舉一反三。

1) 在 Experssion 中鍵入 a==0xf7,再點擊 Define 即定義了一個斷點, 注意,a 后有兩個等號,意即相等。該表達式的含義是:如果 a 的值到達 0xf7 則停止程序運行。除使用相等符號之外,還可以使用>,>=,<,<=,!=(不等于),&(兩值按位與),&&(兩值相與)等運算符號。

2) 在 Experssion 后中鍵入 Delay 再點擊 Define,其含義是如果執(zhí)行標號為 Delay 的行 則中斷。

圖 4 斷點設(shè)置對話框 3) 在 Experssion 后中鍵入 Delay,按 Count 后的微調(diào)按鈕,將值調(diào)到 3,其意義是 當(dāng)?shù)谌螆?zhí)行到 Delay 時才停止程序運 行。

4) 在 Experssion 后鍵入 Delay ,在Command 后鍵入 printf(“SubRoutine

‘Delay’has been Calledn”)主程序每次 調(diào)用 Delay 程序時并不停止運行,但會 在輸出窗口 Command 頁輸出一行字 符,即 SubRoutine ‘Delay’ has been Called。其中“n”的用途是回車換行, 使窗口輸出的字符整齊。

5)設(shè)置斷點前先在輸出窗口的 Command頁中鍵入 DEFINE int I,然后在斷點設(shè)置時同 4),但是 Command 后鍵入 printf(“SubRoutine ‘Delay’ has been Called %d timesn”,++I),則主程序每次調(diào)用 Delay 時將會在 Command 窗口輸出該字符及被調(diào) 用的次數(shù),如 SubRoutine ‘Delay’has been Called 10 times。

對于使用 C 源程序語言的調(diào)試,表達式中可以直接使用變量名,但必須要注意,設(shè)置時只能使用全局變量名和調(diào)試箭頭所指模塊中的局部變量名。

四、實例調(diào)試

為進行程序的調(diào)試,我們首先給源程序制造一個錯誤,將延時子程序的第三行“DJNZ R6,$”后的$改為 D1,然后重新編譯,由于程序中并無語法錯誤,所以編譯時不會有任何出 錯提示,但由于轉(zhuǎn)移目的地出錯,所以子程序?qū)⑾萑霟o限循環(huán)中。

進入調(diào)試狀態(tài)后,按 F10 以過程單步的形式執(zhí)行程序,當(dāng)執(zhí)行到 LCALL DELAY 行時,程序不能繼續(xù)往下執(zhí)行,同時發(fā)現(xiàn)調(diào)試工具條上的 Halt 按鈕變成了紅色,說明程序在此不 斷地執(zhí)行著,而我們預(yù)期這一行程序執(zhí)行完后將停止,這個結(jié)果與預(yù)期不同,可以看出所調(diào)用的子程序出了差錯。為查明出錯原因,按 Halt 按鈕使程序停止執(zhí)

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉