ucosII的事件標誌組的使用心得
阿新 • • 發佈:2019-02-12
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);
}