0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式程序基于源代碼仿真調(diào)試

CHANBAEK ? 來源:郎哥編程課堂 ? 作者:郎宏林 ? 2023-11-01 09:24 ? 次閱讀

前面一課設(shè)計了51單片機最小系統(tǒng)電路,使用51單片機的I/O口控制發(fā)光二極管的狀態(tài),并裝載運行了使用keil編寫的嵌入式程序。本次實驗應(yīng)用proteus結(jié)合keil對嵌入式C程序進行源代碼級調(diào)試。

關(guān)于上次實驗遺留的問題

在上次實驗中,我們遺留了一個問題沒有解決。觀察上次實驗結(jié)果,單片機P0口的所有位顏色為灰色方塊,表示該端口的電壓為不確定狀態(tài)。

為什么P0口所有位的電壓為不確定狀態(tài)呢?因為P0同P1、P2、P3的I/O口電路不同,P1、P2、P3屬于帶上拉電阻(將I/O不確定的電位鉗位在高電平,同時起限流作用)型的I/O口,當單片機加電后I/O被鉗位在高電平,P0不帶上拉電阻,因此I/O的電位不確定。

若需要把P0口鉗位在高電平,只需要將P0口外接一個上拉電阻即可,上拉電阻的阻值一般設(shè)置為4.7K,也可以根據(jù)負載大小選擇合適的阻值。

圖片

實驗?zāi)康?/strong>

在開發(fā)嵌入式程序過程中,源代碼級的仿真調(diào)試可以幫助開發(fā)者快速定位問題代碼,糾正程序錯誤,極大提高開發(fā)效率。本次實驗在前面實驗成果的基礎(chǔ)上,將proteus和keil結(jié)合在一起,在proteus仿真調(diào)試嵌入式程序的過程中,能夠?qū)?zhí)行點定位到程序源代碼行,在源代碼級別跟蹤執(zhí)行程序。

實驗步驟

實驗步驟如下:①輸出可以進行源代碼調(diào)試的OMF文件;②配置基于源代碼仿真調(diào)試環(huán)境;③執(zhí)行調(diào)試,單步跟蹤代碼,查看和驗證程序執(zhí)行結(jié)果。

輸出可以進行源代碼調(diào)試的OMF文件

啟動keil開發(fā)工具,打開前面課程建立的項目文件,修改項目內(nèi)的C源文件代碼。

#include
sbit led1 = P1^0;
void main()
{
       led1 = 0;
       led1 = 1;
       led1 = 0;
       led1 = 1;
}

main()函數(shù)修改為四條語句,對P1端口的第0位led1進行賦0或賦1操作。第1條語句將led1端口賦值為低電平,此時發(fā)光二極管被點亮,第2條語句將led1端口賦值為高電平,此時發(fā)光二極管不再處于被點亮狀態(tài)。第3條和第4條語句分別重復了第1條和第2條語句。

代碼跟蹤調(diào)試時,從第1條語句開始跟蹤,單步執(zhí)行到第4條語句,觀察發(fā)光二極管的狀態(tài)和led1端口的狀態(tài)。

proteus源代碼仿真調(diào)試需要Keil編譯后輸出omf文件,在Keil工作窗口,展開【Project】菜單,選擇“Options for Targets”命令,在彈出的對話框中,選擇“Output”標簽頁,確定在“Name of Executable”輸入域輸入了omf文件名稱。

圖片

完成配置后重新編譯,keil會把omf文件輸出到項目的Objects目錄下。

圖片

配置基于源代碼仿真調(diào)試環(huán)境

要進行源代碼級仿真調(diào)試,還需要配置調(diào)試環(huán)境,不然proteus會找不到程序的源代碼。配置方法是將C源代碼文件、OMF文件、電路模型文件放置在同一個目錄??梢詫U展名為“DSN”電路模型文件復制到OMF文件所在的目錄,同時將C源代碼文件也復制到OMF文件所在目錄。也可以將C源代碼文件、OMF文件、電路模型文件放置到一個專門用于調(diào)試的目錄。

圖片

調(diào)試環(huán)境配置完成后,使用proteus打開電路模型文件,設(shè)置單片機的裝載程序為omf文件。

圖片

執(zhí)行調(diào)試

啟動proteus,打開待調(diào)試的電路模型文件,展開【Debug】菜單,選擇“Start/Restart Debugging”命令或按下Ctrl+F12快捷鍵啟動調(diào)試。

proteus會初始化單片機,并執(zhí)行單片機內(nèi)的嵌入式程序,程序在main()函數(shù)的第1條語句之前停止執(zhí)行,等待開發(fā)者的下一步調(diào)試操作。默認情況下,proteus會同時打開源代碼窗口,顯示嵌入式程序的源代碼和執(zhí)行狀態(tài)。

