搜索
bottom↓
回复: 36

MEGA8怎么样写指令冗余语句?

[复制链接]

出0入0汤圆

发表于 2010-3-17 20:49:28 | 显示全部楼层 |阅读模式
大家好,记得说51系列能用NOP语句来实现软件冗余作用,比如在某个跳转指令前加两三个NOP,
来加强软件的抗干扰能力,我现在用MEGA8,想知道可不可以也这样处理?

出0入0汤圆

发表于 2010-3-17 21:33:23 | 显示全部楼层
一样也是用nop

C里面可以这么写 asm("nop");

出0入0汤圆

发表于 2010-3-22 13:51:32 | 显示全部楼层
这个东西对于AVR没有什么真正的作用的,因为AVR是RISC结构,指令的长度是定长的,16位或32位,与51不同。

另外关于在某个跳转指令前加两三个NOP,通常是直接编写汇编代码中使用,在高级语言中,你怎么知道 asm("nop");就一定是在跳转指令前的?

比如:
asm("nop");
asm("nop");
if (A >= B)
{ };
else
{ };

这样行吗?if语句首先要做的是判断,而不是跳转!

if (A >= B)
{
   asm("nop");
   asm("nop");
   。。。。
};
else
{
   asm("nop");
   asm("nop");
   。。。。。
};
    这样实际已经跳转过了。

=========================================

出0入0汤圆

发表于 2010-3-22 18:59:27 | 显示全部楼层
其它C还是很听话的,基本会按指令的顺序生成汇编代码的,只是确实按马老师说的,加入NOP没什么作用。


unsigned char A,B;

A=PINB;
B=PINC;
asm("nop");
asm("nop");
if(A >= B)
{asm("nop");
asm("nop");
PORTB=0x12;}
else
{asm("nop");
asm("nop");
PORTB=0x34;}



(0033) unsigned char A,B;
(0034)
(0035) A=PINB;
    001B5 B366      IN        R22,0x16
(0036) B=PINC;
    001B6 B2A3      IN        R10,0x13
(0037) asm("nop");
    001B7 0000      NOP
(0038) asm("nop");
    001B8 0000      NOP
(0039) if(A >= B)
    001B9 156A      CP        R22,R10
    001BA F028      BCS        0x01C0
(0040) {asm("nop");
    001BB 0000      NOP
(0041)  asm("nop");
    001BC 0000      NOP
(0042)  PORTB=0x12;}
    001BD E182      LDI        R24,0x12
    001BE BB88      OUT        0x18,R24
    001BF C004      RJMP        0x01C4
(0043) else
(0044) {asm("nop");
    001C0 0000      NOP
(0045)  asm("nop");
    001C1 0000      NOP
(0046)  PORTB=0x34;}
    001C2 E384      LDI        R24,0x34
    001C3 BB88      OUT        0x18,R24
(0047)

出0入0汤圆

发表于 2010-3-22 20:17:19 | 显示全部楼层
这个“听话”并没有意义的,其实在跳转指令前根本没有加“nop”

(0033) unsigned char A,B;
(0034)  
(0035) A=PINB;
    001B5 B366      IN R22,0x16
(0036) B=PINC;
    001B6 B2A3      IN R10,0x13
(0037) asm("nop");
    001B7 0000      NOP
(0038) asm("nop");
    001B8 0000      NOP
(0039) if(A >= B)
    001B9 156A      CP R22,R10      《== 这个是比较指令    如果是if(a>=b+c) 前面的nop离跳转还要远              
    001BA F028      BCS 0x01C0      ===>这个才是跳转
(0040) {asm("nop");
    001BB 0000      NOP
(0041)  asm("nop");
    001BC 0000      NOP
(0042)  PORTB=0x12;}
    001BD E182      LDI R24,0x12
    001BE BB88      OUT 0x18,R24
    001BF C004      RJMP 0x01C4      ==〉这个也是跳转,前面到是可以加上“nop”的,可是你没加
(0043) else
(0044) {asm("nop");
    001C0 0000      NOP             ==〉这2个“nop”已经是跳转后的  
(0045)  asm("nop");
    001C1 0000      NOP
(0046)  PORTB=0x34;}
    001C2 E384      LDI R24,0x34
    001C3 BB88      OUT 0x18,R24
