MCS-51系统软复位的深入研究

发布者:梦想学院最新更新时间:2011-07-27 关键字:MCS-51  系统软复位 手机看文章 扫描二维码
随时随地手机看文章

  引 言

  复位是单片机的初始化操作,其作用是使单片机和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。

  标准MCS-51的复位逻辑比较简单,只有通过复位引脚RST进行外部扩展。对于具有外部看门狗芯片的系统,当单片机由于某种原因程序“跑飞”而没有按时“喂狗”,或由软件陷阱捕捉到程序运行的异常,而故意不“喂狗”时,看门狗芯片会给单片机的RST引脚提供一个复位信号,让单片机进行一次“硬”复位,以恢复程序的正常运行;有些5l内核的单片机具有片内的看门狗,或者提供可访问的寄存器实现“软件复位”。一般实现的也都是与在RST引脚提供复位信号等价的“硬”复位。

  在有些应用中,由于单片机所接外设严格依附干单片机口线的时序,甚至不允许硬件复位时对口线的复位操作;或由于系统没有外部看门狗,只能用软件监测程序运行异常并重新对单片机进行初始化操作,这时就需要所谓的“软复位”了。

  在互联网上可以找到一些软复位的方法,但都不够完善或不方便使用,基于C5l的软复位更是一个难点。本文提出一种功能完善、占用资源少的实现方法,在51asm和C51下都可方便使用。

  1 “软复位”要实现的功能

  对于MCS-51系统,所谓“软复位”是一种由用户软件控制的复位活动,利用一系列指令来模拟硬件复位所实现的各种操作内容,并且重新从头开始执行用户程序。其内容包括:

  ①程序计数器PC的复位,从0000H开始执行程序;

  ②中断优先级状态触发器的复位;

  ③特殊功能寄存器的复位;

  ④程序跑飞前状态的尽量恢复。

  其中,特殊功能寄存器的复位可根据具体系统的需要,在软复位以前对相关寄存器逐个赋值再软复位的方法完成,或在复位以后的初始化程序中实现;程序跑飞前状态的恢复也可根据RAM中存留的数据来进行判断处理。本文重点讨论关于程序计数器的复位和中断优先级状态触发器的复位,在此基础上不难再增加特殊功能寄存器的复位和程序跑飞前状态的恢复,下文不再涉及相关代码。[page]

  程序计数器的复位容易实现,一条“LJMP 0000H”即可。中断优先级状态触发器的复位则比较困难,由于它们对于用户程序是不可见的,无法直接读写其内容,只有用RETI指令才能清除。又由于51单片机两级中断机制,低优先级中断有可能被高优先级中断再次中断而形成中断再入,而一次RETl只能退出当前优先级中断并清除相应的中断优先级状态触发器,因此最坏情况下需要两次RETI才能确保中断优先级状态触发器的复位。综合考虑,可先用压栈的方法准备跳转后的入口地址,再用RETI来完成跳转和清除中断优先级状态触发器的双重任务,把以上过程执行两次,前一次的目标地址是后一次的入口,后一次则跳转到0000H,完成复位过程。

  2 软复位的实现方法

  前已述及软复位要完成的功能,包含程序计数器PC的复位、中断优先级状态触发器的复位、特殊功能寄存器的复位(略)和程序跑飞前状态的恢复(略)。下面分别用汇编程序和C51程序来实现,重点介绍C51程序的实现方法。

  2.1 51asm汇编程序实现

MCS-51系统软复位的深入研究

  使用时,在软件陷阱处理程序段或软件看门狗中用“LJMP #RST_O”指令跳转到此段程序入口处即可。

  2.2 C51程序实现

  用C语言实现MCS-51系统的软复位,互联网上出现过多种版本,但都不够完善。以下基于业界应用最广泛的编译器Keil C51来讨论。如:

MCS-51系统软复位的深入研究

  这段程序,用强制类型转换把地址0000H转换成re-set_not_best_O()函数的入口。实际上调用函数reset_not_best_O()等价于“LJMP 0000H”,没有处理可能的中断状态问题。

[page]

  又如:

