|
发表于 2007-6-27 20:11:15
|
显示全部楼层
但两个设置任务不可能同时出现,一定是退出其中一个才可能会进入另一个。
那就合成一个任务。
这是我写的一个基于AVRX电子菜单的实验,
(单端ADC转换,双端ADC转换,频率计,PWM,歌曲演奏)还没有完全完成。
共5个任务。硬件是马老师AVR实验板,LCD是OCMJ122X32。
1.KEY 键盘扫描任务
2.COMMAND 根据系统状态和按键控制整个系统
3.LCD_SHOW 周期显示LCD_BUF内容
4.TASK_SHOW 根据系统状态把显示内容放到LCD_BUF
5.TASK_EXE 根据系统状态执行各功能模块
因为我的程序里各功能模块(单端ADC转换,双端ADC转换,频率计,PWM,歌曲演奏)不会并行执行,所以用一个任务实现。
学AVR才两个月,也没有实际项目经验,难免有错误的地方,还请高手指点。
系统控制任务
typedef void(*Command_t)(uint8_t);
AVRX_GCC_TASKDEF(COMMAND,60,1)
{
uint8 key;
Command_t cmd;
while(1)
{
GET_KEY(key);
switch(STATE)
{
case 0:
cmd=MainMenuCommand;
break;
case 1:
cmd=ADCCommand;
break;
case 2:
cmd=CapCommand;
break;
case 3:
cmd=PWMCommand;
break;
case 4:
cmd=ADC2Command;
break;
default:
cmd=MainCommand;
break;
}
cmd(key);//cmd指向的函数是非阻塞函数
}
}
系统显示任务
typedef void (*Show_t)(void);
AVRX_GCC_TASKDEF(TASK_SHOW,120,5)
{
Show_t show;
while(1)
{
switch(STATE)
{
case 0:
show=MainMenuShow;
break;
case 1:
show=ADCShow;
break;
case 2:
show=CapShow;
break;
case 3:
show=PWMShow;
break;
case 4:
show=ADC2Show;
break;
default:
show=MainMenuShow;
break;
}
show(); //show指向的函数是非阻塞函数
AvrXDelay(&TASKSHOW_TIMER,OS_TICKS_PER_SEC/10);
}
}
系统执行任务
void QUIT(void)
{
AvrXTaskExit();
}
typedef void (*Task_t)(void);
AVRX_GCC_TASKDEF(TASK_EXE,120,4)
{
Task_t taskexe;
switch(STATE)
{
case 0:
taskexe=QUIT;
break;
case 1:
taskexe=adc;
break;
case 2:
taskexe=capture;
break;
case 3:
taskexe=pwm;
break;
case 4:
taskexe=adc2;
break;
default:
taskexe=QUIT;
break;
}
taskexe(); //taskexe指向的函数是一个死循环或者是删除自己
while(1);//while(1)防止编译器警告
} |
|