利用STC15单片机写的for循环陷入了死循环,不知道为什么
unsigned int i;
unsigned int j;
for(i=0x0000;i<0x0f00;)
{
if(*((UWORD xdata*)i)!=j)
{
error = DP_SRAM_ERROR; // ERROR
}
i+=0x0002;
j++;
}
吧你编译后的map文件传上来吧
编译后没有map格式的文件,在一下for语句中间有一个flashing程序,是控制led灯闪烁的,里面有他自己的局部变量,刚才经过调试发现里面的局部变量经过运行后竟然可以更改for语句中的 i 和 j 的值,是在弄不懂为什么,从来没有碰到过这样的情况,有没有编译器设置什么的是控制函数调用层数的?
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
*((UWORD xdata*)i)=j;
j++;
}
flashing();
// C501 Watchdog
// TOGGLE_WATCHDOG__();
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
if(*((UWORD xdata*)i)!=j)
{
error = DP_SRAM_ERROR; // ERROR
}
j++;
}
flashing();
// C501 Watchdog
// TOGGLE_WATCHDOG__();
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
*((UWORD xdata*)i)=j;
}
flashing();
你应该注意全局变量与局部变量的定义
把你的代码打包发来吧,帮你看一下(先编译一次,连编译产生的文件一道发);
你也可以调试的时候打开汇编窗口看一下,i 分配的是在什么空间,如果分配在外部存储空间,那么这就是问题所在;
也有可能你有中断程序修改了 i ,
为什么分配在外部存储空间就不行呢,编译器选项我选的large模式,dp从站需要用好多变量一定要用片上拓展RAM的!
C语言里面不是局部变量自动屏蔽局部变量吗?
如果i的值指向它自己呢?你对i做增量和指针操作会是啥情况?
叫你传工程上来帮你看,你又不肯,唉
不是我不肯,是我在帮别人做项目,实在是不能传太多的源代码,真实有劳各位了!
/*---------------------------------------------------------------------------*/
/* check external ram 片上的xdata RAM */
/*---------------------------------------------------------------------------*/
DP_ERROR_CODE check_external_ram(void) //已经修改过
{
register DP_ERROR_CODE error;
#ifdef _KEIL_C51
register int i; //这种定义会陷入死循环,可能是位数不够大
register int j;
//UWORD i;
//UWORD j;
#endif //#ifdef _KEIL_C51
// flashing();
error = DP_OK;
#ifdef _KEIL_C51
// C501 Watchdog
// TOGGLE_WATCHDOG__();
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
*((UWORD xdata*)i)=j;
j++;
}
// flashing();
// C501 Watchdog
// TOGGLE_WATCHDOG__();
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
if(*((UWORD xdata*)i)!=j)
{
error = DP_SRAM_ERROR; // ERROR
}
j++;
}
// flashing();
// C501 Watchdog
// TOGGLE_WATCHDOG__();
j = 0;
for(i=0x0000;i<0x0f00;i+=2)
{
*((UWORD xdata*)i)=j;
}
// flashing();
// C501 Watchdog
// TOGGLE_WATCHDOG__();
#endif //#ifdef _KEIL_C51
return error;
}//DP_ERROR_CODE check_sram(void)
void delay( void )
{
UBYTE icount,jcount;
for(icount = 0; icount < 255; icount++)
{
for(jcount = 0; jcount < 255; jcount++);
}
}
void flashing()
{
UBYTE i;
fault_led=0;
for(i=0;i<20;i++)
delay();
fault_led=1;
for(i=0;i<20;i++)
delay();
}
我的理解是:你将i,j定义为全局变量,在在子程序中如果没有重新定义的话,就是使用的全局变量。
