0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式程序基于源代码仿真调试

CHANBAEK 来源:郎哥编程课堂 作者:郎宏林 2023-11-01 09:24 次阅读

前面一课设计了51单片机最小系统电路,使用51单片机的I/O口控制发光二极管的状态,并装载运行了使用keil编写的嵌入式程序。本次实验应用proteus结合keil对嵌入式C程序进行源代码级调试。

关于上次实验遗留的问题

在上次实验中,我们遗留了一个问题没有解决。观察上次实验结果,单片机P0口的所有位颜色为灰色方块,表示该端口的电压为不确定状态。

为什么P0口所有位的电压为不确定状态呢?因为P0同P1、P2、P3的I/O口电路不同,P1、P2、P3属于带上拉电阻(将I/O不确定的电位钳位在高电平,同时起限流作用)型的I/O口,当单片机加电后I/O被钳位在高电平,P0不带上拉电阻,因此I/O的电位不确定。

若需要把P0口钳位在高电平,只需要将P0口外接一个上拉电阻即可,上拉电阻的阻值一般设置为4.7K,也可以根据负载大小选择合适的阻值。

图片

实验目的

在开发嵌入式程序过程中,源代码级的仿真调试可以帮助开发者快速定位问题代码,纠正程序错误,极大提高开发效率。本次实验在前面实验成果的基础上,将proteus和keil结合在一起,在proteus仿真调试嵌入式程序的过程中,能够将执行点定位到程序源代码行,在源代码级别跟踪执行程序。

实验步骤

实验步骤如下:①输出可以进行源代码调试的OMF文件;②配置基于源代码仿真调试环境;③执行调试,单步跟踪代码,查看和验证程序执行结果。

输出可以进行源代码调试的OMF文件

启动keil开发工具,打开前面课程建立的项目文件,修改项目内的C源文件代码。

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

main()函数修改为四条语句,对P1端口的第0位led1进行赋0或赋1操作。第1条语句将led1端口赋值为低电平,此时发光二极管被点亮,第2条语句将led1端口赋值为高电平,此时发光二极管不再处于被点亮状态。第3条和第4条语句分别重复了第1条和第2条语句。

代码跟踪调试时,从第1条语句开始跟踪,单步执行到第4条语句,观察发光二极管的状态和led1端口的状态。

proteus源代码仿真调试需要Keil编译后输出omf文件,在Keil工作窗口,展开【Project】菜单,选择“Options for Targets”命令,在弹出的对话框中,选择“Output”标签页,确定在“Name of Executable”输入域输入了omf文件名称。

图片

完成配置后重新编译,keil会把omf文件输出到项目的Objects目录下。

图片

配置基于源代码仿真调试环境

要进行源代码级仿真调试,还需要配置调试环境,不然proteus会找不到程序的源代码。配置方法是将C源代码文件、OMF文件、电路模型文件放置在同一个目录。可以将扩展名为“DSN”电路模型文件复制到OMF文件所在的目录,同时将C源代码文件也复制到OMF文件所在目录。也可以将C源代码文件、OMF文件、电路模型文件放置到一个专门用于调试的目录。

图片

调试环境配置完成后,使用proteus打开电路模型文件,设置单片机的装载程序为omf文件。

图片

执行调试

启动proteus,打开待调试的电路模型文件,展开【Debug】菜单,选择“Start/Restart Debugging”命令或按下Ctrl+F12快捷键启动调试。

proteus会初始化单片机,并执行单片机内的嵌入式程序,程序在main()函数的第1条语句之前停止执行,等待开发者的下一步调试操作。默认情况下,proteus会同时打开源代码窗口,显示嵌入式程序的源代码和执行状态。

图片

“8051 CPU Source Code-U1”为源代码调试窗口,在源代码调试窗口可以执行“Step Over Source line(单步跳过)”、“Step Into Source line(单步执行)”、“Step Out From Source line(单步跳出)”,其调试过程和Keil单步调试完全相同。

若源代码调试窗口没有弹出,可展开【Debug】菜单,在【Debug】菜单下面选择弹出源代码调试窗口的命令。

图片

从图中列出的菜单命令可以看出,proteus还提供了查看单片机寄存器状态、SFR内存数据等窗口,开发者通过这些窗口可以随时查看单片机的内部状态。
例如选择“8051 CPU Registers-U1”命令,proteus会弹出单片机寄存器状态窗口(见下图)。

图片

通过寄存器窗口可以查看单片机内每个寄存器当前存储的值。其中“PC”寄存器为程序计数器,该寄存器存储了当前准备要执行的指令地址,指令地址为十六进制000F,指令内容为“CLR P1.0”(对P1口的第0位清零)。再仔细观察窗口内容,名称为“P0”、“P1”、“P2”、“P3”寄存器实际上分别对应了单片机P0、P1、P2、P3四个I/O口每位的状态,当程序修改I/O口的状态后,这些寄存器的值也会发生相应变化。

调试步骤:

单步跳过第1条语句,P1口第0位被赋值为低电平,发光二级管点亮。观察寄存器窗口,PC寄存器指向了下一条指令的地址,指令为“SETB P1.0”(对P1口的第0位设置为1),P1寄存器的值由原来的FF变换为FE。

图片

单步跳过第2条语句,P1口第0位被赋值为高电平,发光二级管熄灭。观察寄存器窗口,PC寄存器指向了下一条指令的地址,指令为“CLR P1.0”(对P1口的第0位清零),P1寄存器的值由原来的FE变换为FF。