圖片

“8051 CPU Source Code-U1”為源代碼調(diào)試窗口,在源代碼調(diào)試窗口可以執(zhí)行“Step Over Source line(單步跳過)”、“Step Into Source line(單步執(zhí)行)”、“Step Out From Source line(單步跳出)”,其調(diào)試過程和Keil單步調(diào)試完全相同。

若源代碼調(diào)試窗口沒有彈出,可展開【Debug】菜單,在【Debug】菜單下面選擇彈出源代碼調(diào)試窗口的命令。

圖片

從圖中列出的菜單命令可以看出,proteus還提供了查看單片機寄存器狀態(tài)、SFR內(nèi)存數(shù)據(jù)等窗口,開發(fā)者通過這些窗口可以隨時查看單片機的內(nèi)部狀態(tài)。
例如選擇“8051 CPU Registers-U1”命令,proteus會彈出單片機寄存器狀態(tài)窗口(見下圖)。

圖片

通過寄存器窗口可以查看單片機內(nèi)每個寄存器當前存儲的值。其中“PC”寄存器為程序計數(shù)器,該寄存器存儲了當前準備要執(zhí)行的指令地址,指令地址為十六進制000F,指令內(nèi)容為“CLR P1.0”(對P1口的第0位清零)。再仔細觀察窗口內(nèi)容,名稱為“P0”、“P1”、“P2”、“P3”寄存器實際上分別對應(yīng)了單片機P0、P1、P2、P3四個I/O口每位的狀態(tài),當程序修改I/O口的狀態(tài)后,這些寄存器的值也會發(fā)生相應(yīng)變化。

調(diào)試步驟:

單步跳過第1條語句,P1口第0位被賦值為低電平,發(fā)光二級管點亮。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“SETB P1.0”(對P1口的第0位設(shè)置為1),P1寄存器的值由原來的FF變換為FE。

圖片

單步跳過第2條語句,P1口第0位被賦值為高電平,發(fā)光二級管熄滅。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“CLR P1.0”(對P1口的第0位清零),P1寄存器的值由原來的FE變換為FF。

圖片

請同學們自行完成第3、4條語句的調(diào)試,并觀察發(fā)光二極管和寄存器的狀態(tài)。

實驗小結(jié)

