请问高手们我用的是89c51F的单片机现在对用c语言来开发有问题,急等。。。

NIHAOMA   2009-8-26 14:12 楼主
在large : XDATA模式下,如何实现掉电保存,我这样写,现在已写入就死机。
void Write_Flash_address (unsigned char block,unsigned int startaddress,unsigned char *p,unsigned int len)
{
        unsigned int i=0;
        unsigned char SFRP_SAVE = SFRPAGE;           // Save Current SFR page
        pwrite = (unsigned char xdata *)(0x8000 + startaddress);
        EA = 0;
        SFRPAGE = 0x0f;
        CCH0CN &= 0xFE;                //signal Byte writing
        SFRPAGE = 0x00;
        PSBANK = block;                //select block
        PSCTL &= ~0x04;
        FLSCL |= 0x11;
        PSCTL |= 0x01;
        for(i=0;i         {
                pwrite=p;
        }
        PSCTL &= ~0x01;
        FLSCL &= ~0x01;
        EA = 1;
        SFRPAGE = SFRP_SAVE;                // Restore SFRPAGE
}

回复评论 (4)

现在一运行下列code,写入数据就死机

small模式下没有问题
点赞  2009-8-26 14:19
当然死了,你的FLASH的地址空间不能定义成XDATA
点赞  2009-8-26 15:27
你这个程序主要问题是采用了xdata模式,当编译器采用xdata编译时,对于内存空间比较大的子程序,编译器会采用xdata定义一些局部变量,在这种模式下,你的程序可能会出错,比如for(i=0;i {
pwrite=p;
} 当i为xdata时,程序就死翘翘了。
一般不建议使用xdata模式,当需要使用xdata变量时,强制定义就可以了。
点赞  2009-8-26 15:42
原因找到,unsigned int idata i=0;
如whm938所说,局部变量i无法及时累加,for死循环
谢谢各位
点赞  2009-8-26 16:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复