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

maojsh2002 2009-08-26 02:12:06
在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<len;i++)
{
pwrite[i]=p[i];
}
PSCTL &= ~0x01;
FLSCL &= ~0x01;
EA = 1;
SFRPAGE = SFRP_SAVE; // Restore SFRPAGE
}
...全文
38 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
maojsh2002 2009-08-26
  • 打赏
  • 举报
回复
原因找到,unsigned int idata i=0;
如whm938所说,局部变量i无法及时累加,for死循环
谢谢各位
扬州飞翔吧 2009-08-26
  • 打赏
  • 举报
回复
你这个程序主要问题是采用了xdata模式,当编译器采用xdata编译时,对于内存空间比较大的子程序,编译器会采用xdata定义一些局部变量,在这种模式下,你的程序可能会出错,比如for(i=0;i <len;i++)
{
pwrite[i]=p[i];
} 当i为xdata时,程序就死翘翘了。
一般不建议使用xdata模式,当需要使用xdata变量时,强制定义就可以了。
guetcw 2009-08-26
  • 打赏
  • 举报
回复
当然死了,你的FLASH的地址空间不能定义成XDATA
maojsh2002 2009-08-26
  • 打赏
  • 举报
回复
现在一运行下列code,写入数据就死机

small模式下没有问题

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