keil2c语言使用教程,Keil教程(2)
置時(shí)同 4),但是 Command 后鍵入 printf(“SubRoutine ?‘Delay’ has ?been ?Called ?%d times\n”,++I),則主程序每次調(diào)用 Delay 時(shí)將會(huì)在 Command 窗口輸出該字符及被調(diào) 用的次數(shù),如 SubRoutine ‘Delay’has been Called 10 times。
對(duì)于使用 C ?源程序語(yǔ)言的調(diào)試,表達(dá)式中可以直接使用變量名,但必須要注意,設(shè)置
時(shí)只能使用全局變量名和調(diào)試箭頭所指模塊中的局部變量名。
四、實(shí)例調(diào)試
為進(jìn)行程序的調(diào)試,我們首先給源程序制造一個(gè)錯(cuò)誤,將延時(shí)子程序的第三行“DJNZ R6,$”后的$改為 D1,然后重新編譯,由于程序中并無(wú)語(yǔ)法錯(cuò)誤,所以編譯時(shí)不會(huì)有任何出 錯(cuò)提示,但由于轉(zhuǎn)移目的地出錯(cuò),所以子程序?qū)⑾萑霟o(wú)限循環(huán)中。
進(jìn)入調(diào)試狀態(tài)后,按 F10 以過程單步的形式執(zhí)行程序,當(dāng)執(zhí)行到 LCALL DELAY 行時(shí),
程序不能繼續(xù)往下執(zhí)行,同時(shí)發(fā)現(xiàn)調(diào)試工具條上的 Halt ?按鈕變成了紅色,說(shuō)明程序在此不 斷地執(zhí)行著,而我們預(yù)期這一行程序執(zhí)行完后將停止,這個(gè)結(jié)果與預(yù)期不同,可以看出所調(diào) 用的子程序出了差錯(cuò)。為查明出錯(cuò)原因,按 Halt 按鈕使程序停止執(zhí)行,然后按 RST 按鈕使 程序復(fù)位,再次按下 F10 單步執(zhí)行,但在執(zhí)行到 LCALL ?DELAY 行時(shí),改按 F11 鍵跟蹤到
子程序內(nèi)部(如果按下 F11 鍵沒有反應(yīng),請(qǐng)?jiān)谠闯绦虼翱谥杏檬髽?biāo)點(diǎn)一下),單步執(zhí)行程序,
可以發(fā)現(xiàn)在執(zhí)行到“DJNZ??? R6,D1”行時(shí),程序不斷地從這一行轉(zhuǎn)移到上一行,同時(shí)觀察 左側(cè)的寄存器的值,會(huì)發(fā)現(xiàn) R6 的值始終在 FFH 和 FEH 之間變化,不會(huì)減小,而我們的預(yù) 期是 R6 的值不斷減小,減到 0 后往下執(zhí)行,因此這個(gè)結(jié)果與預(yù)期不符,通過這樣的觀察, 不難發(fā)現(xiàn)問題是因?yàn)闃?biāo)號(hào)寫錯(cuò)而產(chǎn)生的,發(fā)現(xiàn)問題即可以修改,為了驗(yàn)證即將進(jìn)行的修改是
否正確,可以先使用在線匯編功能測(cè)試一下。把光標(biāo)定位于程序行
“DJNZ???????????????????????????? R6,D1”,打開
在線匯編的對(duì)話框,將程序改為“DJNZ ?R7,0EH”,即轉(zhuǎn)回本條指令所在行繼續(xù)執(zhí)行,其中
0EH 是本條指令在程序存儲(chǔ)器中的位置,這個(gè)值可以通過在線匯編窗口看到,如圖 3 所示。 然后關(guān)閉窗口,再進(jìn)行調(diào)試,發(fā)現(xiàn)程序能夠正確地執(zhí)行了,這說(shuō)明修改是正確的。注意,這 時(shí)候的源程序并沒有修改,此時(shí)應(yīng)該退出調(diào)試程序,將源程序更改過來(lái),并重新編譯連接,
以獲得正確的目標(biāo)代碼。
總結(jié)
以上是生活随笔為你收集整理的keil2c语言使用教程,Keil教程(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017c 语言程序设计,C语言程序设计
- 下一篇: android代码 根据黑名单拦截短信,