原创 转帖:单片机编程经验

2009-10-12 16:51 1820 1 1 分类: MCU/ 嵌入式

经验之一:用“软件陷阱+程序口令”对付PC指针的弹飞<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去。其实,如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段即可。但是,如果PC指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:


1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。


2、设立一个模块(子程序)ID寄存器。


3、为每个子程序配置一个唯一的ID号码。


4、每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入 ID寄存器。


5、返回到上级程序后,先判断ID寄存器中的ID号。如果正确,则继续执行;如果不正确,则表示PC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。


这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(ID)号验明正身后再放行。再配合软件陷阱,基本上可以将大多数PC指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。


经验之二、不要轻信软件狗


关于软件狗的讨论,论坛上多矣。匠人也曾经查阅过许多关于软件狗的文章。有些大师确实提出了一些比较有技巧性的方法。但是,匠人的忠告是:不要轻信软件狗!其实,软件狗相当于软件的一种自律行为。一般的思路都是通过设立一个计数器,在计时中断中对其+1,在主程序的适当地方对其清零。如果程序失控了,清零指令未被执行,但中断照常发生,则计数器溢出(狗狗叫了)。但是这里有个问题:万一干扰导致中断被屏蔽了,那软件狗就永远不会叫了!——针对这种可能,有人提出在主程序中反复刷新中断使能标志,保证不让中断被屏蔽。——但万一程序飞到某个死循环中去了,不再执行“刷新中断使能标志”这一功能了,还是有可能把狗狗活活饿死。所以,匠人的观点是:看门狗必须拥有独立的计数器(即硬件看门狗)。好在现在好多芯片都提供了内部WDT。这种狗都是自带计数器的。即使干扰导致程序失控,WDT还是会照常计数直到溢出。当然,匠人也没有要将软件狗一棍子全部打死的意思。毕竟不管是软狗还是硬狗,逮到耗子就是好狗嘛(狗拿耗子——多管闲事?)。如果哪位训狗专家确实养过一条能看门的好软件狗,请牵出来让大伙瞧瞧。


经验之三、话说RAM冗余技术


所谓的RAM冗余,就是:


1、将重要的数据信息备份2份(或以上)并存放在RAM中不同的区域(指地址不相连)。


2、当平时对这些数据进行修改时,同时也更新备份。


3、当干扰发生并被拦截到“程序错误处理段”中时,将数据与备份做比较,采用表决方式(少数服从多数)选出正确(或可能正确?)的那个。


4、备份越多,效果越好。(当然,你得有足够的存储空间)。


5、只备份最最原始的数据。中间变量(指那些可以从原始数据重新推导出来的数据)不必备份。


注:


1、这种思路的理论依据,据说是源于一种“概率论”,即一个人被老婆打肿脸的概率是很大的,但如果他捂着脸去上班却发现全公司每个已婚男人的脸都青了,这种概率是很小的。同理,一个RAM寄存器数据被冲毁的概率是很大的,但地址不相连的多个RAM同时被冲毁的概率是很小的。


2、前两年,小匠学徒时,用过一次这种方法,但效果不太理想。当时感觉可能是概率论在我这失效了?现在回想起来,可能是备份的时机选的不好。结果将已经冲毁的数据又备份进去了。这样以来,恢复出来的数据自然也就不对了。


经验之四、话说指令冗余技术


前面有个朋友问到指令冗余,按匠人的理解,指令冗余,就是动作冗余。举个例子,你要在某个输出口上输出一个高电平去驱动一个外部器件,你如果只送一次“<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1,那么,当干扰来临时,这个“1就有可能变成“0了。正确的处理方式是,你定期刷新这个“1。那么,即使偶然受了干扰,它也能恢复回来。除了I/O口动作的冗余,匠人强烈建议大家在下面各方面也采用这种方法:


1LCD的显示。有时,也许你会用一些LCD的专用驱动芯片(如HT1621),这种芯片有个好处,即你只要将显示数据传送给它,它就会不断的自动扫描LCD。但是,你千万不要以为这样就没你啥事了。正确的处理方式是,要记得定期刷新送显数据(即使显示内容没有改变)。对于CPU中自带LCD DRIVER 的,也要定期刷新LCD RAM


2、中断使能标志的设置。不要以为你在程序初始化段将中断设置好就OK了。应该在主程序中适当的地方定期刷新一下,以免你的中断被挂起来。


3、其它一些标志字和参数寄存器(包括你自己定义的),也要记得常常刷新。


4、其它一些你认为有必要反复刷新的地方。