MCS-51系统软复位的深入研究

  这段代码中,一维字符数组中为复位代码的机器码。“(*((Void(*)())(rst)))()”是把rst这个字符数组的地址强制转换成函数指针,并调用。实际上调用函数reset_not_best_1()是执行了一段如下代码:

MCS-51系统软复位的深入研究

  可见,调用一次reset_not_best_l()函数相当于执行了1次清除中断优先级状态触发器的动作,然后跳转到0000H重新执行。但此段代码仍然可能被再次中断失效,或者当原来堆栈已经溢出时导致对0000H地址的压栈错误,不能正确实现“软复位”功能。除此之外,由于KeilC5l在把控制权交给函数main()之前对内部RAM进行初始化的代码是:

MCS-51系统软复位的深入研究

  此处R0作为循环变量使用,对内部RAM从7FH单元开始,按照每次递减的方法对内部RAM逐一进行清零。当R0指向00H时,以上程序可以很好地完成清零工作;然而R0依据RS0、RSl取值的不同,可以指向00H、08H、10H或18H单元。当:R0指向08H、10H或18H时,上面所列清零程序将陷入死循环。分析如下:

  以RS0=1、RSl=0,即RO指向08H为例。自标号LOOP处起始的循环进入时的状态是:R0=7FH,PC=#LOOP。设程序已执行到R0=08H,PC=#LOOP,此时执行PC指向处的指令“MOV @RO,A”,将把(RO)清零,也即08H单元清零。由于R0指向08H,实际上R0也被清零了,此时RO=00H,PC=#LOOPl;再执行一条指令“DJNZ R0,LOOP”,R0将由00H自减为OFFH,回到R0=OFFH,PC=#LOOP的状态;继续执行,将再次出现R0==08H,PC=#LOOP的状态,陷入死循环。当R0指向10H或18H单元时也类似会陷入死循环。为了避免上述问题,可以把字符数组中机器码改为与以下程序段对应:[page]

MCS-51系统软复位的深入研究

  调用改造后的reset_not_best_l()函数将清除中断优先级状态触发器,并跳转到0000H单元继续执行,从而实现了软复位。但由于只执行了1次RETT指令,在复位前出现了中断再入的极端情况下,仍会出现低优先级中断放锁死的现象。由于无法在字符数组中实现对最终代码地址的取得,无法如2.1节汇编程序中的“MOV DPTR,#RSTl”一样读取绝对地址,因此也无法实现如同2.1节中的两次RETl来保证清除全部的中断优先级状态触发器。解决的办法是,在内存中设置标志flag,每次复位后都检查特定标志,接如下伪代码来判定(假定复位标志设为0x55,若复位后发现标志字为0x55则转正常初始化程序,否则置复位标志为0x55,再次复位):

MCS-51系统软复位的深入研究

  但这种办法有两个弊端:其一,万一在程序跑飞时刚好处在中断再入中,且flag所在的RAM地址中由于某种原因恰好是0x55,低级中断仍是被锁死的;其二,Keil C5l的缺省编译模式是加上了初始化程序段startup.A51的,在这段程序中对全部的内部RAM都进行了初始化,复位标志也会被清0,flag将失效。因此要正常使用标志flag必须手工修改startup.A5l,不要清除flag单元,或者禁止stanup.A5l的使用,自己对内部RAM进行初始化,都比较繁琐。

  若用以下reset_best()函数,则可顺利解决上述问题:

MCS-51系统软复位的深入研究[page]

  在此函数中,首先定义了结构体类型ResetStruct,它包含字符数组rstcode和16位整型数addr两个成员。在结构体变量的RST实例中,RST.rstcode是复位代码对应的机器码,RST.addr的值是RST.rstcode这个数组的首地址+偏移量0x15。其实是以下汇编代码中标号rstl处的地址,也即是“#rstl”,由Keil C51在编译时自动计算得到。

MCS-51系统软复位的深入研究

