首页 | 期刊简介 | 编辑部 | 广告部 | 发行部 | 在线投稿 | 联系我们 | 产品信息索取
2025年4月5日星期六
2011年第01期
 
2010年第12期
 
2010年第11期
2010年第11期
 
2010年第10期
2010年第10期
 
2010年第09期
2010年第09期
 
2010年第09期
2010年第08期
 
2010年第07期
2010年第07期
 
2010年第06期
2010年第06期
 
2010年第05期
2010年第05期
 
2010年第04期
2010年第04期
 
2010年第03期
2010年第03期
 
2010年第02期
2010年第02期
 
2010年第01期
2010年第01期
 
2009年第12期
2009年第12期
 
2009年第11期
2009年第11期
 
2009年第10期
2009年第10期
 
2009年第9期
2009年第9期
 
2009年第8期
2009年第8期
 
2009年第7期
2009年第7期
 
2009年第6期
2009年第6期
 
2009年第5期
2009年第5期
 
2009年第4期
2009年第4期
 
2009年第3期
2009年第3期
 
2009年第2期
2009年第2期
 
2009年第1期
2009年第1期
 
2008年第12期
2008年第12期
 
2008年第11期
2008年第11期
 
2008年第10期
2008年第10期
 
2008年第9期
2008年第9期
 
2008年第8期
2008年第8期
 
2008年第7期
2008年第7期
 
2008年第6期
2008年第6期
 
2008年第5期
2008年第5期
 
2008年第4期
2008年第4期
 
2008年第3期
2008年第3期
 
2008年第2期
2008年第2期
 
2008年第1期
2008年第1期
单片机系统中的软件抗干扰技术
The Soft Anti-jamming Tech. In SCM System
■中国人民解放军炮兵学院 王占操 梁厚琴 曹燕

摘要本文主要介绍了如何通过软件的方法来提高单片机系统的稳定性。

关键词冗余 软件陷井 看门狗

近年来单片机系统在工业测控领域的应用越来越广泛,而对于环境恶劣的工业现场,这种新型的微控制器的可靠性、安全性就成为了一个大问题。在实验室运行正常的程序到了工业现场却不能运行,或者出现运行不稳定经常死机等。在这里主要讨论一下如何通过软件技术来增强系统的稳定运行。

当系统的CPU部位受到干扰信号的作用时,将使系统失控。最典型的故障是破坏程序计数器PC的状态值。导致程序在地址空间内"乱飞",或者陷入死循环。对这种情况的处理主要有这么几种方法:

1、指令冗余技术;
2、软件陷阱技术;
3、看门狗技术。
下面 以MCS-51单片机来做说明。


指令冗余技术


指令由操作码和操作数组成,操作码指明CPU要完成什么样的操作,而操作数是操作码的对象。单字节指令只有操作码,隐含操作数;双字节指令,第一个字节是操作码,第二个字节是操作数;三字节指令第一个字节是操作码,后二个字节是操作数。CPU在取指令的时候是先取操作码再取操作数,如何判断是操作码还是操作数就是通过取指令的顺序。而取指令的顺序完全由指令计数器PC来控制,因此,一旦PC受干扰出现错误程序便会脱离正常轨道,出现"乱飞",这样就会出现把操作数当作操作码,或者把操作码当作操作数的情况。但只要PC指针落在单字节指令上程序就可纳入正轨,所以为了快速将程序纳入正轨,应该多用单字节指令,并在关键的地方人为插入一些单字节指令NOP,或将有效的单字节指令重写,这就称之为指令冗余。

常用的方法就是在一些双字节、三字节指令后面插入两个单字节指令NOP,或在一些对程序的流向起决定作用的指令前面插入两条NOP指令。还可对一些重要的指令进行重复放置。

但采用指令冗余技术将程序纳入正轨的条件是:乱飞的PC必须指向程序运行区。


软件陷阱技术


当乱飞的程序进入非程序区的时候,就可设定软件陷阱对乱飞的程序进行拦截从而将程序引向一个固定的位置。这样就可将捕获的程序重新纳入正轨。

软件陷阱主要就是把程序重新引入它的复位入口处,也就是说在适当的地方设置这样的指令:

NOP
NOP
LJMP 0000H
软件陷阱主要安排在这样一些区域:未使用的中断区、未使用的EPROM空间及非EPROM空间、程序运行区及中断服务程序区。主要来看前三种:

1、未使用的中断区

如果对于未使用的中断因干扰而开放的话, 可以这样写中断服务程序:
NOP
NOP
POP D1 ;将原来的错误断点弹出
POP D2 ;将原来的错误断点弹出
PUSH 00H
PUSH 00H;将断点地址重写为 0000H
RETI

2 .未使用的EPROM区

假设用了一片2764,但并没有用完整个存储区。这时候就可在未用的区域里填充上020000数据,这样当程序飞入其中时就会很快的走入正轨。