在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
}
现在一运行下列code,写入数据就死机
small模式下没有问题
当然死了,你的FLASH的地址空间不能定义成XDATA
你这个程序主要问题是采用了xdata模式,当编译器采用xdata编译时,对于内存空间比较大的子程序,编译器会采用xdata定义一些局部变量,在这种模式下,你的程序可能会出错,比如for(i=0;i
{
pwrite=p;
} 当i为xdata时,程序就死翘翘了。
一般不建议使用xdata模式,当需要使用xdata变量时,强制定义就可以了。
原因找到,unsigned int idata i=0;
如whm938所说,局部变量i无法及时累加,for死循环
谢谢各位