通過這次實驗,掌握了嵌入式程序源代碼級的調(diào)試過程,由keil編寫嵌入式程序,使用proteus執(zhí)行嵌入式程序的源代碼級調(diào)試。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 51單片機
    +關(guān)注

    關(guān)注

    274

    文章

    5705

    瀏覽量

    123903
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3793

    瀏覽量

    81215
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2946

    瀏覽量

    66831
  • 最小系統(tǒng)
    +關(guān)注

    關(guān)注

    9

    文章

    252

    瀏覽量

    29122
  • 仿真調(diào)試
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7529
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式硬件調(diào)試和軟件調(diào)試

    相對于軟件調(diào)試而言,使用硬件調(diào)試器可以獲得更強大的調(diào)試功能和更優(yōu)秀的調(diào)試性能。硬件調(diào)試器的基本原理是通過
    發(fā)表于 03-10 10:44

    嵌入式Linux下 qt安裝源代碼

    嵌入式Linux下 qt安裝源代碼
    發(fā)表于 09-20 11:33

    嵌入式SQL程序是由什么組成的

    概念一個嵌入式SQL程序由一種普通編程語言編寫的代碼(這里是C)和位于特殊標記小節(jié)中的SQL命令混合組成。要構(gòu)建該程序源代碼(.pgc)
    發(fā)表于 12-15 07:26

    如何調(diào)試嵌入式代碼?

    我們在進行嵌入式系統(tǒng)開發(fā)調(diào)試時,受限于嵌入式芯片資源和性能,一般采用遠程調(diào)試。在調(diào)試嵌入式底層
    發(fā)表于 12-17 06:32

    嵌入式Linux開發(fā)基礎(chǔ)知識

     嵌入式系統(tǒng)開發(fā)模式嵌入式Linux系統(tǒng)的構(gòu)成主要任務(wù)與流程利用Skyeye仿真開發(fā)板開發(fā)板使用嵌入式應(yīng)用程序開發(fā)與
    發(fā)表于 09-10 11:07 ?39次下載
    <b class='flag-5'>嵌入式</b>Linux開發(fā)基礎(chǔ)知識

    實時仿真嵌入式系統(tǒng)

    實時仿真嵌入式系統(tǒng):Matlab 和VxWorks 是當今工業(yè)流行的仿真軟件和嵌入式操作系統(tǒng), 二者之間的結(jié)合極大的方便了程序
    發(fā)表于 09-13 10:44 ?21次下載

    基于Valgrind的嵌入式應(yīng)用程序調(diào)試技術(shù)

    本文介紹了一種利用調(diào)試軟件Valgrind 進行嵌入式應(yīng)用程序錯誤查找的技術(shù),利用它可以高效、自動地查找出程序中的多種錯誤。首先介紹了嵌入式
    發(fā)表于 12-18 15:36 ?17次下載

    基于Proteus的嵌入式應(yīng)用系統(tǒng)仿真中的源碼調(diào)試

    基于Proteus的嵌入式應(yīng)用系統(tǒng)仿真中的源碼調(diào)試 0 引 言    Proteus是功能最強的嵌入式系統(tǒng)(單片機、ARM等)的設(shè)計與
    發(fā)表于 12-22 17:49 ?2133次閱讀
    基于Proteus的<b class='flag-5'>嵌入式</b>應(yīng)用系統(tǒng)<b class='flag-5'>仿真</b>中的源碼<b class='flag-5'>調(diào)試</b>

    Monitor C語言源代碼調(diào)試器設(shè)計

    為解決嵌入式系統(tǒng)不支持本地調(diào)試且開發(fā)周期較長的問題,使用了一種通過PC機去控制嵌入式系統(tǒng)的遠程調(diào)試方案。該方案針對32位嵌入式設(shè)備,設(shè)計并實
    發(fā)表于 12-01 15:52 ?56次下載
    Monitor C語言<b class='flag-5'>源代碼</b><b class='flag-5'>調(diào)試</b>器設(shè)計

    嵌入式開發(fā)板的USB驅(qū)動程序源代碼資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是關(guān)于嵌入式開發(fā)板的USB驅(qū)動程序源代碼資料免費下載。
    發(fā)表于 03-25 08:00 ?1次下載
    <b class='flag-5'>嵌入式</b>開發(fā)板的USB驅(qū)動<b class='flag-5'>程序</b><b class='flag-5'>源代碼</b>資料免費下載

    嵌入式Linux應(yīng)用程序開發(fā)詳解的源代碼合集免費下載

    本文檔的主要內(nèi)容詳細介紹的是嵌入式Linux應(yīng)用程序開發(fā)詳解的源代碼合集免費下載。
    發(fā)表于 03-21 08:00 ?24次下載
    <b class='flag-5'>嵌入式</b>Linux應(yīng)用<b class='flag-5'>程序</b>開發(fā)詳解的<b class='flag-5'>源代碼</b>合集免費下載

    關(guān)于嵌入式代碼的致命漏洞

    隨著互聯(lián)網(wǎng)的發(fā)展,嵌入式設(shè)備正分布在一個充滿可以被攻擊者利用的源代碼級安全漏洞的環(huán)境中。因此,嵌入式軟件開發(fā)人員應(yīng)該了解不同類型的安全漏洞——特別是代碼注入。 術(shù)語“
    的頭像 發(fā)表于 01-06 15:13 ?1819次閱讀

    嵌入式代碼的致命安全漏洞

    隨著互聯(lián)網(wǎng)的發(fā)展,嵌入式設(shè)備正分布在一個充滿可以被攻擊者利用的源代碼級安全漏洞的環(huán)境中。因此,嵌入式軟件開發(fā)人員應(yīng)該了解不同類型的安全漏洞——特別是代碼注入。 術(shù)語“
    的頭像 發(fā)表于 01-15 15:07 ?2225次閱讀

    用于調(diào)試嵌入式系統(tǒng)軟件的硬件仿真

      SoC 是一個成熟的嵌入式系統(tǒng),需要硬件仿真來驗證它是否正常工作。借助硬件仿真,開發(fā)團隊可以更有策略地規(guī)劃并實施基于多個抽象級別的調(diào)試方法。
    的頭像 發(fā)表于 06-19 15:30 ?1797次閱讀

    企業(yè)針對嵌入式開發(fā)源代碼及電路圖紙如何防泄密?

    文件的泄露問題,我們要知道,如果是嵌入式開發(fā),就必須要通過電腦的硬件接口進行設(shè)備代碼的寫入及后期的調(diào)試,如果采用隔離的或封堵物理端口的方式來進行源代碼文件防泄密,就會有很多局限性,并且
    的頭像 發(fā)表于 07-28 20:00 ?756次閱讀
    企業(yè)針對<b class='flag-5'>嵌入式開發(fā)源代碼</b>及電路圖紙如何防泄密?