- #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