ucos之多任务的同步问题求解~~~

[复制链接]
1190|3
 楼主| liuchang890811 发表于 2015-8-6 15:37 | 显示全部楼层 |阅读模式
ucos, ST, TI, IO, gp
本帖最后由 liuchang890811 于 2015-8-6 15:59 编辑
  1. #include "includes.h"
  2. #include <stm32f10x.h>
  3. #include "led.h"
  4. #include "key.h"
  5. #include "usart.h"

  6. static OS_STK Start_Task_Stk[START_TASK_STK_SIZE];
  7. static OS_STK Disp_Task_Stk[DISP_TASK_STK_SIZE];
  8. static OS_STK LED1_Task_Stk[LED1_TASK_STK_SIZE];
  9. static OS_STK Key_Task_Stk[KEY_TASK_STK_SIZE];

  10. static void Target_Init(void);
  11. static void Start_Task(void *p_arg);
  12. static void Disp_Task(void *p_arg);
  13. static void LED1_Task(void *p_arg);
  14. static void Key_Task(void *p_arg);

  15. OS_FLAG_GRP *My_FlagGroup;

  16. int main(void)
  17. {
  18.         Target_Init();        
  19.         printf(" ucos已经启动\n");
  20.    
  21.     OSInit();               
  22.         
  23.     OSTaskCreate(Start_Task,
  24.                      (void *)0,
  25.                      &Start_Task_Stk[START_TASK_STK_SIZE-1],
  26.                      START_TASK_PRIO);
  27.         
  28.     OSStart();        
  29.         return 0;
  30. }

  31. static void Start_Task(void *p_arg)
  32. {
  33.         INT8U err;
  34.         OS_CPU_SysTickInit();        
  35.         printf("Start_Task任务已经启动\n");
  36.         
  37.         My_FlagGroup=OSFlagCreate(0,&err);
  38.         
  39.         OSTaskCreate(LED1_Task,
  40.                      (void *)0,
  41.                      &LED1_Task_Stk[LED1_TASK_STK_SIZE-1],
  42.                      LED1_TASK_PRIO);
  43.         OSTaskCreate(Key_Task,
  44.                      (void *)0,
  45.                      &Key_Task_Stk[KEY_TASK_STK_SIZE],
  46.                      KEY_TASK_PRIO);
  47.         OSTaskCreate(Disp_Task,
  48.                      (void *)0,
  49.                      &Disp_Task_Stk[DISP_TASK_STK_SIZE-1],
  50.                      DISP_TASK_PRIO);
  51.         
  52.         OSTaskDel(OS_PRIO_SELF);
  53. }
  54.         

  55. static void LED1_Task(void *p_arg)
  56. {        
  57.         INT8U err;
  58.         (void)p_arg;        
  59.         
  60.         while(1)
  61.         {        
  62.                 OSTimeDly(1000);
  63.                 OSFlagPost(My_FlagGroup,0x01,OS_FLAG_SET,&err);
  64.                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);        
  65.                 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  66.                 OSTimeDly(OS_TICKS_PER_SEC/2);
  67.                 GPIO_SetBits(GPIOB,GPIO_Pin_0);
  68.                 OSTimeDly(OS_TICKS_PER_SEC/2);               
  69.         }
  70. }


  71. static void Key_Task(void *p_arg)
  72. {
  73.         INT8U err;
  74.         (void)p_arg;
  75.         
  76.         while(1)
  77.         {        
  78.                 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1)
  79.                 {
  80.                         OSTimeDly(150);
  81.                         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) ==1)
  82.                         {
  83.                                 OSFlagPost(My_FlagGroup,0x02,OS_FLAG_SET,&err);
  84.                                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);
  85.                         }
  86.                                 
  87.                 }
  88.         }
  89. }

  90.         
  91. static void Disp_Task(void *p_arg)
  92. {
  93.         INT8U err;
  94.     (void) p_arg;
  95.                         
  96.         while(1)
  97.         {
  98.                 OSFlagPost(My_FlagGroup,0x04,OS_FLAG_SET,&err);
  99.                 OSFlagPend(My_FlagGroup,0x07,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err);
  100.                 printf("完成一次任务同步\n");
  101.         }
  102. }


  103. static void Target_Init(void)
  104. {
  105.         LED1_Init();
  106.         LED2_Init();
  107.         Key_PA0_Config();
  108.         USART1_Config(115200);
  109. }
小弟想完成一个多任务的同步功能,可是实现不了,请大神在指点~~~现象描述:串口执行一次"完成一次任务同步",接下来我再按按键就没有反应了~~~
按照我的设想,应该是我每按一次按键,就会触发一次,只是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


cos12a 发表于 2016-2-13 23:55 来自手机 | 显示全部楼层
return 0;
john_lee 发表于 2016-2-14 10:21 | 显示全部楼层
删掉 70,92 行看看。
samyang13 发表于 2016-2-22 16:57 | 显示全部楼层
你的Disp_Task(void *p_arg)函数中没有Delay释放CPU的使用权
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

87

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部