关于ucos的表面理解
/* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #include <includes.h> /* ********************************************************************************************************* * LOCAL DEFINES ********************************************************************************************************* */ CPU_INT08U XC[3840]; //定义LCD显示缓冲区(240*128屏) CPU_INT08U ID=0; //主功能菜单选项ID CPU_INT08U KEY=0; //按键码 CPU_INT08U SET=0;//进入设置菜单标记 CPU_INT08U SET1=0;//进入二级设置菜单标记 CPU_INT08U ID_CD1=0;//主菜单选项ID CPU_INT08U ID_CD2=0;//次级菜单选项ID /* ********************************************************************************************************* * LOCAL GLOBAL VARIABLES ********************************************************************************************************* */ /* ----------------- APPLICATION GLOBALS ------------------ */ static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; //入口线程堆栈 ////////////////////////////////////////////////////////////////////// static OS_STK AppStk1[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk2[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk3[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk4[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk5[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk6[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk7[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk8[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk9[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk10[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk11[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk12[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk13[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk14[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk15[APP_TASK_STK_SIZE]; //工作线程堆栈 static OS_STK AppStk16[APP_TASK_STK_SIZE]; //工作线程堆栈 /////////////////////////////////////////////////////////////////////// /* ********************************************************************************************************* * LOCAL FUNCTION PROTOTYPES ********************************************************************************************************* */ static void AppTaskStart (void *p_arg); //入口线程 //////////////////////////////////////////////////////////////////////// static void AppTask1(void *p_arg); //工作线程函数体 static void AppTask2(void *p_arg); //工作线程函数体 static void AppTask3(void *p_arg); //工作线程函数体 static void AppTask4(void *p_arg); //工作线程函数体 static void AppTask5(void *p_arg); //工作线程函数体 static void AppTask6(void *p_arg); //工作线程函数体 static void AppTask7(void *p_arg); //工作线程函数体 static void AppTask8(void *p_arg); //工作线程函数体 static void AppTask9(void *p_arg); //工作线程函数体 static void AppTask10(void *p_arg); //工作线程函数体 static void AppTask11(void *p_arg); //工作线程函数体 static void AppTask12(void *p_arg); //工作线程函数体 static void AppTask13(void *p_arg); //工作线程函数体 static void AppTask14(void *p_arg); //工作线程函数体 static void AppTask15(void *p_arg); //工作线程函数体 static void AppTask16(void *p_arg); //工作线程函数体 //////////////////////////////////////////////////////////////////////// /* ********************************************************************************************************* * LOCAL CONFIGURATION ERRORS ********************************************************************************************************* */ /* ********************************************************************************************************* * main() * * Description : This is the standard entry point for C code. It is assumed that your code will call * main() once you have performed all necessary initialization. * * Argument(s) : none * * Return(s) : none ********************************************************************************************************* */ int main (void) { BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */ OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel" */ OSTaskCreate (AppTaskStart,(void *)0, (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1],APP_TASK_START_PRIO); OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */ } /* ********************************************************************************************************* * AppTaskStart() * * Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts. * * Argument(s) : p_arg Argument passed to 'AppTaskStart()' by 'OSTaskCreate()'. * * Return(s) : none. * * Note(s) : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not * used. The compiler should not generate any code for this statement. * * (2) Interrupts are enabled once the task starts because the I-bit of the CCR register was * set to 0 by 'OSTaskCreate()'. ********************************************************************************************************* */ static void AppTaskStart (void *p_arg) { (void)p_arg; BSP_Init(); /* Initialize BSP functions */ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //在这里创建工作线程 OSTaskCreate (AppTask1, (void *)0, (OS_STK *)&AppStk1[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_1); //挂起非必要线程 OSTaskCreate (AppTask2, (void *)0, (OS_STK *)&AppStk2[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_2); OSTaskSuspend(APP_TASK_PRIO_2); OSTaskCreate (AppTask3, (void *)0, (OS_STK *)&AppStk3[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_3); OSTaskSuspend(APP_TASK_PRIO_3); OSTaskCreate (AppTask4, (void *)0, (OS_STK *)&AppStk4[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_4); OSTaskSuspend(APP_TASK_PRIO_4); OSTaskCreate (AppTask5, (void *)0, (OS_STK *)&AppStk5[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_5); OSTaskSuspend(APP_TASK_PRIO_5); OSTaskCreate (AppTask6, (void *)0, (OS_STK *)&AppStk6[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_6); OSTaskSuspend(APP_TASK_PRIO_6); OSTaskCreate (AppTask7, (void *)0, (OS_STK *)&AppStk7[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_7); OSTaskSuspend(APP_TASK_PRIO_7); OSTaskCreate (AppTask8, (void *)0, (OS_STK *)&AppStk8[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_8); OSTaskSuspend(APP_TASK_PRIO_8); OSTaskCreate (AppTask9, (void *)0, (OS_STK *)&AppStk9[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_9); OSTaskSuspend(APP_TASK_PRIO_9); OSTaskCreate (AppTask10, (void *)0, (OS_STK *)&AppStk10[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_10); OSTaskSuspend(APP_TASK_PRIO_10); OSTaskCreate (AppTask11, (void *)0, (OS_STK *)&AppStk11[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_11); OSTaskSuspend(APP_TASK_PRIO_11); OSTaskCreate (AppTask12, (void *)0, (OS_STK *)&AppStk12[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_12); OSTaskSuspend(APP_TASK_PRIO_12); OSTaskCreate (AppTask13, (void *)0, (OS_STK *)&AppStk13[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_13); OSTaskSuspend(APP_TASK_PRIO_13); OSTaskCreate (AppTask14, (void *)0, (OS_STK *)&AppStk14[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_14); OSTaskSuspend(APP_TASK_PRIO_14); OSTaskCreate (AppTask15, (void *)0, (OS_STK *)&AppStk15[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_15); OSTaskSuspend(APP_TASK_PRIO_15); OSTaskCreate (AppTask16, (void *)0, (OS_STK *)&AppStk16[APP_TASK_STK_SIZE - 1],APP_TASK_PRIO_16); OSTaskSuspend(APP_TASK_PRIO_16); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// while (DEF_TRUE) { /* Task body, always written as an infinite loop. */ //处理主菜单相关功能 OSTimeDly (10); KEY=getkey(); if(KEY==5) { //响应回主菜单按键 OSTaskSuspend(APP_TASK_PRIO_2); //挂起所有非必要线程 OSTaskSuspend(APP_TASK_PRIO_3); OSTaskSuspend(APP_TASK_PRIO_4); OSTaskSuspend(APP_TASK_PRIO_5); OSTaskSuspend(APP_TASK_PRIO_6); OSTaskSuspend(APP_TASK_PRIO_7); OSTaskSuspend(APP_TASK_PRIO_8); OSTaskSuspend(APP_TASK_PRIO_9); OSTaskSuspend(APP_TASK_PRIO_10); OSTaskSuspend(APP_TASK_PRIO_11); OSTaskSuspend(APP_TASK_PRIO_12); OSTaskSuspend(APP_TASK_PRIO_13); OSTaskSuspend(APP_TASK_PRIO_14); OSTaskSuspend(APP_TASK_PRIO_15); OSTaskSuspend(APP_TASK_PRIO_16); //复位工作线程 SET=0; SET1=0; ID_CD1=0; ID_CD2=0; ID=0;//设置菜单ID号返回主菜单 } if(ID==0) { //进入主菜单 GUI_BJ_zhucaidan(XC); switch(KEY) { case 1: GUI_setID_zhucaidan_U(XC); break; case 2: GUI_setID_zhucaidan_D(XC); break; case 3: GUI_setID_zhucaidan_L(XC); break; case 4: GUI_setID_zhucaidan_R(XC); break; case 6: //确定并进入选定子功能 ID=(GUI_getID_zhucaidan()+1); //根据返回的菜单ID选择激活子功能线程 switch(ID) { case 1: OSTaskResume(APP_TASK_PRIO_2);//激活直流电压表工作线程 break; case 2: OSTaskResume(APP_TASK_PRIO_3);//激活交流电压表工作线程 break; case 3: OSTaskResume(APP_TASK_PRIO_4);//激活直流电流表工作线程 break; case 4: OSTaskResume(APP_TASK_PRIO_5);//激活交流电流表工作线程 break; case 5: OSTaskResume(APP_TASK_PRIO_6);//激活电阻表工作线程 break; case 6: OSTaskResume(APP_TASK_PRIO_7);//激活电容表工作线程 break; case 8: OSTaskResume(APP_TASK_PRIO_9);//激活温度表工作线程 break; case 13: OSTaskResume(APP_TASK_PRIO_14);//激活帮助及说明工作线程 break; default: ID=0;//选择未实现的子功能后直接返回主菜单 } break; default: } } } } /* ********************************************************************************************************* * AppTaskStart1() * * Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts. * * Argument(s) : p_arg Argument passed to 'AppTaskStart()' by 'OSTaskCreate()'. * * Return(s) : none. * * Note(s) : (1) The first line of code is used to prevent a compiler warning because 'p_arg' is not * used. The compiler should not generate any code for this statement. * * (2) Interrupts are enabled once the task starts because the I-bit of the CCR register was * set to 0 by 'OSTaskCreate()'. ********************************************************************************************************* */ static void AppTask1(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //线程1用来做LCD的刷屏工作 OSTimeDly (15); LCD_XC_copy(XC,3840); //刷240*128屏 } } static void AppTask2(void *p_arg) { CPU_INT08U XS=1; //显示单位 CPU_INT08U DW=1; //测量档位 CPU_INT08U ADC_DATA=0; CPU_INT32U DATA=0; //获取到的adc数据 CPU_INT32U DATA_Z=0; //整数部 CPU_INT32U DATA_W=0; //小数部 CPU_INT32U DATA_H=0; //获取到的adc数据 最大值 CPU_INT32U DATA_H_Z=0; //整数部 CPU_INT32U DATA_H_W=0; //小数部 CPU_INT32U DATA_L=8888888; //获取到的adc数据 最小值 CPU_INT32U DATA_L_Z=0; //整数部 CPU_INT32U DATA_L_W=0; //小数部 CPU_INT32U DATA_P=0; //获取到的adc数据 平均值 CPU_INT32U DATA_P_Z=0; //整数部 CPU_INT32U DATA_P_W=0; //小数部 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //直流电压表工作线程 OSTimeDly (3); GUI_BJ_DCV(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ADC_DATA=getADC(); switch(DW) { case 1: DATA=(5000*ADC_DATA)/255; //档位切换换算数据 break; case 2: DATA=(50000*ADC_DATA)/255; //档位切换换算数据 break; case 3: DATA=(500000*ADC_DATA)/255; //档位切换换算数据 break; case 4: DATA=(5000000*ADC_DATA)/255; //档位切换换算数据 break; } if(DATA_H<DATA) DATA_H=DATA; if(DATA_L>DATA) DATA_L=DATA; DATA_P=DATA;//平均值无意义 if(XS==1) { DATA_Z=DATA/1000; DATA_W=(DATA/10)%100; DATA_H_Z=DATA_H/1000; DATA_H_W=(DATA_H/10)%100; DATA_P_Z=DATA_P/1000; DATA_P_W=(DATA_P/10)%100; DATA_L_Z=DATA_L/1000; DATA_L_W=(DATA_L/10)%100; }else if(XS==2) { DATA_Z=DATA; DATA_W=0; DATA_H_Z=DATA_H; DATA_H_W=0; DATA_P_Z=DATA_P; DATA_P_W=0; DATA_L_Z=DATA_L; DATA_L_W=0; } GUI_print_sz_24x30(DATA_Z,DATA_W,XC); //当前值 GUI_print_sz_8x8_1(DATA_H_Z,DATA_H_W,XC); GUI_print_sz_8x8_2(DATA_P_Z,DATA_P_W,XC); GUI_print_sz_8x8_3(DATA_L_Z,DATA_L_W,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,2);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<1) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=1; break; case 1: XS=2; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_DCV(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask3(void *p_arg) { CPU_INT08U XS=1; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //交流电压表工作线程 OSTimeDly (1); GUI_BJ_ACV(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,2);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<1) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=1; break; case 1: XS=2; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_ACV(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask4(void *p_arg) { CPU_INT08U XS=3; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //直流电流表工作线程 OSTimeDly (1); GUI_BJ_DCA(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,3);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<1) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=3; break; case 1: XS=4; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_DCA(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask5(void *p_arg) { CPU_INT08U XS=3; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //交流电流表工作线程 OSTimeDly (1); GUI_BJ_ACA(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,3);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<1) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=3; break; case 1: XS=4; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_ACA(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask6(void *p_arg) { CPU_INT08U XS=5; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //电阻表工作线程 OSTimeDly (1); GUI_BJ_DZ(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,4);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<2) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=5; break; case 1: XS=6; break; case 2: XS=7; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_DZ(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask7(void *p_arg) { CPU_INT08U XS=8; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //电容表工作线程 OSTimeDly (1); GUI_BJ_DR(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,5);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<2) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=9; break; case 1: XS=10; break; case 2: XS=8; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_DR(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask8(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask9(void *p_arg) { CPU_INT08U XS=11; //显示单位 CPU_INT08U DW=1; //测量档位 (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //温度电流表工作线程 OSTimeDly (1); GUI_BJ_WD(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); KEY=getkey(); if(KEY==6) { SET=1; //是否进入设置菜单 } while(SET) { GUI_CD_1(XC,1);//显示二级菜单 GUI_set_CD_1(ID_CD1,XC);//设置主菜单 if(SET1==1) { if(ID_CD1==0){ GUI_CD_2(XC,1);//档位选择二级菜单 }else if(ID_CD1==1){ GUI_CD_2(XC,6);//单位选择二级菜单 } GUI_set_CD_2(ID_CD2,XC);//设置二级菜单 } OSTimeDly (1); KEY=getkey(); switch(KEY) { case 1: //按键上 if(SET1==0) { if(ID_CD1>0) ID_CD1--; }else { if(ID_CD2>0) ID_CD2--; } break; case 2: //按键下 if(SET1==0) { if(ID_CD1<2) ID_CD1++; }else { if(ID_CD1==0) { if(ID_CD2<3) ID_CD2++; }else if(ID_CD1==1) { if(ID_CD2<1) ID_CD2++; } } break; case 6: //按键确定 if(SET1==0) { if(ID_CD1==2) SET=0;//返回功能界面 if(ID_CD1==1||ID_CD1==0) SET1=1; }else{ //设置各个参数 if(ID_CD1==0) { //设置测量档位 switch(ID_CD2) { case 0: DW=1; break; case 1: DW=2; break; case 2: DW=3; break; case 3: DW=4; break; } }else if(ID_CD1==1) { //设置显示单位 switch(ID_CD2) { case 0: XS=11; break; case 1: XS=12; break; } } ////////////////////// //回前一菜单并刷新屏幕 SET1=0; ID_CD2=0; GUI_BJ_WD(XC); GUI_TB_DW(DW,XC); GUI_TB_XS(XS,XC); ////////////////////// } break; } } } } static void AppTask10(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask11(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask12(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask13(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask14(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { //帮助及说明 OSTimeDly (20); GUI_BJ_HELP(XC); } } static void AppTask15(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } static void AppTask16(void *p_arg) { (void)p_arg; while (DEF_TRUE) /* Task body, always written as an infinite loop. */ { OSTimeDly (20); } } /* ********************************************************************************************************* ********************************************************************************************************* ** uC/OS-II APP HOOKS 用户钩子 ********************************************************************************************************* ********************************************************************************************************* */ #if (OS_APP_HOOKS_EN > 0) /* ********************************************************************************************************* * TASK CREATION HOOK (APPLICATION) * * Description : This function is called when a task is created. * * Argument(s) : ptcb is a pointer to the task control block of the task being created. * * Note(s) : (1) Interrupts are disabled during this call. ********************************************************************************************************* */ void App_TaskCreateHook (OS_TCB *ptcb) { } /* ********************************************************************************************************* * TASK DELETION HOOK (APPLICATION) * * Description : This function is called when a task is deleted. * * Argument(s) : ptcb is a pointer to the task control block of the task being deleted. * * Note(s) : (1) Interrupts are disabled during this call. ********************************************************************************************************* */ void App_TaskDelHook (OS_TCB *ptcb) { (void)ptcb; } /* ********************************************************************************************************* * IDLE TASK HOOK (APPLICATION) * * Description : This function is called by OSTaskIdleHook(), which is called by the idle task. This hook * has been added to allow you to do such things as STOP the CPU to conserve power. * * Argument(s) : none. * * Note(s) : (1) Interrupts are enabled during this call. ********************************************************************************************************* */ #if OS_VERSION >= 251 void App_TaskIdleHook (void) { } #endif /* ********************************************************************************************************* * STATISTIC TASK HOOK (APPLICATION) * * Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's * statistics task. This allows your application to add functionality to the statistics task. * * Argument(s) : none. ********************************************************************************************************* */ void App_TaskStatHook (void) { } /* ********************************************************************************************************* * TASK SWITCH HOOK (APPLICATION) * * Description : This function is called when a task switch is performed. This allows you to perform other * operations during a context switch. * * Argument(s) : none. * * Note(s) : (1) Interrupts are disabled during this call. * * (2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that * will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the * task being switched out (i.e. the preempted task). ********************************************************************************************************* */ #if OS_TASK_SW_HOOK_EN > 0 void App_TaskSwHook (void) { } #endif /* ********************************************************************************************************* * OS_TCBInit() HOOK (APPLICATION) * * Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting * up most of the TCB. * * Argument(s) : ptcb is a pointer to the TCB of the task being created. * * Note(s) : (1) Interrupts may or may not be ENABLED during this call. ********************************************************************************************************* */ #if OS_VERSION >= 204 void App_TCBInitHook (OS_TCB *ptcb) { (void)ptcb; } #endif /* ********************************************************************************************************* * TICK HOOK (APPLICATION) * * Description : This function is called every tick. * * Argument(s) : none. * * Note(s) : (1) Interrupts may or may not be ENABLED during this call. ********************************************************************************************************* */ #if OS_TIME_TICK_HOOK_EN > 0 void App_TimeTickHook (void) { } #endif #endif
初始化任务栈大小;
ucos初始化
创建任务:
任务名字 大小 优先级
任务里都是死循环
根据任务切换函数,根据优先级,根据任务状态进行任务切换。
osstart();
在使用tick中断时,将timer_isr放入os_cpu.c中。
注意: 转自其它的地方
浙公网安备 33010602011771号