微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 利用STC15单片机写的for循环陷入了死循环,不知道为什么

利用STC15单片机写的for循环陷入了死循环,不知道为什么

时间:10-02 整理:3721RD 点击:
用的STC15的片子,在做DP从站,以下代码是检查外部RAM的一段代码,但是不知道为什么会陷入死循环出不来,经仿真变量 i 的值只会增到0x07800左右,在此段for语句之前还有两个类似的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定义为全局变量,在在子程序中如果没有重新定义的话,就是使用的全局变量。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top