本帖最后由 动车组 于 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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>