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

[复制链接]
4385|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这个区段了,按理应该这区段都留给了堆栈才是的。
yewuyi 发表于 2010-12-21 13:49 | 显示全部楼层
呵呵,我已经说过了啊,指针不容许直接赋值。

但可以通过指向的办法指向某个确定的地址,呵呵,也许是俺C语言太菜,也许是俺比较保守,俺是最反对这么用的,如果你一定要这么用,具体如何操作,可百度或找C语言高手。
ayb_ice 发表于 2010-12-21 13:49 | 显示全部楼层
在清零RAM前判断复位条件,如果WDT复位就跳过清零程序...
 楼主| fzu_csc 发表于 2010-12-21 13:54 | 显示全部楼层
INT8U idata *bStartDelay _at_ 0xfe;
INT8U idata *bRstDelay _at_ 0xfc;

编译通不过,提示idata space overflow。
new1988 发表于 2010-12-21 18:35 | 显示全部楼层
指针定义赋值应该这样吧?
INT8U idata *bStartDelay;
INT8U idata *bRstDelay;
bStartDelay = (INT8U*)0XFE;
bRstDelay = ( INT8U*)0XFC;
但是在keil里面好像可以直接赋值。
hgjinwei 发表于 2010-12-21 19:54 | 显示全部楼层
看门狗都溢出了,又不见有什么对数据的验证措施,你怎么保证数据是正确的?
hgjinwei 发表于 2010-12-21 19:55 | 显示全部楼层
INT8U *bStartDelay;
INT8U *bRstDelay;
bStartDelay = 0xfe;
bRstDelay   = 0xfc;

你怎么保证编译器不会已经将 0xfe 和 0xfc 两个内存空间分配给其他用途?
 楼主| fzu_csc 发表于 2010-12-21 20:01 | 显示全部楼层
9# hgjinwei
比如数据保护的条件陷阱,比如多个位置存储验证...这是另外一个话题
 楼主| fzu_csc 发表于 2010-12-21 20:02 | 显示全部楼层
10# hgjinwei
这两个地址应该是堆栈区吧
 楼主| fzu_csc 发表于 2010-12-21 20:03 | 显示全部楼层
6# ayb_ice
这是个办法...要改startup.a51
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

142

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部