图片

请同学们自行完成第3、4条语句的调试,并观察发光二极管和寄存器的状态。

实验小结

通过这次实验,掌握了嵌入式程序源代码级的调试过程,由keil编写嵌入式程序,使用proteus执行嵌入式程序的源代码级调试。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 51单片机
    +关注

    关注

    274

    文章

    5702

    浏览量

    123460
  • 程序
    +关注

    关注

    117

    文章

    3782

    浏览量

    80990
  • 源代码
    +关注

    关注

    96

    文章

    2945

    浏览量

    66725
  • 最小系统
    +关注

    关注

    9

    文章

    251

    浏览量

    29074
  • 仿真调试
    +关注

    关注

    0

    文章

    9

    浏览量

    7508
收藏 人收藏

    评论

    相关推荐

    嵌入式硬件调试和软件调试

    相对于软件调试而言,使用硬件调试器可以获得更强大的调试功能和更优秀的调试性能。硬件调试器的基本原理是通过
    发表于 03-10 10:44

    嵌入式Linux下 qt安装源代码

    嵌入式Linux下 qt安装源代码
    发表于 09-20 11:33

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

    概念一个嵌入式SQL程序由一种普通编程语言编写的代码(这里是C)和位于特殊标记小节中的SQL命令混合组成。要构建该程序源代码(.pgc)
    发表于 12-15 07:26

    如何调试嵌入式代码

    我们在进行嵌入式系统开发调试时,受限于嵌入式芯片资源和性能,一般采用远程调试。在调试嵌入式底层
    发表于 12-17 06:32

    嵌入式Linux开发基础知识

     嵌入式系统开发模式嵌入式Linux系统的构成主要任务与流程利用Skyeye仿真开发板开发板使用嵌入式应用程序开发与
    发表于 09-10 11:07 39次下载
    <b class='flag-5'>嵌入式</b>Linux开发基础知识

    实时仿真嵌入式系统

    实时仿真嵌入式系统:Matlab 和VxWorks 是当今工业流行的仿真软件和嵌入式操作系统, 二者之间的结合极大的方便了程序
    发表于 09-13 10:44 21次下载

    基于Valgrind的嵌入式应用程序调试技术

    本文介绍了一种利用调试软件Valgrind 进行嵌入式应用程序错误查找的技术,利用它可以高效、自动地查找出程序中的多种错误。首先介绍了嵌入式
    发表于 12-18 15:36 17次下载

    基于Proteus的嵌入式应用系统仿真中的源码调试

    基于Proteus的嵌入式应用系统仿真中的源码调试 0 引 言    Proteus是功能最强的嵌入式系统(单片机、ARM等)的设计与
    发表于 12-22 17:49 2117次阅读
    基于Proteus的<b class='flag-5'>嵌入式</b>应用系统<b class='flag-5'>仿真</b>中的源码<b class='flag-5'>调试</b>

    Monitor C语言源代码调试器设计

    为解决嵌入式系统不支持本地调试且开发周期较长的问题,使用了一种通过PC机去控制嵌入式系统的远程调试方案。该方案针对32位嵌入式设备,设计并实
    发表于 12-01 15:52 56次下载
    Monitor C语言<b class='flag-5'>源代码</b><b class='flag-5'>调试</b>器设计

    嵌入式开发板的USB驱动程序源代码资料免费下载

    本文档的主要内容详细介绍的是关于嵌入式开发板的USB驱动程序源代码资料免费下载。
    发表于 03-25 08:00 1次下载
    <b class='flag-5'>嵌入式</b>开发板的USB驱动<b class='flag-5'>程序</b><b class='flag-5'>源代码</b>资料免费下载

    嵌入式Linux应用程序开发详解的源代码合集免费下载

    本文档的主要内容详细介绍的是嵌入式Linux应用程序开发详解的源代码合集免费下载。
    发表于 03-21 08:00 24次下载
    <b class='flag-5'>嵌入式</b>Linux应用<b class='flag-5'>程序</b>开发详解的<b class='flag-5'>源代码</b>合集免费下载

    关于嵌入式代码的致命漏洞

    随着互联网的发展,嵌入式设备正分布在一个充满可以被攻击者利用的源代码级安全漏洞的环境中。因此,嵌入式软件开发人员应该了解不同类型的安全漏洞——特别是代码注入。 术语“
    的头像 发表于 01-06 15:13 1793次阅读

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

    随着互联网的发展,嵌入式设备正分布在一个充满可以被攻击者利用的源代码级安全漏洞的环境中。因此,嵌入式软件开发人员应该了解不同类型的安全漏洞——特别是代码注入。 术语“
    的头像 发表于 01-15 15:07 2193次阅读

    用于调试嵌入式系统软件的硬件仿真

      SoC 是一个成熟的嵌入式系统,需要硬件仿真来验证它是否正常工作。借助硬件仿真,开发团队可以更有策略地规划并实施基于多个抽象级别的调试方法。
    的头像 发表于 06-19 15:30 1759次阅读

    企业针对嵌入式开发源代码及电路图纸如何防泄密?

    文件的泄露问题,我们要知道,如果是嵌入式开发,就必须要通过电脑的硬件接口进行设备代码的写入及后期的调试,如果采用隔离的或封堵物理端口的方式来进行源代码文件防泄密,就会有很多局限性,并且
    的头像 发表于 07-28 20:00 721次阅读
    企业针对<b class='flag-5'>嵌入式开发源代码</b>及电路图纸如何防泄密?