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单片机
    +关注

    关注

    269

    文章

    5649

    浏览量

    120700
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 源代码
    +关注

    关注

    94

    文章

    2927

    浏览量

    66063
  • 最小系统
    +关注

    关注

    9

    文章

    246

    浏览量

    28856
  • 仿真调试
    +关注

    关注

    0

    文章

    9

    浏览量

    7465
收藏 人收藏

    评论

    相关推荐

    嵌入式产品的开发周期

    嵌入式产品的开发周期:典型的嵌入式微控制器开发项目的第一个阶段是用C编译器从源程序生成目标代码,生成的目标代码将包括物理地址和一些
    发表于 08-11 14:18

    什么是嵌入式Linux?

    嵌入式系统的关键是需要有一套完善的开发和调试工具。传统的嵌入式开发调试工具是在线仿真器(In-Circuit Emulator,ICE),它
    发表于 01-23 11:59

    ARM嵌入式应用开发技术白金手册 含源代码.rar

    ARM嵌入式应用开发技术白金手册 含源代码.rarARM嵌入式应用开发技术白金手册 含源代码.rar
    发表于 06-28 08:41

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

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

    嵌入式Linux下 qt安装源代码

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

    嵌入式系统交叉调试原理和方法

    适用于嵌入式系统底层驱动调试、裸系统调试和单应用调试。 基于调试代理的远程调试方法是在目标机上运
    发表于 12-18 10:55

    嵌入式Linux下的LCD驱动程序怎么编写?

    随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在L
    发表于 11-11 07:33

    【知识科普】嵌入式软件开发是什么?

    的两种开发模式非嵌入式的开发A类机编写源代码,编译得到可执行程序,发布给A类机运行。嵌入式开发A类机编写源代码,编译得到可执行
    发表于 06-17 11:09

    嵌入式系统固件的开发与调试相关资料分享

    (time management and scheduling)• ❖ 用于嵌入式系统的调试工具(debugging tools)1.质量属性分为操作质量属性和非操作质量属性嵌入式硬件嵌入式
    发表于 12-14 07:26

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

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

    如何调试嵌入式代码

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

    如何对嵌入式应用程序进行调试

    如何对嵌入式应用程序进行调试
    发表于 12-24 07:36

    嵌入式学习笔记:Linux学习笔记整理

    ,由于嵌入式系统千差万别,往往需要针对具体的应用进行修改和优化,因而获得源代码就变得至关重要了。Linux的软件资源十分丰富,每一种通用程序在Linux上几乎都可以找到,并且数量还在不断增加。在
    发表于 07-04 16:21

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

    为解决嵌入式系统不支持本地调试且开发周期较长的问题,使用了一种通过PC机去控制嵌入式系统的远程调试方案。该方案针对32位嵌入式设备,设计并实
    发表于 12-01 15:52 56次下载
    Monitor C语言<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>合集免费下载