MCS-51系统软复位的深入研究

  此reset_best()函数巧妙地利用C语言中数组名即是数组首地址(其实质就是这一段“软复位”代码的入口地址!),把数组名+偏移量0x15赋值给结构体的int型的成员addr,则正好把软复位代码中标号rstl的入口地址两个字节取了出来(由KeilC51在编译连接时完成),存放在RST.addr中,由于结构体连续存储,RST.addr会紧接着软复位代码RST.rstcode存放。见上段程序中的“DB #LOW(rstcode+OFH)”和“DB #HIGH(rstcode+09H)”。

  当本程序被调用并执行到“MOVC A,@A+PC”时,分两次取到的分别是“#rstl”的低位和高位字节,把它们压栈以后再调用RETI指令,除了清除可能有的中断优先级状态记录外,还会跳转到rstl执行后续的连续两次压栈操作,把第2次RETI的返回地址设为0000H,再通过紧接着的RETI指令,清除可能还有的中断优先级状态记录,并跳转到0000H完成完整的复位操作。

  本程序使用一个C51函数完成了完整的包含两次RETI在内的复位操作,消除了所有已知隐患,只需在应用程序中包含此reset_best()函数,在需要软复位时调用即可。2.1节中所列汇编语言的子程序也可使用本节分析时所用汇编代码代替。

  结 语

  本文对MCS-51单片机的“软复位”进行了深入讨论,给出了分别基于51asm的汇编子程序和基于C5l的函数。使用本文所述的“软复位”方法,无论是5lasm程序还是C51程序,所需的资源消耗都很小,只占用二三十个字节的程序存储器,使用也非常简单,不会增加编程负担。当具体应用系统还需进行特殊功能寄存器的复位以度程序跑飞前状态的恢复时,在此基础上也很容易实现。特别是当单片机所接外设严格依附于单片机口线的时序,须尽量避免硬件复位对口线的复位操作或系统不具备硬件看门狗时,对于提高单片机系统的抗干扰能力有较大的实用价值。实际应用表明,这种软复位方法是非常有效的。

 

 

关键字:MCS-51  系统软复位 引用地址:MCS-51系统软复位的深入研究

上一篇:基于P89V51RD2的多功能蓄电池充电系统设计
下一篇:ATmegal28扩展512KB掉电保护SRAM方案

推荐阅读最新更新时间:2024-03-16 12:38

