搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2014-3-29 10:29:19 | 显示全部楼层 |阅读模式
本帖最后由 动车组 于 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[0]=%.1f\r\n",Tempe[0]);
                }
//                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[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("\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.1f  L%1d:%4d",(u16)i+1,Tempe,(u16)i+1,ADCVal);
                if(i==0)
                {
                        printf("\r\nTempe[x]=%.1f\r\n",Tempe[0]);
                }
//                                        printf("\n\rT%1d:%4.1f  L%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);

        }
}       

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2014-3-29 10:40:29 | 显示全部楼层
还有一个问题,任务切换是怎么进行的,比如我的任务0运行到os_switch_task();进行任务切换,那么任务1和任务2都是就绪的那他是运行哪个,(我的配置里面没有使用使用时间片)

出0入0汤圆

发表于 2014-3-29 11:33:50 | 显示全部楼层
ram不够用,堆栈溢出了吧

出0入0汤圆

 楼主| 发表于 2014-3-29 11:40:38 | 显示全部楼层
smartmeter 发表于 2014-3-29 11:33
ram不够用,堆栈溢出了吧

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-3-29 11:47:49 | 显示全部楼层
看来楼上的还没有搞明白keil c51内存是怎么计算的

出0入0汤圆

 楼主| 发表于 2014-3-29 12:44:37 | 显示全部楼层
smartmeter 发表于 2014-3-29 11:47
看来楼上的还没有搞明白keil c51内存是怎么计算的

还真的不是很清楚是怎么计算的,请教一下。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表