在这里通过一个简单的例子说明:系统复位后创建一个任务TaskStart(),它负责初始化与外部中断相关的寄存器,同时在该任务中建立N个用户任务Task1(), Task2(),...TaskN()和1个用于进入掉电模式的任务Task_Powerdown()。 uc/OS-2开始运行后,Task1()至TaskN()模拟N个实际任务的运行,Task_Powerdown()则负责在N个任务都空闲时将处理器切换进掉电模式。当有外部中断时,则在中断服务程序中将处理器唤醒。要说明的是,Task1()至TaskN()的优先级都必须高于Task_Powerdown()的优先级,且N+1不应大于系统最大任务数。主要代码及注释如下: int main (void) //主函数,系统执行入口 { OSInit(); //初始化uc/OS-2操作系统 OSTaskCreate(TaskStart,(void*)0, &TaskStartStk[TASK_STK_SIZE-1],0); //建立第一个任务,优先级最高为0 OSStart(); //开始运行uc/OS-2 return 0; //其实永远不会返回 } void TaskStart(void *pdata) //创建N个用户任务和1个掉电任务 { pdata = pdata; OSTaskCreate(Task1,(void*)0,&TaskStk1[TASK_STK_SIZE - 1], 1); //创建任务Task1() OSTaskCreate(Task2,(void*)0,&TaskStk2[TASK_STK_SIZE - 1], 2);//创建任务Task2() ... ... OSTaskCreate(TaskN,(void*)0,&TaskStkN[TASK_STK_SIZE - 1], N);//创建任务TaskN() OSTaskCreate(Task_Powerdown,(void*)0, &TaskStk[TASK_STK_SIZE - 1], N+1); //创建掉电任务Task_Powerdown() PCONP = 0x0000;//禁止所有片内外设 ... ... //设置外部中断的相应寄存器 for(;;) { ... ... //任务代码,结束后释放CPU的使用权 } void Task1(void *pdata) //用户任务1 { pdata = pdata; for(;;) { ... ... //任务代码 } } void Task_Powerdown (void *pdata) //MCU掉电任务,等待外部中断唤醒 { pdata = pdata; for(;;) { PCON = 2; //使MCU进入掉电模式 ... ... //外部中断唤醒后,CPU交给用户任务 } } void __irq IRQ_EINT1(void) //外部中断的中断处理程序 { while((EXTINT & 0x02)!=0) //清除中断标志 { EXTINT = 0x02; } VICVectAddr = 0x00; //中断处理结束 } 流程图见图1 图1 掉电模式流程图 结语 本文介绍了在lpc2214微控制器上运行uc/OS-2操作系统实现掉电的方法,简单明了。从中不难看出,这种方法有普遍意义,可以广泛地应用于各种嵌入式系统设计中。
|