MCS-51单片机的内部结构介绍
1、8051单片机片内并行接口 2、MCS-51的内部资源 3、MCS-51的芯片引脚 4、单片机的工作方式 单片机的工作方式包括:复位方式、程序执行方式、单步执行方式、低功耗操作方式以及EPROM编程和校验方式。 1. 复位方式:经典的上电复位电路 2. 程序执行方式:(1)执行内部程序;(2)执行外部程序 3. 单步执行方式:用于调试程序和系统 4. 低功耗操作方式 5. 编程和校验
[单片机]
<font color='red'>MCS-51</font>单片机的内部结构介绍
MCS-51单片机指令系统(3)
指令按寻址方式分有 7种寻址方式,直接寻址(direct)、立即寻址(#20H) 、寄存器寻址(Rn)、寄存器间接寻址(@Ri)、相对寻址(rel)、寄存器变址寻址(@A+PC)、位寻址 ( ACC.1) 指令按功能上分有5种 ,传送类指令 、算术运算类指令、逻辑运算及移位类指令、控制转移类指令、位操作类指令。其指令三大属性:功能属性、空间属性(指令站用的字节数)、时间属性(指令执行的机器周期数)。 一、数据传送指令(28): 使用最频繁的一类指令,通用格式: MOV 目的操作数 , 源操作数 属“复制”性质,而不是“搬家”。数据传送类指令不影响标志位:Cy、Ac和OV,影响奇偶标志位P。 1.内部RAM数据传送指令
[单片机]
基于MCS-51单片机的LED点阵屏实现礼花功能
大家可曾记得礼花绽放那一刻的精彩?小时候每当看礼花绽放时,总希望自己能将那最美的那一霎那永远留下。终于,今天我的梦想实现了。通过自己的板板,只要随手编程几下就搞定啦! 在给大家展示效果图之前,我们首先得对 LED 点阵屏做一番介绍!8*8 LED点阵等效 电路 如图1所示。通过分析,我们不难得知:只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如:若想使左上角LED点亮,则Y0=1,X0=0,则会形成压降点亮左上角的LED。这里的水平方向由P2控制,垂直方向由P0控制。   图1 8*8 LED点阵等效电路 本次在LED点阵屏上实现显示礼花的功能原理接口图如图2所示,效果图如图3所示。通过该LED点阵还可以显示静态或
[单片机]
基于<font color='red'>MCS-51</font>单片机的LED点阵屏实现礼花功能
MCS-51单片机定时系统
定时/计数器和中断源的多少直接决定单片机的性能。MCS-51单片机内部有两个可编程的16位定时/计数器和5个中断源,具有较强的实时处理能力和对外部应急事件的处理能力。要充分发挥单片机的功能,必须充分利用定时和中断。 定时器/计数器 一、定时和延时的区别 在单片机程序清单中,经常看到延时子程序和定时(中断)子程序。它们都能使单片机间隔一段时间后再做另一件事。例如,控制两组灯的交替闪亮。以1999年第38期九版图13为例,下面分别是用延时和定时方法的源程序。 程序1: ORG 0000H AJMP MAIN ORG 50H MAIN:MOV P1,#0AAH;第一组灯亮 ACALL DELAY ;调延时子程序 MOV P1,#55H
[单片机]
<font color='red'>MCS-51</font>单片机定时<font color='red'>系统</font>
单片机定时器的应用与误差纠正
1 前言    定时器是MCS-51单片机非常重要的组成部分,由于其应用与单片机的其他硬件相关,存在着一定的复杂性 。而定时器是单片机应用中解决某类复杂问题的最有为效的方法,应用非常广泛。随着定时要求的提高,在定时处理过程中所带来的误差需要校正 ,本文就MCS-51单片机的使用方法与误差校正方法进行了讨论,并给出通用算法与程序。 2 定时器工作方式与方式设置    MCS-51单片机有两路独立的定时器,每路定时器有4种工作方式(0~3),方式0是13位计数结构,计数器由TH全部8位与TL的低5位构成;方式1是16位计数结构,计数器由TH与TL全部8位共16位组成;方式2是8位计数结构方式,计数器由TL8位组成,与其他方式不同
[单片机]
MCS-51定时器,串行口和中断初始化程序
  程序框图    电路 程序 0030 758160 CHK00: MOV SP,#60H 0033 1204A5 LCALL LED P 0036 900081 MOV DPTR,#C LOC K 0039 A882 MOV R0,DPL 003B A983 MOV R1,DPH 003D 90000B MOV DPTR,#000BH 0040 7402 MOV A,#02H 0042 F0 MOVX @DPTR,A 0043 A3 INC DPTR 0044 E
[单片机]
<font color='red'>MCS-51</font>定时器,串行口和中断初始化程序
MCS-51单片机嵌入式Internet技术的工作原理简述
  实现MCS-51 单片机嵌入式接入Internet 技术。单片机通过ATL8019AS 以太网控制器实现与Internet 的交互。利用开源代码的TCP/IP 协议栈uIP 实现对底层设备的驱动,同时通过uIP 协议的应用程序接口实现各种应用服务。给出了硬件设计图,编写了单片机主程序。应用此技术实现了一个城市中心停车监测系统。   近年来以单片机(Micro Computer Unit,MCU)为代表的嵌入式系统在工业探测系统、智能仪器、安防系统、智能家电和信息家电领域得到了广泛应用。   如果嵌入式系统能够连接到Internet 上,则用户可以方便、快捷、低廉地通过网络进行远程控制、监测和信息传送。Internet 技
[单片机]
<font color='red'>MCS-51</font>单片机嵌入式Internet技术的工作原理简述
MCS-51逻辑运算及移位指令
逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。 . 循环移位指令(4条) 这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。 RL A ;累加器A中的内容左移一位 RR A ;累加器A中的内容右移一位 RLC A ;累加器A中的内容连同进位位CY左移一位 RRC A ;累加器A中的内容连同进位位CY右移一位 . 累加器半字节交换指令(1条) 这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved