liangweichao 发表于 2011-3-7 09:54:45

AVR 最后的一个难题——软件陷阱!

我的思路是这样的:先用C编写一个软件陷阱函数(这个函数的功能就是把PC指针返回指向程序的初始位置,即复位),然后用这个陷阱函数把未用到的程序区(也就是“FF FF FF FF....”)和EEPROM中未使用的空间(也是“FF FF FF FF...”)填满,这样程序“跑飞”到这些区域时就被“捕获”进而复位。主要有两点没有思路:(1)促使程序复位的陷阱函数用C语言怎么写?(2)怎样把这个陷阱函数固定地放到未用到的程序区和EEPROM中未使用的空间?(我用的是ICC和ponyprog)多谢各位!

Gorgon_Meducer 发表于 2011-3-7 10:38:33

查AVR Instruction Set,找到jmp指令……然后自己将
jmp 0x0000 转换成OPCODE,
用这个16bit的OPCODE填充FLASH就可以了

tomhe666 发表于 2011-3-7 10:43:39

隔几行需放几个NOP指令再放置JMP 0,以防跑飞时指令位置刚好错位

Gorgon_Meducer 发表于 2011-3-7 11:09:24

错位是不大可能的……PC指针是16bit对齐的

517456 发表于 2011-3-7 11:28:22

全部使用空指令覆盖即可。

liangweichao 发表于 2011-3-8 10:57:47

回复【1楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
您好!非常感谢您!
我是从C直接转入avr的,现在用的是m8,其中用到其内部eeprom来存储密码,对于汇编又出现以下一些问题:
(1)我查了一下avr指令:“Jump to an address within the entire 4M (words) Program memory”这个4M的M是十的六次方吗?这里只说是在程序存储器内跳转,那在m8的内部eeprom中可以吗?
(2)“JMP k ”
   32-bit Opcode:

      1001      010k       kkkk      110k

      kkkk       kkkk      kkkk      kkkk
这里怎么是32位的操作码啊?那“JMP 0x0000”的操作码该怎样写呢?即直接k换成0x0000吗?请您给举个例子吧!多谢了!
(3)怎样把(2)中的操作码固定地存入程序区和eeprom区中未使用的地址呢?
再次非常感谢您!

liangweichao 发表于 2011-3-8 11:00:18

回复【2楼】tomhe666 天煞孤星
-----------------------------------------------------------------------

谢谢您!您的意思是把程序执行拉向正确轨道,防止操作数与操作码之间的混乱是吗?

machao 发表于 2011-3-8 11:08:18

如果要依赖“软件陷阱”,你的系统可靠性肯定成问题的。这个不是好方法。我从来不使用什么“软件陷阱”。

liangweichao 发表于 2011-3-8 11:09:16

回复【4楼】517456
-----------------------------------------------------------------------

谢谢您!我想再向您请教两个问题:
(1)如果程序指针PC飞到未使用的程序区和eeprom区后,那么程序是按PC++一直往下执行吗?到了结尾它又该指向哪儿呢?
(2)我在eeprom中存的有密码数据,PC指到这里时是否会对密码数据造成破坏?
再次非常感谢您!

gale 发表于 2011-3-8 11:11:15

回复【7楼】machao
如果要依赖“软件陷阱”,你的系统可靠性肯定成问题的。这个不是好方法。我从来不使用什么“软件陷阱”。
-----------------------------------------------------------------------

有的时候靠软件陷阱可以对抗硬干扰。

话说回来,有个产品开发出来,用了2年我有一次维护代码时才发现看门狗根本没打开~ 我认为看门狗之类的措施本不应用于对付软件算法漏洞的,其本意是对抗硬干扰的。

machao 发表于 2011-3-8 11:29:56

“软件陷阱”和“狗”都是补救的方法,只能让程序不“死”,从开始执行。在许多情况下是没有用的。

如果一个设备,工作了一半,那么开机后(不管是断电再次开机,还是干扰掉了),应该从一半的地方开始执行。那么“软件陷阱”和“狗”都做不到。

liangweichao 发表于 2011-3-8 11:33:29

回复【7楼】machao
-----------------------------------------------------------------------

终于得到马潮老师的回复了,甚感荣幸!
做项目吗,所以就想把项目做得尽可能的安全!这个项目用到m8的内部eeprom来存储密码,起初没使用其BOD功能,竟然发现eeprom中的密码数据有丢失的现象,所以对其安全性产生了忧虑!这样才开始对系统的硬件抗干扰和软件抗干扰大动干戈起来!
很想向您请教两个问题:
(1)对于AVR单片机内部eeprom中(密码)数据的丢失现象,您是怎样处理的?
(2)使用软件陷阱会对系统可靠性产生什么样的影响啊?如果想提高一下自己,那么软件陷阱函数用C语言怎样编写啊?并怎样把其存到程序区和eeprom区中未使用的地址中去呢?
再次非常感谢您!

517456 发表于 2011-3-8 14:24:12

当NOP执行到最后一条指令后,一般的程序会跳转到起始位置,也就是软件复位。NOP是不对EEPROM存取的,所以你可以放心。如果你要对EEPROM实行保护,那么本人认为较好的方法就是冗余——存在不同位置然后比较。

liangweichao 发表于 2011-3-8 14:58:35

回复【12楼】517456
-----------------------------------------------------------------------
非常感谢您!
我在项目中也用到了备份(冗余)。
您的意思是说当程序指针飞到某个NOP上后,然后执行下一个NOP,...直到执行到最后再复位是吗?
多谢!

gale 发表于 2011-3-8 20:37:28

回复【13楼】liangweichao
回复【12楼】517456
-----------------------------------------------------------------------
非常感谢您!
我在项目中也用到了备份(冗余)。
您的意思是说当程序指针飞到某个nop上后,然后执行下一个nop,...直到执行到最后再复位是吗?
多谢!
-----------------------------------------------------------------------

直到——地址卷绕。。。

liangweichao 发表于 2011-3-9 00:17:22

回复【14楼】gale
-----------------------------------------------------------------------

非常感谢您!
请问您是怎样用C设置软件陷阱的呢?
多谢多谢!

wpnx 发表于 2011-3-9 09:07:47

学习

liangweichao 发表于 2011-3-9 22:05:16

回复【14楼】gale
-----------------------------------------------------------------------

敬等赐教!

liangweichao 发表于 2011-3-9 22:06:02

回复【3楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

敬等赐教!

liangweichao 发表于 2011-3-9 22:34:17

回复【10楼】machao
-----------------------------------------------------------------------

敬等赐教!

ttseibm 发表于 2011-6-16 22:18:31

讨论了半天,也没有看到一个较为满意的解决办法。。。其实,这几,我也在想这个问题,51单片机的软件陷阱就比较好搞了,可对AVR,没有参考啊。。

millwood0 发表于 2011-6-17 06:33:47

"多谢各位!"

google "high reliability embedded computing". there are well established protocols for such concepts - NXP actually has a library on its website for this and it is very well documented - not ready for immediate implementation but on the right track.

catoc 发表于 2011-6-17 07:20:11

mark
页: [1]
查看完整版本: AVR 最后的一个难题——软件陷阱!