动车组 发表于 2014-3-29 10:29:19

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

本帖最后由 动车组 于 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("\r\n0\r\n");
                if(i++==3)
                {
                        i=0;
                }
//                EA = 0;                      //关中断
                Tempe = Rx_Ds18b20(i+1);//读取温度
//                EA = 1;                        
                ADCVal = Read_ADC(LAdd); //读取ADC值
                if(i==0)
                {
                        printf("\r\nTempe=%.1f\r\n",Tempe);
                }
//                TC35();
//                Uart2_Print("\n\r串口2可以使用了%d\n\r",(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("\r\n1\r\n");
                KeyVal = Keyscan();
                if(KeyVal)
                {
//                        printf("\n\r第%2d个按键按下了\n\r",(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 = (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("\r\n2\r\n");
                switch (DisMode)
                {
                        case STAND_BY:
                                LCD_Print(1,3,"花房监控系统");
                                if(i++ ==3)
                                {
                                        i=0;
                                }
                                        LCD_Print(i+2,1,"T%1d:%4.1fL%1d:%4d",(u16)i+1,Tempe,(u16)i+1,ADCVal);
                if(i==0)
                {
                        printf("\r\nTempe=%.1f\r\n",Tempe);
                }
//                                        printf("\n\rT%1d:%4.1fL%1d:%4d\n\r",(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);

        }
}       

动车组 发表于 2014-3-29 10:40:29

还有一个问题,任务切换是怎么进行的,比如我的任务0运行到os_switch_task();进行任务切换,那么任务1和任务2都是就绪的那他是运行哪个,(我的配置里面没有使用使用时间片)

smartmeter 发表于 2014-3-29 11:33:50

ram不够用,堆栈溢出了吧

动车组 发表于 2014-3-29 11:40:38

smartmeter 发表于 2014-3-29 11:33
ram不够用,堆栈溢出了吧

内部Idata 的数据有256字节啊。。。应该没有那么快就溢出了吧

如果真的溢出了,这个要怎么查!

smartmeter 发表于 2014-3-29 11:47:49

看来楼上的还没有搞明白keil c51内存是怎么计算的

动车组 发表于 2014-3-29 12:44:37

smartmeter 发表于 2014-3-29 11:47
看来楼上的还没有搞明白keil c51内存是怎么计算的

还真的不是很清楚是怎么计算的,请教一下。。。
页: [1]
查看完整版本: 第一次使用RTX51TINY,出现单片机自动复位?