经验之五、10种软件滤波方法


下面奉献——匠人呕心沥血搜肠刮肚冥思苦想东拼西凑整理出来的10种软件滤波方法:


1、限幅滤波法(又称程序判断滤波法)


A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效。如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 


B、优点:能有效克服因偶然因素引起的脉冲干扰。


C、缺点:无法抑制那种周期性的干扰,平滑度差。


2、中位值滤波法  


A、方法:连续采样N(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。


B、优点:能有效克服因偶然因素引起的波动干扰,对变化缓慢的被测参数有良好的滤波效果。


C、缺点:对流量、速度等快速变化的参数不宜。


3、算术平均滤波法  


A、方法:连续取N个采样值进行算术平均运算。N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般流量,N=12;压力:N=4 


B、优点:适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。


C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM


4、递推平均滤波法(又称滑动平均滤波法)  


A、方法:把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 


B、优点:对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统.


C、缺点:灵敏度低 ,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM .


5、中位值平均滤波法(又称防脉冲干扰平均滤波法)


A、方法:相当于“中位值滤波法”+“算术平均滤波法”。连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。N值的选取:3~14


B、优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。


C、缺点:测量速度较慢,和算术平均滤波法一样,比较浪费RAM


6、限幅平均滤波法 


A、方法:相当于“限幅滤波法”+“递推平均滤波法”,每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理 


B、优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。


C、缺点:比较浪费RAM


7、一阶滞后滤波法  


A、方法:取a=0~1,本次滤波结果=1-a*本次采样值+a*上次滤波结果。 


B、优点:对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。


C、缺点: 相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。


8、加权递推平均滤波法 


A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是,越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。


B、优点:适用于有较大纯滞后时间常数的对象和采样周期较短的系统。


C、缺点:对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号不能迅速反应系统当前所受干扰的严重程度,滤波效果差。


9、消抖滤波法 


A、方法:设置一个滤波计数器将每次采样值与当前有效值比较:如果采样值=当前有效值,则计数器清零;如果采样值“<”或“>”当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器  


B、优点:对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。


C、缺点:对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。


10、限幅消抖滤波法 


A、方法:相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖。


B、优点: 继承了“限幅”和“消抖”的优点改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。


C、缺点:对于快速变化的参数不宜。


11IIR 数字滤波器


A、方法:确定信号带宽, 滤之。   Y(n) = a1*Y(n-1) + a2*Y(n-2) + . + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + . + bk*X(n-k)


B、优点:高通,低通,带通,带阻任意。设计简单(matlab)


C、缺点:运算量大。

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
gujunyi1_407560534 2011-03-22 16:43
NP0,X5R,X7R,Y5V释义及其用途
这个是按美国电工协会(EIA)标准,根据不同介质材料而分类。这类参数描述了电容采用的电介质材料类别,温度特性以及误差等参数,不同的值也对应着一定的电容容量的范围。具体来说,就是:X7R常用于容量为33...
gujunyi1_407560534 2011-03-22 16:29
转贴:电容的选型
从电子产品的设计到采购来看,无源元件只是一个配角,其在整个电子产品中所占的物料成本仅约一成,但电子产品中的无源元件数量却是最多的。以电容为例,从2G发展到3G,仅一部手机中的MLCC数量就从平均165...
gujunyi1_407560534 2011-01-28 12:34
手把手将你用PADS Layout 2007.2生成Gerber文件
        本文主要讲述如何利用PADS 2007.2 Layout生成Gerber文件,由于内容较多,所以不再一一列出,这里仅贴出里面第一页的内容,总共14页。需要的博友们可以下载后观看,如有问...
gujunyi1_407560534 2011-01-12 16:10
DxDesigner的两个使用技巧-你一定用得着,而且很有帮助
...
gujunyi1_407560534 2010-11-22 13:47
VCC、VDD、VEE、VSS释疑汇总
在电子电路中,常可以看到VCC、VDD和VSS三种不同的符号,它们有什么区别呢?1、解释VCC:C=Circuit 表示电路的意思,即接入电路的电压;VDD:D=Device 表示器件的意思,即器件内...
gujunyi1_407560534 2010-11-17 12:23
晶体振荡器专题介绍
1、晶振的作用       晶振是晶体振荡器的简称,分为有源晶振和无源晶振两种,有源晶振无需外接匹配电容,只要加电即可输出一定频率的周期波形,所以有源晶振一般是四个引脚;无源晶振严格来说不能叫晶振,只...
我要评论
0
1
广告
关闭 热点推荐上一条 /1 下一条