嵌入式工程师必备技能--软件仿真

文章介绍了如何使用MDK的软件仿真功能进行STM32程序的调试,通过设置芯片型号、晶振频率和操作类型,进行软件仿真以检查程序问题,避免频繁刷机。以战舰版跑马灯实验为例,详细阐述了设置过程,包括使用Disassembly窗口、Register窗口、CallStack+Locals窗口等,以及Debug工具条的各种功能,如执行到断点、复位、单步调试等,最后通过逻辑分析窗口验证代码的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下文章来源于:  正点原子

前言

       MDK的一个强大的功能就是提供软件仿真(注意:STM32F4不支持软件仿真),通过软件仿真,我们可以发现很多将要出现的问题,避免了下载到STM32里面来查这些错误,这样最大的好处是能很方便的检查程序存在的问题,因为在MDK的仿真下面,你可以查看很多硬件相关的寄存器,通过观察这些寄存器,你可以知道代码是不是真正有效。另外一个优点是不必频繁的刷机,从而延长了STM32的FLASH寿命(STM32的FLASH寿命≥1W次)。当然,软件仿真不是万能的,很多问题还是要到在线调试才能发现。

         这里我们以战舰版跑马灯实验为例子。废话不多说了,接下来我们开始进行软件仿真。


01 第一步

       主要检查芯片型号和晶振频率,其他的一般默认即可,具体操作如下:

(特别提醒:Xtal参数只用于软件仿真的,对于硬件仿真或者直接把程序下载到板子里是没有影响的。而且MDK5.35开始禁用外部晶振设置选项,所以是灰色的,显示undefined)

02 第二步

        选择操作类型,以及设置DialogDLL等参数,具体操作如下:  

 选择:UseSimulator,即使用软件仿真。
        选择:Runto main(),即跳过汇编代码,直接跳转到main函数开始仿真。

        设置下方的DialogDLL分别为:DARMSTM.DLL和TARMSTM.DLL,Parameter均为:-pSTM32F103ZE,用于支持STM32F103ZE的软硬件仿真(即可以通过Peripherals选择对应的外设的对话框观察仿真结果)。

03 第三步

        点击开始/停止仿真按键,开始仿真,出现如下界面

       Register即寄存器窗口,这里一般用于查看程序运行时间即Sec处,以及一些比较高级的bug查找,主要就是对CortexM3内核寄存器R0~R14数据进行分析是否异常。

       Disassembly即反汇编窗口,C语言代码与汇编代码比对显示,方便从汇编级别进行查看程序运行状态,也是属于比较高级的bug查找。

       代码窗口,就是我们的工程代码了。左侧有黄色和绿色两个三角形,黄色三角形代表将要执行的代码,绿色的三角形表示当前光标所在代码,一般情况下,两个三角形是同步的,只要你点击其他位置查看代码时,绿色三角形就会移位。

        CallStack + Locals即调用关系和局部变量窗口,通过该窗口可以查看函数调用关系以及函数的局部变量,仿真调试时,很有用。

        除了这些窗口,实际上还有一些其他窗口,可以根据实际需求去选择使用。
        上图还有一个很重要的工具条即Debug工具条。   

          



       复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
       执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
       停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。  
       执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
       执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
       执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
       执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
       汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
       堆栈局部变量窗口:通过该按钮,显示CallStack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。
       观察窗口:MDK5提供2个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。
       内存查看窗口:MDK5提供4个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口。
       串口打印窗口:MDK5提供4个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
       逻辑分析窗口:该图标下面有3个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(LogicAnalyzer),点击即可调出该窗口,通过SETUP按钮新建一些IO口,就可以观察这些IO口的电平变化情况,以多种形式显示出来,比较直观。
       系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。

       以上是比较常用的,当然不是每次都用得着,具体看你程序调试时候的需求。

 04 第四步

       点击LogicAnalyzer并点击Setup新建两个信号PORTB.5和PORTE.5,具体操作如下:

          



          



       两个信号的DisplayType都选择bit,然后点击Close关闭对话框,可以看到逻辑分析窗口出现两个信号,如下图所示。   
 

          




05 第五步

       点击执行到断点处即图片。运行一段时间之后,按图片按键,暂停仿真回到逻辑分析窗口,得到的波形如下图所示:

          


         这里注意:Gird要调节到0.2s左右比较合适,可以通过Zoom里面的In按钮来放大波形,通过Out按键来缩小波形,或者按All显示全部波形。从上图也可以看到PORTB.5和PORTE.5交替输出,从这里就可以判断代码的准确性了。

 

 

说明1:<br>在使用基于MinGW嵌入式软件仿真调试平台之前,需要首先安装绿色的MinGW C/C++编译环境,参考笔者发布的文档《MinGW的使用指南》。<br><br>下载地址:<br>http://www.51emb.com/forum_view.asp?forum_id=2&view_id=2468<br>or http://bbs.cnttr.com/archiver/?tid-113142.html<br><br>备注A:学习完该文档后,您将有基于makefile文件编译C/C++代码嵌入式软件开发基本概念。<br>备注B:如果MinGW的下载过慢或者不想下载,可以联系笔者提供MinGW的刻录光盘(非免费),同时包括本文档相关的测试代码以及额外的嵌入式软件开发相关笔者整理的珍贵资料。<br><br>说明2:<br>基于MinGW嵌入式软件仿真调试平台是笔者工作中做嵌入式软件平台对Linux、windows、VxWorks、Cygwin 进行Porting时练手完成的一个业余结果。从笔者这几年从事嵌入式软件开发的经验和思考看,其对嵌入式软件入门者有一定的帮助;对高手者咱是班门弄斧,建议您直接从硬盘删除它。<br><br>成熟的企业一般均有自己的仿真平台,比如Huawei某些产品基于VC++仿真,另一些公司建立了命令行模式下vxWorks仿真平台,还有有一些小公司直接基于VxWork的集成开发环境中vxSim仿真,更多的有商业化的Linux嵌入式软件仿真平台。如果您手头有VxWorks的安装软件,也可以基于vxsim进行仿真。这些基于企业级商业化仿真平台对成熟工程师来说不是问题,对于入门者来说有一定难度,也不一定有这些商用的软件。如果您没有上述条件,想进入嵌入式软件开发行业,可以试试笔者的MinGW嵌入式软件仿真调试平台,为您开启嵌入式软件开发中三个最重要的概念:任务(Task),消息队列(MsgQ),信号量(Semaphore)。(笔者工作中在写嵌入式模块,如芯片驱动模块、协议实现模块、普通应用层模块总结出的典型三要素)<br><br>本软件包中提供的仿真平台库使用期限至2008年。如果您认为对您有帮助,2008年之后仍希望使用,很抱歉您不得不向笔者提供50元的费用注册得到至2010的正式版本。笔者亦是一草根打工阶层,该平台也花费了笔者一定的劳动时间。<br><br>说明3:<br>笔者入行嵌入式软件开发这几年来,阅读过还算大量的嵌入式C/C++源代码,除一些专业的以卖源代码为生公司其代码风格写的还算好之外(如(http://www.dataconnection.com/) Data Connection,该公司主要卖路由、NGN等通信软件源代码和服务);大部分的嵌入式软件公司源代码风格有些糟糕;开源软件的代码更是如此,至少在笔者开来,对Linux内核源代码的风格不是很苟同。<br><br>说明4:<br>本软件包中提供的仿真平台库中有适量的源代码,采用sourceInsight 或者 UltraEdit打开时,把字体配置为Courier New 格式,才可以看到正确的源代码排版和风格。<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newzhpfree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值