打印

看门狗复位保护数据,关于内存

[复制链接]
3508|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fzu_csc|  楼主 | 2010-12-21 13:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开启看门狗复位,看门狗复位后执行startup.a51,清零idata数据(IDATALEN        EQU     80H);又C51的堆栈是向FF生长的;
为了保护4字节数据,定义
INT8U *bStartDelay;
INT8U *bRstDelay;
bStartDelay = 0xfe;
bRstDelay   = 0xfc;

但是运行结果表明bStartDelay[0],bStartDelay [1],bRstDelay[0],bRstDelay[1]被改写,改成
INT8U bStartDelay[2];
INT8U bRstDelay[2];
由编译器自行分配空间就无问题。

不知原因何在?不会有堆栈溢出的问题,data才占用37.1。

相关帖子

沙发
yewuyi| | 2010-12-21 13:33 | 只看该作者
INT8U *bStartDelay;
INT8U *bRstDelay;
bStartDelay = 0xfe;
bRstDelay   = 0xfc;

请注意:一般不容许直接给指针变量赋值操作,请使用指向这种方式。

使用特权

评论回复
板凳
fzu_csc|  楼主 | 2010-12-21 13:45 | 只看该作者
2# yewuyi
目前我这个需求就需要绝对定位,只能直接指针赋值呀。

使用特权

评论回复
地板
fzu_csc|  楼主 | 2010-12-21 13:47 | 只看该作者
莫非定义其他变量时,编译器把内存分配到0xfc---0xff这个区段了,按理应该这区段都留给了堆栈才是的。

使用特权

评论回复
5
yewuyi| | 2010-12-21 13:49 | 只看该作者
呵呵,我已经说过了啊,指针不容许直接赋值。

但可以通过指向的办法指向某个确定的地址,呵呵,也许是俺C语言太菜,也许是俺比较保守,俺是最反对这么用的,如果你一定要这么用,具体如何操作,可百度或找C语言高手。

使用特权

评论回复
6
ayb_ice| | 2010-12-21 13:49 | 只看该作者
在清零RAM前判断复位条件,如果WDT复位就跳过清零程序...

使用特权

评论回复
7
fzu_csc|  楼主 | 2010-12-21 13:54 | 只看该作者
INT8U idata *bStartDelay _at_ 0xfe;
INT8U idata *bRstDelay _at_ 0xfc;

编译通不过,提示idata space overflow。

使用特权

评论回复
8
new1988| | 2010-12-21 18:35 | 只看该作者
指针定义赋值应该这样吧?
INT8U idata *bStartDelay;
INT8U idata *bRstDelay;
bStartDelay = (INT8U*)0XFE;
bRstDelay = ( INT8U*)0XFC;
但是在keil里面好像可以直接赋值。

使用特权

评论回复
9
hgjinwei| | 2010-12-21 19:54 | 只看该作者
看门狗都溢出了,又不见有什么对数据的验证措施,你怎么保证数据是正确的?

使用特权

评论回复
10
hgjinwei| | 2010-12-21 19:55 | 只看该作者
INT8U *bStartDelay;
INT8U *bRstDelay;
bStartDelay = 0xfe;
bRstDelay   = 0xfc;

你怎么保证编译器不会已经将 0xfe 和 0xfc 两个内存空间分配给其他用途?

使用特权

评论回复
11
fzu_csc|  楼主 | 2010-12-21 20:01 | 只看该作者
9# hgjinwei
比如数据保护的条件陷阱,比如多个位置存储验证...这是另外一个话题

使用特权

评论回复
12
fzu_csc|  楼主 | 2010-12-21 20:02 | 只看该作者
10# hgjinwei
这两个地址应该是堆栈区吧

使用特权

评论回复
13
fzu_csc|  楼主 | 2010-12-21 20:03 | 只看该作者
6# ayb_ice
这是个办法...要改startup.a51

使用特权

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

本版积分规则

22

主题

142

帖子

0

粉丝