- #include "includes.h"
 - #include <stm32f10x.h>
 - #include "led.h"
 - #include "key.h"
 - #include "usart.h"
 
- static OS_STK Start_Task_Stk[START_TASK_STK_SIZE];
 - static OS_STK Disp_Task_Stk[DISP_TASK_STK_SIZE];
 - static OS_STK LED1_Task_Stk[LED1_TASK_STK_SIZE];
 - static OS_STK Key_Task_Stk[KEY_TASK_STK_SIZE];
 
- static void Target_Init(void);
 - static void Start_Task(void *p_arg);
 - static void Disp_Task(void *p_arg);
 - static void LED1_Task(void *p_arg);
 - static void Key_Task(void *p_arg);
 
- OS_FLAG_GRP *My_FlagGroup;
 
- int main(void)
 - {
 -         Target_Init();        
 -         printf(" ucos已经启动\n");
 -    
 -     OSInit();                
 -         
 -     OSTaskCreate(Start_Task,
 -                      (void *)0,
 -                      &Start_Task_Stk[START_TASK_STK_SIZE-1],
 -                      START_TASK_PRIO);
 -         
 -     OSStart();        
 -         return 0;
 - }
 
- static void Start_Task(void *p_arg)
 - {
 -         INT8U err;
 -         OS_CPU_SysTickInit();        
 -         printf("Start_Task任务已经启动\n");
 -         
 -         My_FlagGroup=OSFlagCreate(0,&err);
 -         
 -         OSTaskCreate(LED1_Task,
 -                      (void *)0,
 -                      &LED1_Task_Stk[LED1_TASK_STK_SIZE-1],
 -                      LED1_TASK_PRIO);
 -         OSTaskCreate(Key_Task,
 -                      (void *)0,
 -                      &Key_Task_Stk[KEY_TASK_STK_SIZE],
 -                      KEY_TASK_PRIO);
 -         OSTaskCreate(Disp_Task,
 -                      (void *)0,
 -                      &Disp_Task_Stk[DISP_TASK_STK_SIZE-1],
 -                      DISP_TASK_PRIO);
 -         
 -         OSTaskDel(OS_PRIO_SELF);
 - }
 -         
 
- static void LED1_Task(void *p_arg)
 - {        
 -         INT8U err;
 -         (void)p_arg;        
 -         
 -         while(1)
 -         {        
 -                 OSTimeDly(1000);
 -                 OSFlagPost(My_FlagGroup,0x01,OS_FLAG_SET,&err);
 -                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);        
 -                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
 -                 OSTimeDly(OS_TICKS_PER_SEC/2);
 -                 GPIO_SetBits(GPIOB,GPIO_Pin_0);
 -                 OSTimeDly(OS_TICKS_PER_SEC/2);                
 -         }
 - }
 
- static void Key_Task(void *p_arg)
 - {
 -         INT8U err;
 -         (void)p_arg;
 -         
 -         while(1)
 -         {        
 -                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1)
 -                 {
 -                         OSTimeDly(150);
 -                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) ==1)
 -                         {
 -                                 OSFlagPost(My_FlagGroup,0x02,OS_FLAG_SET,&err);
 -                                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);
 -                         }
 -                                 
 -                 }
 -         }
 - }
 
-         
 - static void Disp_Task(void *p_arg)
 - { 
 -         INT8U err;
 -     (void) p_arg;
 -                         
 -         while(1)
 -         {
 -                 OSFlagPost(My_FlagGroup,0x04,OS_FLAG_SET,&err);
 -                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);
 -                 printf("完成一次任务同步\n");
 -         }
 - }
 
- static void Target_Init(void)
 - {
 -         LED1_Init();
 -         LED2_Init();
 -         Key_PA0_Config();
 -         USART1_Config(115200);
 - }
 
 小弟想完成一个多任务的同步功能,可是实现不了,请大神在指点~~~现象描述:串口执行一次"完成一次任务同步",接下来我再按按键就没有反应了~~~
按照我的设想,应该是我每按一次按键,就会触发一次,只是1分钟之内不会超过60次,因为我的LED_Task延时为1秒钟触发一次;
 任务优先级:#define START_TASK_PRIO                              3
                   #define DISP_TASK_PRIO                                 5
                   #define LED1_TASK_PRIO                                7
                   #define KEY_TASK_PRIO                                  9