第一次使用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);
}
} 还有一个问题,任务切换是怎么进行的,比如我的任务0运行到os_switch_task();进行任务切换,那么任务1和任务2都是就绪的那他是运行哪个,(我的配置里面没有使用使用时间片) ram不够用,堆栈溢出了吧 smartmeter 发表于 2014-3-29 11:33
ram不够用,堆栈溢出了吧
内部Idata 的数据有256字节啊。。。应该没有那么快就溢出了吧
如果真的溢出了,这个要怎么查! 看来楼上的还没有搞明白keil c51内存是怎么计算的 smartmeter 发表于 2014-3-29 11:47
看来楼上的还没有搞明白keil c51内存是怎么计算的
还真的不是很清楚是怎么计算的,请教一下。。。
页:
[1]