关于单片机程序跑飞总结

最近复习单片机,复习到了看门狗,就把相关的程序跑飞和解决办法整理了一下,具体看下面:

网址:《51单片机应用开发从入门到精通》——2.13 软件陷阱实例-阿里云开发者社区

网址中提到的汇编语言(加了一些注释):

 

ORG 0000H
LJMP MAIN       ;程序跳转到主程序入口
ORG 0003H        ;ORG为伪指令,其定位作用
LJMP X0_INT     ;程序跳转到外部中断0中断服务程序入口
     NOP        ;冗余指令
     NOP
     LJMP ERR    ;陷阱

 

ERR:
   CLR EA    ;关闭中断                                (1)
   MOV DPTR,#ERR1  ;准备第一次返回地址                 (2)
   PUSH DPH    ;                                     (3)
   PUSH DPL    ;                                     (4)
   RETI     ;清除高级中断激活标志                      (5)
ERR1:
   CLR A    ;准备复位地址0000H                         (6)
   PUSH A    ;                                        (7)
   PUSH A    ;                                        (8)
   RETI     ;清除低级中断激活标志                       (9)

ERR中,关闭中断并将ERR1压入栈中,但为什么使用REIT指令呢,REIT是中断返回用的啊,这里需要理解下:中断结束,REIT指令执行返回命令,PC寄存器会指向栈顶位置(前面已经将ERR1压入栈中)。这里指回到ERR1处并清除中断标志位

ERR1中,将复位地址压入栈中,执行REIT指令,跳转到地址0000H处,并清除中断标志位。

问题又来了,为什么使用了两个REIT呢?文章里所说:“在最严重的情况下,程序跑飞时,单片机正处于两级中断嵌套的状态,此时需要通过两个RETI指令才能使单片机回到正常状态”。代码中使用了两条RETI指令,就是为了防止最坏的情况发生(所以代码的注释中才会有清除高级中断激活标志位和清除低级中断激活标志位之分)!

问题又又又又又来了,代码中只用了两个REIT,是为了防止两层中断嵌套,但如果是三层中断嵌套呢?这篇文章是51单片机的解决方法,而51单片机最多支持两层嵌套,所以!不用担心捏!

那么,最后说下我在这篇文章中想到的一些东西:复位并不是说简单的程序计数器指向复位地址,还有和复位相关的一些操作,就比如上面提到的中断的开启和关闭、中断标志位的清除等。如果不用WDT,而是用软件陷阱的方法的话,需要考虑的还是挺多的。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在查找单片机程序的原因时,通常可以尝试以下方法: 1. 调试:使用调试器对程序进行单步跟踪,可以帮助我们找出程序中的错误。 2. 日志:在程序中添加记录日志的代码,记录程序执行过程中的信息,有助于排查问题。 3. 内存检测:使用内存检测工具检测程序是否存在内存泄漏或越界访问的情况。 4. 单元测试:对程序中的独立功能进行测试,有助于发现程序中的问题。 5. 排除法:通过排除可能存在问题的部分,来确定真正的问题所在。 6. 在线问答:在线问答网站或技术论坛中寻求帮助,也可以获得有用的建议。 ### 回答2: 单片机程序的原因可能有多种,以下是一些常见的方法来查出原因: 1. 代码调试:通过对程序进行逐行调试,可以找出程序运行到哪个位置出现错误。可以使用单步执行功能,观察变量的值和程序的流程,找出可能导致程序的问题。 2. 堆栈分析:单片机程序在运行过程中会使用堆栈来存储函数的返回地址、局部变量等信息。通过分析堆栈信息,可以找出程序位置。可以使用调试工具或者在代码中插入打印堆栈信息的代码来实现堆栈分析。 3. 查看日志信息:在程序中添加输出日志的功能,记录程序运行过程中的关键信息,可以追踪程序的执行流程。查看日志信息可以帮助定位程序的位置,找到问题所在。 4. 内存检查:程序可能是由于内存访问错误导致的,可以使用内存检查工具来查找内存操作错误。通过检查程序中的内存操作,比如指针越界、内存泄漏等问题,可以找到导致程序的原因。 5. 硬件检测:单片机程序问题也可能与硬件有关,例如电源供应不稳定、电路连接错误等。因此,对硬件进行检测和测试,可以排除硬件问题对程序运行的干扰。 综上所述,通过代码调试、堆栈分析、查看日志信息、内存检查和硬件检测等方法,可以帮助我们查出单片机程序的原因,从而解决问题并保证程序的正常运行。 ### 回答3: 查出单片机程序的原因可以采取以下几种方法。 首先,可以通过调试工具来检测程序的运行情况。通过在程序中添加调试信息,可以实时监控程序的执行过程,并查看变量的值以及执行的代码路径。如果发现程序在某个地方出现异常或,可以通过打印相关信息或添加断点进行排查,定位问题所在。 其次,可以通过日志记录来排查问题。在程序中添加日志记录的功能,可以记录程序的运行状态和关键变量的取值,以便事后分析。当程序时,可以查看相关的日志信息,分析程序在哪个环节出现异常,从而找到问题的原因。 另外,可以通过逐步执行的方式找到问题所在。将程序分成若干个模块,并逐个模块地测试,确定每个模块的正确性。如果程序在某个模块出现异常,可以进一步细分该模块,对其中的具体语句进行测试和排查,最终找到问题所在。 此外,可以利用仿真工具对程序进行仿真分析。通过将程序加载到仿真环境中运行,可以模拟出程序的运行情况,并实时监测程序的执行过程,查看变量的取值情况。如果发现与预期的结果不一致或出现异常情况,可以通过回溯程序的执行路径,找到问题所在。 最后,可以采用硬件调试的方式来找出程序的原因。通过硬件调试工具,可以观察程序的运行状态,查看内存的使用情况,以及查看特定寄存器或变量的值。如果发现程序在运行过程中出现异常或,可以通过硬件调试工具进行跟踪和分析,找到问题的根源。 综上所述,通过调试工具、日志记录、逐步执行、仿真分析和硬件调试等方法,可以有效地查找出单片机程序的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值