您当前的位置:五五电子网电子知识单片机-工控设备综合-其它MCS-51系统软复位的深入研究 正文
MCS-51系统软复位的深入研究

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

点击数:7573 次   录入时间:03-04 11:40:08   整理:http://www.55dianzi.com   综合-其它

摘要 在没有硬件看门狗的系统以及一些对单片机I/O口线状态高度敏感的系统中,软复位功能相当重要。标准MCS-51以及很多常见的51内核单片机没有提供“软复位”方法。本文分别以5lasm子程序和C51函数的形式,为MCS-51单片机系统提供完善的“软复位”方法。
关键词 MCS-51单片机软复位51asm C51


引 言
    复位是单片机的初始化操作,其作用是使单片机和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。
    标准MCS-51的复位逻辑比较简单,只有通过复位引脚RST进行外部扩展。对于具有外部看门狗芯片的系统,当单片机由于某种原因程序“跑飞”而没有按时“喂狗”,或由软件陷阱捕捉到程序运行的异常,而故意不“喂狗”时,看门狗芯片会给单片机的RST引脚提供一个复位信号,让单片机进行一次“硬”复位,以恢复程序的正常运行;有些5l内核的单片机具有片内的看门狗,或者提供可访问的寄存器实现“软件复位”。一般实现的也都是与在RST引脚提供复位信号等价的“硬”复位。
    在有些应用中,由于单片机所接外设严格依附干单片机口线的时序,甚至不允许硬件复位时对口线的复位操作;或由于系统没有外部看门狗,只能用软件监测程序运行异常并重新对单片机进行初始化操作,这时就需要所谓的“软复位”了。
    在互联网上可以找到一些软复位的方法,但都不够完善或不方便使用,基于C5l的软复位更是一个难点。本文提出一种功能完善、占用资源少的实现方法,在51asm和C51下都可方便使用。

1 “软复位”要实现的功能
   
对于MCS-51系统,所谓“软复位”是一种由用户软件控制的复位活动,利用一系列指令来模拟硬件复位所实现的各种操作内容,并且重新从头开始执行用户程序。其内容包括:
    ①程序计数器PC的复位,从0000H开始执行程序;
    ②中断优先级状态触发器的复位;
    ③特殊功能寄存器的复位;
    ④程序跑飞前状态的尽量恢复。
    其中,特殊功能寄存器的复位可根据具体系统的需要,在软复位以前对相关寄存器逐个赋值再软复位的方法完成,或在复位以后的初始化程序中实现;程序跑飞前状态的恢复也可根据RAM中存留的数据来进行判断处理。本文重点讨论关于程序计数器的复位和中断优先级状态触发器的复位,在此基础上不难再增加特殊功能寄存器的复位和程序跑飞前状态的恢复,下文不再涉及相关代码。
    程序计数器的复位容易实现,一条“LJMP 0000H”即可。中断优先级状态触发器的复位则比较困难,由于它们对于用户程序是不可见的,无法直接读写其内容,只有用RETI指令才能清除。又由于51单片机两级中断机制,低优先级中断有可能被高优先级中断再次中断而形成中断再入,而一次RETl只能退出当前优先级中断并清除相应的中断优先级状态触发器,因此最坏情况下需要两次RETI才能确保中断优先级状态触发器的复位。综合考虑,可先用压栈的方法准备跳转后的入口地址,再用RETI来完成跳转和清除中断优先级状态触发器的双重任务,把以上过程执行两次,前一次的目标地址是后一次的入口,后一次则跳转到0000H,完成复位过程。


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

点击浏览下一页
   
使用时,在软件陷阱处理程序段或软件看门狗中用“LJMP #RST_O”指令跳转到此段程序入口处即可。
2.2 C51程序实现
    用C语言实现MCS-51系统的软复位,互联网上出现过多种版本,但都不够完善。以下基于业界应用最广泛的编译器Keil C51来讨论。如:

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

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

    点击浏览下一页
    可见,调用一次reset_not_best_l()函数相当于执行了1次

本文关键字:暂无联系方式综合-其它单片机-工控设备 - 综合-其它