关于ucosIII无法调度任务的问题问题

2019-07-21 05:21发布


无法进入led0_task与led1_task的任务函数,我在这两个函数里面给予灯的高电平,测试时如果能进入这两个任务函数应该能闪烁,我尝试过直接创建多个任务函数,则会出现一个灯一直长亮(没有闪烁),另外一个灯不亮,OSTimeDlyHMSM(0,0,0,2000,OS_OPT_TIME_HMSM_STRICT,&err);发现到了这条函数无法使用。
上网查资料没找到想要的结果,在这里求大神帮忙看下能否解决,



//开始任务函数
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
GPIO_AllInit();


CPU_Init();
  GPIO_SetBits(GPIOB,GPIO_Pin_12);      
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);   //统计任务               
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN  //如果使能了测量中断关闭时间
    CPU_IntDisMeasMaxCurReset();
#endif

#if OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
  //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif  

OS_CRITICAL_ENTER(); //进入临界区

//创建LED0任务
OSTaskCreate((OS_TCB  * )&Led0TaskTCB,  
     (CPU_CHAR * )"led0 task",   
                 (OS_TASK_PTR )led0_task,   
                 (void  * )0,     
                 (OS_PRIO   )LED0_TASK_PRIO,     
                 (CPU_STK   * )&LED0_TASK_STK[0],
                 (CPU_STK_SIZE)LED0_STK_SIZE/10,
                 (CPU_STK_SIZE)LED0_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,     
                 (void    * )0,     
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR  * )&err);   
     
//创建LED1任务
OSTaskCreate((OS_TCB  * )&Led1TaskTCB,  
     (CPU_CHAR * )"led1 task",   
                 (OS_TASK_PTR )led1_task,   
                 (void  * )0,     
                 (OS_PRIO   )LED1_TASK_PRIO,      
                 (CPU_STK   * )&LED1_TASK_STK[0],
                 (CPU_STK_SIZE)LED1_STK_SIZE/10,
                 (CPU_STK_SIZE)LED1_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,     
                 (void    * )0,   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR  * )&err);
   
//创建浮点测试任务
OSTaskCreate((OS_TCB  * )&FloatTaskTCB,  
     (CPU_CHAR * )"float test task",   
                 (OS_TASK_PTR )float_task,   
                 (void  * )0,     
                 (OS_PRIO   )FLOAT_TASK_PRIO,      
                 (CPU_STK   * )&FLOAT_TASK_STK[0],
                 (CPU_STK_SIZE)FLOAT_STK_SIZE/10,
                 (CPU_STK_SIZE)FLOAT_STK_SIZE,  
                 (OS_MSG_QTY  )0,     
                 (OS_TICK   )0,     
                 (void    * )0,   
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                 (OS_ERR  * )&err);         
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);  //挂起开始任务   
OS_CRITICAL_EXIT(); //进入临界区
         
         
}
//led0任务函数
void led0_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
  GPIO_SetBits(GPIOB,GPIO_Pin_13);
  OSTimeDlyHMSM(0,0,0,2000,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms
  GPIO_ResetBits(GPIOB,GPIO_Pin_13);
  OSTimeDlyHMSM(0,0,0,1000,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
}
}
//led1任务函数
void led1_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
  GPIO_SetBits(GPIOB,GPIO_Pin_14);
  OSTimeDlyHMSM(0,0,0,1000,OS_OPT_TIME_HMSM_STRICT,&err); //延时200ms
  GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  OSTimeDlyHMSM(0,0,0,1000,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms
}
}


0条回答

一周热门 更多>