(0047)

出0入0汤圆

发表于 2010-3-22 20:36:55 | 显示全部楼层
是哦,但我觉得这个NOP插到哪都是没用的
  
BCS 0x01C0      就算在这条之前加了NOP也起不了什么作用。

我NOP只是用在精确的时序和短延时上。

出0入0汤圆

发表于 2010-3-22 21:08:12 | 显示全部楼层
实际上一旦程序跑飞,NOP是阻止不了的。

但在代码空间后面的空余地方加上NOP,还是稍微可以讲的过去。它只是防止“万一”、“或许”、“恰巧”程序飞到了这个地方,那么将不会进入死循环中。一条一条NOP执行,只到代码空间的最后,然后回到代码空间的开始处,从头开始执行。

这个相当于RESET重新上电。

这个在编程器的设置中有这个选项,就是“程序的剩余空间填充NOP”,而在编写程序过程中根本可以不必考虑的。

注意有些系统和产品,允许在任何时候重新RESET,让你骗过用户,认为你的系统“抗干扰”。而更多的产品和系统,尤其是工业控制系统是不允许程序跑飞的。所以真正的功夫应该是在系统硬件本身的抗干扰设计(不能让程序跑飞),软件的抗干扰措施和方法也是有的,但决不是在什么跳转指令前加几个“NOP”的问题。

出0入0汤圆

发表于 2010-3-22 22:27:07 | 显示全部楼层
51下程序指令长度有1字节指令,2字节指令,3字节指令 加NOP可以拦截PC错位,有一定的抗干扰作用,但是AVR是固定指令长度,加NOP只能浪费程序空间

出0入0汤圆

发表于 2010-3-22 22:48:18 | 显示全部楼层
楼上的,什么是“拦截PC错位”?能具体说明或举个例子吗?

就算有“一定的抗干扰作用”,那么为什么只是加在跳转指令前?而不是每条指令之间都加NOP?

好多东西是错误的概念,要仔细分析的。

出0入0汤圆

发表于 2010-3-23 20:53:53 | 显示全部楼层
我同意 【7楼】 laoma 我要到日本去放烟火 的说法

前提是马老师说的其中一种"允许在任何时候重新RESET,让你骗过用户,认为你的系统“抗干扰”。"

但绝对比没有的好许多。


按7楼说的51的批令不是定长的,1字节指令,2字节指令,3字节指令,没有经过加工就这样存入了FLASH

这样做的优点是节省了FLASH空间但程序跑飞很危险。每次取的字节数不同,跑飞时就造成PC错位

程序变成一堆乱码乱执行,而加入几个nop,最多三个就行了,使PC进入正轨,原理是51的一条指令最多

三个节字,CPU再怎么跑飞读到最多的是三个字节,这时就有二种情况出现:

1: CPU读一节字 NOP 这是最好的情况,说明PC本身没错位,然后接着执行 nop nop也不影响,PC进入正轨

2:  CPU读双三节字 (* nop) (* * nop) (* nop nop),执行完后的下一条还是NOP,再执行就跟第1点一样了,PC进入正轨。


所以说加入NOP有一定的抗干优作用其实是较正PC错位,那为什么要在跳转指令加呢?那是因为效率问题了。

我们不可能在任何地方都插入NOP,太占FLASH空间,程序也不容易实现。插在跳转指令之前就是为了在跳转之前

让CP进入正轨,执行正确的跳转不管他怎么跳程序总能运行的,如果跳转前没加入NOP的话,假设程序就跑飞在

跳转指令附近时,由于PC的错位使CPU读出来的不是跳转指令,程序继续乱飞中。  


而AVR的指令是一一对应的,大部分是一个指令在一个地址内,小部分一个指令为二个地址空间,

AVR的做法虽然浪费了点FLASH空间但增加了一定的抗干扰。(只要读到二个一字指令,程序在一定程度上进入正轨)

举个例子:

(原文件名:11111.PNG)

当没加入NOP时,假设程序跑飞,PC跑到44H,这时读出来的是90H,90H是一条数据传送指令

