1. 程式人生 > >ucosII的事件標誌組的使用心得

ucosII的事件標誌組的使用心得

UCOSII的FLAG使用類似於RTTHREAD的事件,我沒仔細的研究過ucosII的手冊,感覺RTTHREAD的事件更好用些,功能上應該是ucos跟強大 以下為例子: OS_TMR *MyTimer; OS_FLAG_GRP *MyGflag; void mytime_callback(OS_TMR *p_tmr,void *p_arg); int main(void) { uint8_t err; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); OSInit(); MyGflag = OSFlagCreate(0, &err); //MyTimer = OSTmrCreate(10,0,OS_TMR_OPT_ONE_SHOT,(OS_TMR_CALLBACK)mytime_callback,(void *)0,(INT8U *)"MyTimer",&err); OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); OSStart(); } void start_task(void *pdata) { uint8_t err; OS_FLAGS flags; OS_CPU_SR cpu_sr=0; pdata=pdata; //OSStatInit(); printf("task start...\r\n"); //OS_ENTER_CRITICAL(); OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTimeDlyHMSM(0,0,1,0); OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); //OSTmrStart(MyTimer,&err); OSTimeDlyHMSM(0,0,0,100); //OSTmrStop(MyTimer,OS_TMR_OPT_CALLBACK,0,&err); //OSTaskSuspend(START_TASK_PRIO); //OS_EXIT_CRITICAL(); while(1) { //第二個引數可以把所有需要的可能事件都加上,OS_FLAG_CONSUME是把發生的事件標識清除,以免一直迴圈跑這個事件 //返回的flag就是發生的事件標識,可以根據它來判斷髮生哪個事件,然後進行相應的處理,這樣下來才跟RTTHREAD的事件用法類似 flags = OSFlagPend(MyGflag,(OS_FLAGS)7,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,0,&err); if(flags == 1) printf("flag1\r\n"); if(flags == 2) printf("flag2\r\n"); if(flags == 4) printf("flag4\r\n"); } } void led0_task(void *pdata) { uint8_t err; while(1) { LED0=0; OSTimeDlyHMSM(0,0,1,0); LED0=1; OSTimeDlyHMSM(0,0,1,0); OSFlagPost(MyGflag,(OS_FLAGS)1,OS_FLAG_SET,&err); OSFlagPost(MyGflag,(OS_FLAGS)2,OS_FLAG_SET,&err); } } void led1_task(void *pdata) { uint8_t err; while(1) { LED1=0; OSTimeDlyHMSM(0,0,1,0); LED1=1; OSTimeDlyHMSM(0,0,1,0); OSFlagPost(MyGflag,(OS_FLAGS)4,OS_FLAG_SET,&err); //printf("hello\r\n"); } } void mytime_callback(OS_TMR *p_tmr,void *p_arg) { uint8_t err; printf("mytimer:%d\r\n",OSTimeGet());
//OSTmrStart(MyTimer,&err); }