第一次使用RTX51TINY,出现单片机自动复位?

2020-01-24 12:01发布

本帖最后由 动车组 于 2014-3-29 10:35 编辑

最近在帮同学做一个毕业设计,用到了keil 自带的RTX51TNY系统,刚开始感觉还不错,一用就上手了,不过现在加的东西越来越多,系统不稳定了,出现了自动复位的情况,昨天找了一天没找问题在哪,请用过的RTX51TINY 的大神指点一二哈! 先说一下我的整个思路,在task0中建立task1和task2,之后三个任务都运行没有删除掉,其中任务1做温度和AD值的采集,任务2做按键扫描和按键处理,任务3做显示,三个任务之间都是用os_switch_task()进行切换的。下面是三个任务的代码:
void Start(void) _task_ 0
{
        idata u8 i=0;
       
        SysInit();
        os_create_task(1);
        os_create_task(2);
//        os_create_task(3);
        while(1)
        {
//                printf(" 0 ");
                if(i++==3)
                {
                        i=0;
                }
//                EA = 0;                      //关中断
                Tempe = Rx_Ds18b20(i+1);  //读取温度
//                EA = 1;                          
                ADCVal = Read_ADC(LAdd); //读取ADC值
                if(i==0)
                {
                        printf(" Tempe[0]=%.1f ",Tempe[0]);
                }
//                TC35();
//                Uart2_Print(" 串口2可以使用了%d ",(u16)temp++);
               
                LED1 =!LED1;
               
                os_switch_task();
               
//                os_wait(K_TMO,5,0);
               
        }
}

void Menu(void) _task_ 1
{
        idata u8 KeyVal=0;
        while(1)
        {
//                BEEP =!BEEP;
//                printf(" 1 ");
                KeyVal = Keyscan();
                if(KeyVal)
                {
//                        printf(" 第%2d个按键按下了 ",(u16)KeyVal);
                        switch (KeyVal)
                        {
                                case 11:
                                        switch (DisMode)
                                        {
                                                case STAND_BY:
                                                        DisMode = SET_NUM;
                                                        LCD12864_Clear();
                                                        LCD_Print(1,3,"设置电话号码");
                                                        LCD_Print(2,1,"原先:%11s",SaveNum); //显示原先的号码
                                                        LCD_Print(3,1,"修改:");
                                                        memset(Num,0,sizeof(Num));          //将现在的
                                                        NumCount = 0;
                                                        break;
                                                case SET_NUM:
                                                        if(NumCount>=11)
                                                        {
                                                                memcpy(SaveNum,Num,sizeof(Num));    //复制电话号码
                                                                if(Write_Eeprom(0,sizeof(Num),SaveNum))//储存电话号码
                                                                {
                                                                        LCD_Print(4,3,"保存号码失败!");     //显示提示信息
                                                                }
                                                                else
                                                                {
                                                                        LCD_Print(4,3,"保存号码成功!");     //显示提示信息
                                                                }
                                                                os_wait(K_TMO,200,0);               
                                                                DisMode = STAND_BY;                 //将模式切换到待机界面
                                                        }
                                                        else
                                                        {
                                                                LCD_Print(3,6,"           ");
                                                                memset(Num,0,sizeof(Num));
                                                                NumCount = 0;
                                                        }
                                                        break;
                                                default:
                                                        break;
                                        }
                                        break;
                                case 12:
                                        DisMode = STAND_BY;
                                        LCD12864_Clear();
                                        break;
                                case 1:
                                case 2:       
                                case 3:
                                case 4:       
                                case 5:
                                case 6:       
                                case 7:
                                case 8:       
                                case 9:
                                case 10:
                                if(DisMode==SET_NUM)
                                {
                                        if(NumCount<11)
                                        {
                                                Num[NumCount++] = (KeyVal%10)+ '0';//取余只是为了把10变成0
                                        }
                                        break;
                                }
                                break;
                                default:
                                        break;
                        }
                       
                }
               
                os_switch_task();
//                os_wait(K_TMO,5,0);
        }
}
void DisPlay(void) _task_ 2
{
        idata u8 i=0;
        while(1)
        {
//                printf(" 2 ");
                switch (DisMode)
                {
                        case STAND_BY:
                                LCD_Print(1,3,"花房监控系统");
                                if(i++ ==3)
                                {
                                        i=0;
                                }
                                        LCD_Print(i+2,1,"T%1d:%4.1f  L%1d:%4d",(u16)i+1,Tempe,(u16)i+1,ADCVal);
                if(i==0)
                {
                        printf(" Tempe[x]=%.1f ",Tempe[0]);
                }
//                                        printf(" T%1d:%4.1f  L%1d:%4d ",(u16)i+1,Tempe,(u16)i+1,ADCVal);
                               
                                break;
                        case SET_NUM:
                                LCD_Print(3,6,"%s",Num);
                                break;
                        default:
                                break;
                }
               
                os_switch_task();
//                os_wait(K_TMO,30,0);

        }
}       
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。