CPU会接着读出这条指令的下两个内容组成一条完整的指令,这时读了的是02H 00H

也就是MOV  DPRT,#0200H 而实际上02H 00H 和下一条 4EH组成的是一个跳转指令(LJMP 004EH)没有被正确的执行

程序继续错误的执行下去。

加入了三个NOP就不同了,同样PC跑飞到44H,这时读出的是90H 00H 00H (MOV  DPRT,#0000H)

接着执行下一条NOP, 然后LJMP 004E被正确的执行,程序进入正轨。

......没办法,我表达能力不好,写了这么一大堆

出0入0汤圆

发表于 2010-3-23 21:11:57 | 显示全部楼层
模似了下,跟我想的一样,没加程序跑飞,加入后程序正常跳转。

(原文件名:11112.PNG)

出0入0汤圆

发表于 2010-3-23 22:38:59 | 显示全部楼层
加NOP是51还处于汇编时代的事了。用汇编写51,加nop有时确实可以阻止程序跑飞。正如7楼所说,是一个指令长度问题。
但后来用C之后,编译器会自动的处理指令长度问题,所以加NOP也逐渐淡出人们的视野。

当看到有加NOP的说法时,一般都是针对51的汇编。用C或其它单片机基本不用考虑。

出0入0汤圆

发表于 2010-3-23 23:02:41 | 显示全部楼层
【11楼】 gliet_su

C编译器是怎么处理指令长度问题的?

我用KEIL C写了段代码,然后反汇编发现它并没有任何的处理。

#include "reg51.h"
                  
void main()
  {             
  unsigned char x;

  P1=0xff;
  x=P1;

  if(P1>0x55)
  P2=0x90;
  else
  P2=0x12;
   
  while(1);
   
  }   


(原文件名:11111.PNG)

出0入0汤圆

发表于 2010-3-24 10:30:22 | 显示全部楼层
楼上2位的解释实际上都不能真正说明NOP能“抗干扰”。

1。程序跑飞到底是什么概念?按9楼说法:“跑飞时就造成PC错位”。我们知道,正常情况下,读一个字节指令,PC自动加1,那么按:“跑飞时就造成PC错位”的说法,跑飞后PC到底是如何错位的?是增加了还是减少了?增加(减少)了多少?9楼分析了半天,好象PC错位就只是多加了1个。

   实际上,如果程序跑飞是PC错位造成的(PC寄存器受到干扰),那么这个错位的各种可能行都存在。加NOP有什么作用呢?


2。假定9楼的解释是正确的,那么错位时CPU执行的那条指令肯定没有正确的执行,或者说有可能执行一条错误的指令后,才能进入所谓的NOP修整。问题是,你的系统已经没有正常执行规定的指令了,甚至还执行了错误的指令,如何保证系统还是正常的?就是进入了正常的跳转,前面的错误如何修正?恐怕这个系统也不正常了吧(除非是从RESET开始)。

3。干扰是随机产生的,并不总是出现在跳转指令前。

出0入0汤圆

发表于 2010-3-24 18:00:44 | 显示全部楼层
回【13楼】 machao

1.“好象PC错位就只是多加了1个”

我只是举个例子,实际上上这个PC是随机产生的,不管PC是是多了还是少了,

PC总是会跑到跳转指令附近,就是跑到这附近时,我们才开始用NOP调整PC。

PC错位实际上有三种情况(PC+1,PC+2,PC+3),我上面归成两种,是因为有两种情况是一样的。

第一种是PC刚好读到第一个NOP,这样就正确了(PC+1)。

第二种是读到的不是NOP,而是NOP前面的一个或两个字节,然后跟NOP组成其它指令(PC+2,PC+3),

执行后后面还有个NOP用来调整,这样PC也被修正了。

“3。干扰是随机产生的,并不总是出现在跳转指令前。”

这个也可以用第一点解释(乱执行一大堆指令后还是会经过跳转指令的,一个程序里不可能只有一个跳转指令)。

"2。假定9楼的解释是正确的,那么..."

第二点就要用另一种方法解决了,插入软件陷阱(每隔一段代码之间插入一段)。

如:
    .......
    LJMP     L1
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    LJMP    ERROR   ;错误处理(需要的话这里就可以跳到RESET)
L1:......

出0入0汤圆

发表于 2010-3-24 21:12:16 | 显示全部楼层
回12楼hsztc

C的编译器并不会自动加NOP,而是它在编译时能够保证不会有取错指令的情况(如:要取1字节指令,决不会编译成取2字节指令)
另:对汇编我也不是很了解,还是期待高手来说明吧。

出0入0汤圆

发表于 2010-3-24 21:25:32 | 显示全部楼层
回【15楼】 gliet_su

汇编也是不会错的...

C最后也是生成汇编的,不管用什么软件写都不会取错指令的,

我们讨论的是系统受到干扰,单片机本身出的错跟用什么软件编程无关。

出0入0汤圆

发表于 2010-3-24 21:34:22 | 显示全部楼层
回14楼:

1。“PC错位实际上有三种情况(PC+1,PC+2,PC+3)”?根据是什么?你如何证明这个论点?为什么不会出现PC-1,PC-2,PC-3?这个干扰这么有规律?
    不能使人信服的。


2。“第二点就要用另一种方法解决了,插入软件陷阱(每隔一段代码之间插入一段)。”

    自己也心虚了。首先已经错误执行(或根本没执行)的那条代码如何修正?另外你的如:

    .......
    LJMP     L1
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    LJMP    ERROR   ;错误处理(需要的话这里就可以跳到RESET)
L1:......

  在正常才程序中如何加上?

=================================================
自己仔细分析一下,再做回复。不要以为书上的东西,或网上的东西都是正确的。

出0入0汤圆

发表于 2010-3-24 22:21:24 | 显示全部楼层
回 【17楼】 machao

1. 这个干扰没有规律,但它造成的后果是有规律的(单指PC错位)。

因为前面说过,51的指令长度只有三种一字节、双字节、三字节,不管PC怎么错取完指令后就只有+1+2+3了(跳转走的除外),

当然,你要理解成PC-1-2-3也是可以的。

2.我不是心虚啊,这个NOP不是万能的,抗干扰是个大问题不是简简单单靠个NOP就能解决的,

我只能说用它比没用的好一点。

  .......  
    LJMP     L1  
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    LJMP    ERROR   ;错误处理(需要的话这里就可以跳到RESET)  
L1:......  

这里写的很完整了
......
......
这个表示前面和后面全是程序,

这是要插入的程序:
    LJMP     L1  
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    LJMP    ERROR   ;错误处理(需要的话这里就可以跳到RESET)  
L1:
把这段插在程序的任何地主都行(时序要求高的地方不要插就行了)。

正常运行的时候不会执行
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    NOP  
    LJMP    ERROR   
而是用 LJMP     L1  跳到L1的位置。

当PC跑飞时,只要落入NOP内就能够处理这个错误了。

C的话就在程序当中插入
goto L1
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
goto ERROR
L1:

出0入0汤圆

发表于 2010-3-24 22:47:06 | 显示全部楼层
C可能不行,我刚才将
goto L1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
goto ERROR;
L1:
放在KEIL C里,然后反汇编后发现被C优化掉了。。。

出0入0汤圆

发表于 2010-3-24 23:30:34 | 显示全部楼层
“ 这个干扰没有规律,但它造成的后果是有规律的(单指PC错位)。 ”  "不管PC怎么错取完指令后就只有+1+2+3"!?

===》你从那里找到的这个说法?是自己测试得到的吗?正确的情况下:取一个字节的指令后,PC+1;取2个字节的指令后,PC+2.....。如果PC受到干扰,应该是PC+1的,却变成了任意的一个数,是不是也是程序跑飞?为什么不可能产生?


   LJMP     L1   
    NOP   
    NOP   
    NOP   
    NOP   
    NOP   
    NOP   
    LJMP    ERROR   ;错误处理(需要的话这里就可以跳到RESET)   
L1:......   


这个例子是硬编造的。
1。首先NOP不是加在跳转前,与LZ位的说法矛盾。
2。只是对于   LJMP     L1 “抗干扰”了。也就是说,如果   LJMP     L1 没有正确执行,转到ERROR处理了。但干扰并不是只在执行 LJMP     L1   出现吧?

如果是在执行ADD指令、SUB指令、MOV指令出现跑飞,代码又如何写?

出0入0汤圆

发表于 2010-3-25 00:16:13 | 显示全部楼层
...我不知道怎么解释了,可能是我表达能力不够好吧。

我括号内的“单指PC错位”这个很重要,这个PC受到干扰后的值是个随机产生的一个数,

可以是任何数并不影响的,最可怕的是这个任何数对应的ROM空间的有可能是数据也有可能是指令。

是指令就没问题,但是是数据就有问题了,CPU把这个数据当成指令来执行,使整个程序的执行结果

完全不是我们所要的内容。而且会一直错下去,直到遇到读出的数据是真指令时,这个PC错位才会得到

修正,执行的才是我们编写的程序。(这里不考虑程序执行结果是不是我们要的,只考虑运行的是不是我们写的指令)


接着说PC跑飞,PC不管怎么跑飞,它也是在ROM空间内跑,只要多挖陷阱,PC掉进去的可能性就会很大,

PC掉入陷阱时也有可能是错位的,所以也要加入NOP来修正。

我很难说的清楚,画个图,大约ROM就是这种结构。(不想多解释了)


(原文件名:11111.PNG)

出0入0汤圆

发表于 2010-3-25 16:05:17 | 显示全部楼层
"我括号内的“单指PC错位”这个很重要,这个PC受到干扰后的值是个随机产生的一个数"
====================================
很好,你终于认可“PC受到干扰后的值是个随机产生的一个数”,而不只是+1/+2/+3。

可以是任何数并不影响的,最可怕的是这个任何数对应的ROM空间的有可能是数据也有可能是指令。
是指令就没问题,但是是数据就有问题了,CPU把这个数据当成指令来执行,使整个程序的执行结果
完全不是我们所要的内容。而且会一直错下去,直到遇到读出的数据是真指令时,这个PC错位才会得到
修正,执行的才是我们编写的程序。(这里不考虑程序执行结果是不是我们要的,只考虑运行的是不是我们写的指令)
==========================================
“最可怕的是这个任何数对应的ROM空间的有可能是数据也有可能是指令”确实可怕。不管是指令,还是数据都有问题:
1。首先破坏了整个正常指令的执行顺序
2。不管它原先就是指令而去执行,还是把数据作为指令来执行,它的后果是未知的

因此,在这样的情况下,整个系统还正常吗?这个时候“程序执行结果都不是我们要的”了,接下去再转到所谓“运行我们写的指令”还有意义吗?此时应该是初始化从头开始执行代码。

==========================================
你的表达能力没有问题。

出0入0汤圆

发表于 2010-3-25 18:18:47 | 显示全部楼层
【22楼】 machao

1."很好,你终于认可“PC受到干扰后的值是个随机产生的一个数”,而不只是+1/+2/+3。 "


我从头到尾就没说过PC不是一个随机数。。。

而+1+2+3是指PC跑飞后所产生读取ROM的结果(PC错位的结果),而不是PC的值就+1+2+3。

不管这个PC怎么跑飞,它还是会老老实实取完指令后+1+2+3的,按这种趋势,PC值会一直增加

(不考虑跳转和程序执行是不是我们要的结果),以这种趋势有很大的可能会掉入我们设的陷阱。



2.把数据当指令执行的后果是未知的,但执行的是我们写的指令是有一定作用的,

它的作用是将PC引导到我们写的错误处理程序。

这个错误处理程序也可以是一个RESET,初始化从头开始执行代码。

出0入0汤圆

发表于 2010-3-25 21:58:46 | 显示全部楼层
我明白了,你指PC跑飞了,是个随机的值,然后读PC+1/+2/+3指令,就能正好读到NOP了。

那么你的NOP陷阱加在那里好呢?需要加多少个?总不能写一条指令就跟上一段NOP陷阱吧,你写过这样的代码吗。凭想像是不行的。

出0入0汤圆

发表于 2010-3-25 23:21:43 | 显示全部楼层
不是正好读到NOP(但也有可能,NOP多的话有一定的概率),而是跑飞后,乱执行一堆指令后落入陷阱的。


陷阱每隔一段代码就加一段,如两个子程序之间。数量由你定,写完程序后剩余空间都能放。

在不影响程序的功能的情况下,加的越多越好。

程序跑飞后它还是要一条一条的代码执行下去,所以不需要每个指令后面都加。

我还没遇到程序跑飞的时候,说实话没写过这样的代码。(不过必要时一定会用到的)

我前几年用ATmega8+LM35做了个温度计挂家里用,不用说软件抗干扰,连看门狗,BOD都没用,

一样跑了几年了,没死过一次机(停电除外),电源是5V开关电源。

只能说目前没有用武之地啊。


(原文件名:ATmega8测温度-2.JPG)


(原文件名:ATmega8测温度-1.JPG)

出0入0汤圆

发表于 2010-3-26 16:55:23 | 显示全部楼层
扯了这么多的“道理”,自己都没有用过,没有实践过。
你那个小东西说明不了问题:人家说的是51,你用AVR,你也没有使用NOP,能证明NOP有用吗?

出0入0汤圆

发表于 2010-3-26 18:56:30 | 显示全部楼层
我觉得没有讨论下去的必要了。

出0入0汤圆

发表于 2010-3-28 15:00:40 | 显示全部楼层
马老师可能理解错了,对51来说PC收到干扰后PC时任意数,不管PC等于多少,PC指向的数据是指令,到底按3字节指令运行还按1字节或2字节运行,要看PC指向的第一个字节,如果3个NOP连着,这个位置只要被PC命中次位置,那么PC就归位了,最起码会判断第4字节数据了, 下面指令是跳转也好,是调用也好,只要程序编写严密,里面包含参数检查,状态判断等,程序发现运行异常的可能性是很大的

软件抗干扰是可以解决一些问题的,但不是几个NOP就可以解决的

我曾经提过,我可以做一个绝对不死机的小系统,到今天还有人不相信

我讲讲我的方法,给某些人一些启发,我的方法是让单片机不停复位,然后以单片机复位频率做系统事件Tick, 每个Tick单片机干一件事或几件事

单片机上电复位后,单片机再次复位,不管看门狗,外部复位等等,内部RAM内容基本不变,那就把单片机工作步骤和状态保存到RAM,必须加状态校验,最好是CRC,这样能防止单片机收到干扰后发生RAM位翻转,CRC可以发现重要的RAM区有bit干扰了,那就启动默认参数运行

我做的系统一般是单片机1秒中复位4次,最快也不超过10次, 这样的系统需要硬件稍作配合,单片机复位期间,继电器不可以跳变,LCD不可以闪动,LED不可以闪动,蜂鸣器不可以叫等等, 这都可以通过一些电阻电容等处理

根据单片机不同,单片机复位时间不等,有的只需要几个us,有的需要几毫秒,几us的最好用,我们的AVR复位时间是可以调到1ms(上电复位除外),可以将就用

在复位器件单片机不会执行任何代码,所有控制会放开自然状态,这时候要通过硬件保持控制不乱,复位后直接处理控制IO,然后处理Tick事物,处理谁要根据保存到RAM的状态来判断了,处理完后安排下一个Tick的事物,要不直接复位,要不等待复位

复位源,可以是内部看门狗,要不是外部触发器==

以AVR为例,把看门狗调节到250ms左右,硬件打开看门狗,你的软件里不要有任何喂狗程序,那么单片机的复位Tick就是1/4秒了

出0入0汤圆

发表于 2010-3-28 15:09:45 | 显示全部楼层
【28楼】 laoma 我要到日本去放烟火

这方法跟直接用看门狗有差别吗?

我感觉差不多啊

出0入0汤圆

发表于 2010-3-28 15:13:08 | 显示全部楼层
单片机出现异常时的运行时间跟单片机正常运行的时间比是很小很小的,只要异常了,不要乱搞,又可以马上归位,就可以了,我的系统一般1/4秒就可以归位了,控制不会乱,数据不会丢

这种工作方式就是代码效率低,要反复判断理论上不可能出现的状态,然后再决定怎么运行,所以繁琐代码很多, 优点是可靠

我的有些板子,功能简单,代码有发挥余地,结果7805前面和后面没任何电容,基本没电容,板子运行照样正常,有人拿在手上还不信呢,还以为是小儿科设计的,不知道加滤波电容呢

出0入0汤圆

发表于 2010-3-28 15:20:26 | 显示全部楼层
回29楼, 看门狗复位是喂不到狗才复位,单片机收到干扰后死机,不是真的死了,是喂不到狗了

单片机收到干扰,最严重的问题是PC乱了,如果单片机收到干扰PC不乱,但是RAM内部错了一个Bit或某些控制器也翻转了一个bit,这样回导致系统运行有潜在问题

如果单片机复位式工作,你要不停刷新有用到的寄存器和RAM,不停的校验,基本用理会Bit翻转

出0入0汤圆

发表于 2010-3-28 15:22:49 | 显示全部楼层
哈哈,学习学习

我写的程序没有到真正干扰严重的地方跑过,也没机会现在,所以很难测试,以后有条件了一定要试下各种方法。

出0入0汤圆

发表于 2010-3-28 15:40:30 | 显示全部楼层
用煤气灶上的点火器连续的直接的打单片机地线,IO,复位,晶振

单片机不损坏,说明该单片机不错,你的系统被打死了马上回复,说明你做的东西不错,NEC,STC,AVR 很容易被打报废,你可以试试

出0入0汤圆

发表于 2010-3-28 20:06:16 | 显示全部楼层
毁灭性的啊。。。

出0入0汤圆

 楼主| 发表于 2010-4-4 20:53:33 | 显示全部楼层
回复【31楼】laoma 我要到日本去放烟火
-----------------------------------------------------------------------

laoma 我要到日本去放烟火
你做的程序很另类,有没有简单的程序范例,最好有电路图,我想看看,谢谢,需要什么传给我,告诉我,13624327791我的电话

出0入0汤圆

发表于 2010-4-8 01:29:34 | 显示全部楼层
回复【28楼】laoma 我要到日本去放烟火
马老师可能理解错了,对51来说PC收到干扰后PC时任意数,不管PC等于多少,PC指向的数据是指令,到底按3字节指令运行还按1字节或2字节运行,要看PC指向的第一个字节,如果3个NOP连着,这个位置只要被PC命中次位置,那么PC就归位了,最起码会判断第4字节数据了, 下面指令是跳转也好,是调用也好,只要程序编写严密,里面包含参数检查,状态判断等,程序发现运行异常的可能性是很大的
软件抗干扰是可以解决一些问题的,但不是几个NOP就可以解决的
我曾经提过,我可以做一个绝对不死机的小系统,到今天还有人不相信
我讲讲我的方法,给某些人一些启发,我的方法是让单片机不停复位,然后以单片机复位频率做系统事件Tick, 每个Tick单片机干一件事或几件事
单片机上电复位后,单片机再次复位,不管看门狗,外部复位等等,内部RAM内容基本不变,那就把单片机工作步骤和状态保存到RAM,必须加状态校验,最好是......
-----------------------------------------------------------------------

我想我在楼已经回答了这个问题。

关于“NOP”的可能的“抗干扰”作用,我也说了。针对51,我想你也不会承认加3个NOP,让PC归位就能实现“抗干扰”了,“只要程序编写严密,里面包含参数检查,状态判断”,再加上如何加NOP,在那里加NOP,都是想当然,不知道你是否写过这样的系统。

PC跑飞,是最严重的干扰了。一旦出现这样的情况,现在补救的方法就是能回到RESET,然后通过软件措施(比如把工作步骤和状态保存到RAM)设法能继续工作下去。这也就是现在一些新的MCU,增加了有检测是什么情况造成RESET的功能,试图通过芯片本身硬件功能再配合软件实现补救。这个同你后面“不死机”的例子是相同的道理。这显然已经不是加几个NOP的问题了。

注意本贴LZ问的问题,他认为只是加NOP就能抗干扰。而你写的东西,恐怕LZ都不知道你在说什么,更不要说实现了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 13:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表