搜索
bottom↓
回复: 22

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入296汤圆

发表于 2011-3-7 10:38:33 | 显示全部楼层
查AVR Instruction Set,找到jmp指令……然后自己将
jmp 0x0000 转换成OPCODE,
用这个16bit的OPCODE填充FLASH就可以了

出0入0汤圆

发表于 2011-3-7 10:43:39 | 显示全部楼层
隔几行需放几个NOP指令再放置JMP 0,以防跑飞时指令位置刚好错位

出0入296汤圆

发表于 2011-3-7 11:09:24 | 显示全部楼层
错位是不大可能的……PC指针是16bit对齐的

出0入0汤圆

发表于 2011-3-7 11:28:22 | 显示全部楼层
全部使用空指令覆盖即可。

出0入0汤圆

 楼主| 发表于 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区中未使用的地址呢?
再次非常感谢您!

出0入0汤圆

 楼主| 发表于 2011-3-8 11:00:18 | 显示全部楼层
回复【2楼】tomhe666 天煞孤星
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-3-8 11:08:18 | 显示全部楼层
如果要依赖“软件陷阱”,你的系统可靠性肯定成问题的。这个不是好方法。我从来不使用什么“软件陷阱”。

出0入0汤圆

 楼主| 发表于 2011-3-8 11:09:16 | 显示全部楼层
回复【4楼】517456
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-3-8 11:11:15 | 显示全部楼层
回复【7楼】machao  
如果要依赖“软件陷阱”,你的系统可靠性肯定成问题的。这个不是好方法。我从来不使用什么“软件陷阱”。
-----------------------------------------------------------------------

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

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

出0入0汤圆

发表于 2011-3-8 11:29:56 | 显示全部楼层
“软件陷阱”和“狗”都是补救的方法,只能让程序不“死”,从开始执行。在许多情况下是没有用的。

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

出0入0汤圆

 楼主| 发表于 2011-3-8 11:33:29 | 显示全部楼层
回复【7楼】machao
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-3-8 14:24:12 | 显示全部楼层
当NOP执行到最后一条指令后,一般的程序会跳转到起始位置,也就是软件复位。NOP是不对EEPROM存取的,所以你可以放心。如果你要对EEPROM实行保护,那么本人认为较好的方法就是冗余——存在不同位置然后比较。

出0入0汤圆

 楼主| 发表于 2011-3-8 14:58:35 | 显示全部楼层
回复【12楼】517456
-----------------------------------------------------------------------
非常感谢您!
我在项目中也用到了备份(冗余)。
您的意思是说当程序指针飞到某个NOP上后,然后执行下一个NOP,...直到执行到最后再复位是吗?
多谢!

出0入0汤圆

发表于 2011-3-8 20:37:28 | 显示全部楼层
回复【13楼】liangweichao  
回复【12楼】517456
-----------------------------------------------------------------------
非常感谢您!
我在项目中也用到了备份(冗余)。
您的意思是说当程序指针飞到某个nop上后,然后执行下一个nop,...直到执行到最后再复位是吗?
多谢!
-----------------------------------------------------------------------

直到——地址卷绕。。。

出0入0汤圆

 楼主| 发表于 2011-3-9 00:17:22 | 显示全部楼层
回复【14楼】gale
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-3-9 09:07:47 | 显示全部楼层
学习

出0入0汤圆

 楼主| 发表于 2011-3-9 22:05:16 | 显示全部楼层
回复【14楼】gale
-----------------------------------------------------------------------

敬等赐教!

出0入0汤圆

 楼主| 发表于 2011-3-9 22:06:02 | 显示全部楼层
回复【3楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

敬等赐教!

出0入0汤圆

 楼主| 发表于 2011-3-9 22:34:17 | 显示全部楼层
回复【10楼】machao
-----------------------------------------------------------------------

敬等赐教!

出0入0汤圆

发表于 2011-6-16 22:18:31 | 显示全部楼层
讨论了半天,也没有看到一个较为满意的解决办法。。。其实,这几,我也在想这个问题,51单片机的软件陷阱就比较好搞了,可对AVR,没有参考啊。。

出0入0汤圆

发表于 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.

出0入0汤圆

发表于 2011-6-17 07:20:11 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 18:01

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

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