打印

建议做为2008年1月的专题----软件抗干扰的方法研究

[复制链接]
16238|119
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
emailli|  楼主 | 2007-12-28 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
***************************************************
前言
之前在论坛泡了这么久,总是听说各路高手有一些玄乎奇神的软件抗干扰方法,一直以来苦于没有机会看到。希望通过本月的专题,让大家都能够看到一些高级的方法。

***************************************************
先说说我知道的方法吧
1、看门狗(硬件?软件?)
    我认为看门狗作为最后的无奈之举,是不得以而为之的抗干扰方式。一个系统如果一天到晚复位,应该不能使用的。
2、针对特定的干扰时序,给出特定的抗干扰程序处理(我下文给出的RS485多机通信死机的解决方案就是这样的)。
3、软件陷阱(水平有限,不知道怎么使用,只在书上看到过,也不知道C语言编程的时代是否还用得上)
4、代码冗余(水平有限,不知道具体怎么使用,C语言也不知道如何编程具体实现)
5、……(由于水平有限,本人就不太知道其他的方式了)

*****************************************************
注意:请回复的时候不要太虚,比如
“XXX方法XXX”

*****************************************************
建议采用如下的方式给大家来讲解
1、方法名(开篇立意,开门见山,讲究名正言顺)
2、该方法的应用环境
3、该方法为什么在该环境下能够提高抗干扰
4、该方法的具体实现方式(能够给出源代码更好了)
5、该方法的可行与否的测试方法和测试结论
6、该方法的不足之处

******************************************************
如果其他的同志看到别人给出的方法后,觉得该方法在他给出的应用环境下,考虑的还是不妥当,需要改进,也不要给出太虚的回复。比如:
“这个方法太简单了”
“这个方法我早就用过N年了”
“这个方法也拿出来说?地球人都知道”
等等诸如此类不能解决事情的回复还是少一些为好,希望打造一些精品帖,少一些水贴才好。

*******************************************************
如果发现不妥,建议采用一下方式来回复。
1、该方法在该使用环境下有以下条件考虑不周全!
2、需要增加什么手段可以提高抗干扰!
3、或者是该方法完全不行,需要采用新的方法
4、给出解决方案(源代码或者分析过程)
5、新方法的测试方法和测试结论(有最好)

********************************************************
本人之前针对RS485多机通信下发生随机死机现象做过仔细的分析也研究。
最终通过状态机收发实现了多机通信死机解决方案。
由于原文分析过程太多,我给出了一个压缩包,包括:
-------------------------------------------------
前因:《关于通信程序死机的描叙》
分析:《关于通信程序的死机分析以及处理》
解决:《UART文件夹》内给出的是具体的实现代码。
-------------------------------------------------
请大家移步我的博客下载:
http://blog.21ic.com/user1/3407/archives/2007/41534.html


**********************************************************
最后,希望通过我的 这块 “破瓦”,能够引出各大高手的 “良玉”。
让我们大家都能够见识到各种可操作的,切实可行的,又能够真切用到各自项目中的软件抗干扰方案!

相关帖子

来自 2楼
一朝成名| | 2008-1-2 13:37 | 只看该作者

这个论题不错,俺一个菜鸟的看法

冗余就是NOP。。。。。现在基本用不到了 很多单片机都是单指令的啊

关于陷阱   看有没有必要了,不是特别紧要关头的话有看门狗就可以了

陷阱写不好反把自己陷进去了呵呵。。。。。

软件有很多纠错的方法这点学习下很有益处的,现在还没找到专门次类的书。

三重纠错,一些简单的验证算法 什么的还是常需要用的

RE12楼,写的是:“标准错误”的陷阱写法

关于次方面的内容建议看下周航慈的《单片机程序设计》





使用特权

评论回复
板凳
mapleyang| | 2007-12-28 11:56 | 只看该作者

支持一下

总有不少网友强调软件抗干扰的重要性,一直也没机会看看到底怎么实现的,有用过的给说说吧

使用特权

评论回复
地板
emailli|  楼主 | 2007-12-28 15:19 | 只看该作者

我也是苦于没有看过实际项目怎么使用的啊。

所以希望有高手出招了。

使用特权

评论回复
5
yewuyi| | 2007-12-28 15:38 | 只看该作者

躺椅先舒服一下~~

使用特权

评论回复
6
jack.king| | 2007-12-28 17:45 | 只看该作者

高手们出来啊!我们都在期待啊!

使用特权

评论回复
7
5880527| | 2007-12-28 17:55 | 只看该作者

那个软件陷阱不知道有用没

你想好好的咋一下子掉进去了呢,那么大的一片地它还真能掉进去,奇怪了

使用特权

评论回复
8
yewuyi| | 2007-12-28 19:21 | 只看该作者

补充一点

对于多字节指令的MCU,需要记得其常用的一些跳转指令的机器码,在程序中经常有一些表格文件,这些文件中的数据要注意不要和那几个跳转指令相同,如果相同,尽量给予拆分,例如0X27可拆分为0X25,0X57或者是0X52,0X57等组合做到表格中,对于一些线形修正等表格,一般略微改动参数对修正效果没有太大影响,此时可把值调整为例如0X26或者0X28等避开.

HOTPOWER是这方面的高人,等他上来说道把^^

使用特权

评论回复
9
yewuyi| | 2007-12-28 19:23 | 只看该作者

走错了门,闪人~~

使用特权

评论回复
10
xinchen97| | 2007-12-28 19:39 | 只看该作者

关注这个话题

对于软件防干扰我还真的没有用过。到现在为止我做过的东西还没有出现因为干扰而导致系统程序跑飞的情况。可能是应用环境干扰比较小的缘故。在书上看了关于软件陷阱的介绍不是很理解。在用C写程序的时代我们还能用到软件陷阱这种东西吗??请有经验的朋友介绍一下。最好能有一个实例分析。

使用特权

评论回复
11
emailli|  楼主 | 2007-12-28 20:46 | 只看该作者

搞这方面的专家啊

出手啊。

虽然我知道总结是需要时间的,但是也不要让我们等待太久啊!

默默的等待中………………

使用特权

评论回复
12
救火车| | 2007-12-30 11:19 | 只看该作者

好的,先采纳建议.

使用特权

评论回复
13
jjg| | 2007-12-30 13:12 | 只看该作者

软件陷阱是这样的:

ORG  0000H
LJMP START

START:
     ...
     ...
MAIN:
           ...
           ...

           LJMP    MAIN           ;主程序循环
           NOP                    ;软件陷阱
           NOP
           LJMP    START

使用特权

评论回复
14
dai_weis| | 2007-12-30 14:37 | 只看该作者

占个位置,想好了再说

软件的抗干扰容易和程序的健壮性混淆

我认为软件的抗干扰措施是针对容易因为外部干扰导致数据采集错误的软件滤波措施,剔出错误,或者甄别出错误,保证系统在可靠数据的交换下工作

使用特权

评论回复
15
dld2| | 2007-12-30 14:42 | 只看该作者

关键是抗什么?把干扰模型做出来先

使用特权

评论回复
16
sz_kd| | 2007-12-30 15:58 | 只看该作者

占个位置先

使用特权

评论回复
17
谈的元| | 2007-12-30 21:28 | 只看该作者

呵呵,我来发表一下拙见

软件,很多书都讲了,只是没有扩展来讲。

一般的,写程序的同志把功能完成了。就觉得万事大吉了。

很少考虑软件抗干扰的问题。

设计上,只要添加适当代码,就能解决大部分死机问题。

先明白一个问题:干扰到底干扰到单片机什么东西,那就是寄存器,特别是PC寄存器。

那么在程序中就要时时刷新 寄存器,特别是输出寄存器。

举例:(emc 单片机为例子)
      
      org   0
      mov  a,@25
      mov  0x20,a
      clr  0x21
;;;;;;;;;;;;;;
s1 :  
      inc  0x21
      mov  a,0x20
      sub  a,0x21
      jbs  3,2
      jmp   s11
      jmp   s22;;;

s11:
     jmp   s1


s22:  clr 0x21
      6,2端口取反,输出一个波形
      jmp  s1
;;;;;;;;;;;;;;;;;;;;
该程序就有个问题,干扰后,0x20寄存器如果被干扰变成其他值后,6,2的频率就变了

以下的办法就不会了,但大家都习惯第一种,(称为初始化)
;;;;;;;;;;;;;;;;;;;;;;;
     org   0
     ; mov  a,@25
     ; mov  0x20,a
      clr  0x21
;;;;;;;;;;;;;;
s1 :  
        mov  a,@25
        mov  0x20,a
      inc  0x21
      mov  a,0x20
      sub  a,0x21
      jbs  3,2
      jmp   s11
      jmp   s22;;;

s11:
     jmp   s1


s22:  clr 0x21
      6,2端口取反,输出一个波形
      jmp  s1

虽然很简单,但我就测试到一程序就是按我说的第一种办法写的
      

使用特权

评论回复
18
happystar| | 2007-12-31 11:32 | 只看该作者

re 我一般不刻意的注意这个,都是从软件自身找问题的。

我写程序时对于软件抗干扰都是在程序状态上考虑意外情况的,例如:
if(a == 1){
...
}
else if(a == 2){
.... 
}
else{//这个else 一定得加的,即使自己认为不可能出现的情况也要加上
..//经过好多程序走飞的情况发现:大多情况都是缺少这个语句条件的,这个语句可以写成重新初始化a
}
还有程序出现堆栈比较深的运算(例如浮点乘除法后)或中断比较深,我加2个_nop_();

嘿嘿,这个也许不符合楼主题目要求,也算给楼主的楼加块砖吧

使用特权

评论回复
19
5880527| | 2007-12-31 13:00 | 只看该作者

我没见过跑飞的情况

如果程序真跑飞了,一个错误有时是致命的,想要捉住那非奔的程序,是不是需要满篇的NOP

使用特权

评论回复
20
emailli|  楼主 | 2007-12-31 19:07 | 只看该作者

不明白

16楼说的还是不太明白。

用汇编描叙的有点看不懂。特别是 INC 0X21 一个立即数怎么可以++?

还是我的汇编忘记的差不多了?

17楼的和 switch的 default不能少 基本相同。

增加的只是容错处理。

但是,和以前在一些帖子里面看到的一些说法有出入。

还希望能够继续深入讨论。

谢谢

使用特权

评论回复
21
westsfw| | 2007-12-31 20:33 | 只看该作者

19

应该是你忘了吧呵呵,51立即数用#,EMC用@,不加的话是地址是一个寄存器。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

1172

帖子

55

粉丝