4485|3

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

UCOS-II的任务切换问题 [复制链接]

 现在我在S3C2440上面移植了UCOS 2.76
但是在建立多任务的时候出现了一个很奇怪的问题
main(){
  OSInit();
   
   
   OSTaskCreate(Task_B, (void *)0, &Task_B_Stack[TSK_STK_SIZE-1],2);
    OSTaskCreate(Task_C, (void *)0, &Task_C_Stack[TSK_STK_SIZE-1],3);      //Create Task A, B, C

    OSStart();
}


void Task_B(void * pParam)
{
     if( 1 == g_ulFirstBoot)
        {       
                CPU_Init() ;
            g_ulFirstBoot = 0;
        }
  //  pevent  = OSSemCreate(0);
  //  pevent2 = OSMboxCreate((void*)0);
   
    while(1)
    {
                //OSSemPend(pevent, 0, err );
                Uart_Printf("TaskB is running!\n");//         TimeDelay(DELAY+500);       
                OSTimeDly(5);
                 //TimeDelay(DELAY+50);
    }
           
}

void Task_C(void * pParam)
{
        INT8U i;
        if( 1 == g_ulFirstBoot)
        {       
           CPU_Init() ;
           g_ulFirstBoot = 0;
        }

        while(1)
    {
        i=0;
   
        // Uart_Printf("TaskC is running!\n");
        for(i=0;i<4;i++)
        {
         Led_Display((0x10<          
     //        Delay(2000);
        }
      OSTimeDly(3);
      // TimeDelay(DELAY);
    }
}

OSTimeTcik()是在Timer4的中断服务程序中调用的,,定时器4定时0.2ms
这两个任务不能跑起来呀
如果把B任务的延时取消就一直运行B.
加上延时就不运行了
各位大哥给点意见

最新回复

嗯我发现如果OSTimeDly();的值小的话 那么就能切换 如果OSTimeDly();的值大了的话就只切换几次就死了......... 郁闷 这是为什么呀 急急................. 在线等候 谢谢   详情 回复 发表于 2008-7-26 11:31
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
OSTimeTcik()在哪?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在timer4的中断服务程序中调用的哈
OSTimeTick的程序如下
void  OSTimeTick (void)
{
    OS_TCB    *ptcb;
#if OS_TICK_STEP_EN > 0
    BOOLEAN    step;
#endif
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr;



    cpu_sr = 0;                                            /* Prevent compiler warning                     */
#endif
#if OS_TIME_TICK_HOOK_EN > 0
    OSTimeTickHook();                                      /* Call user definable hook                     */
#endif
#if OS_TIME_GET_SET_EN > 0
    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter               */
    OSTime++;
    OS_EXIT_CRITICAL();
#endif
    if (OSRunning == TRUE) {
#if OS_TICK_STEP_EN > 0
        switch (OSTickStepState) {                         /* Determine whether we need to process a tick  */
            case OS_TICK_STEP_DIS:                         /* Yes, stepping is disabled                    */
                 step = TRUE;
                 break;

            case OS_TICK_STEP_WAIT:                        /* No,  waiting for uC/OS-View to set ...       */
                 step = FALSE;                             /*      .. OSTickStepState to OS_TICK_STEP_ONCE */
                 break;

            case OS_TICK_STEP_ONCE:                        /* Yes, process tick once and wait for next ... */
                 step            = TRUE;                   /*      ... step command from uC/OS-View        */
                 OSTickStepState = OS_TICK_STEP_WAIT;
                 break;

            default:                                       /* Invalid case, correct situation              */
                 step            = TRUE;
                 OSTickStepState = OS_TICK_STEP_DIS;
                 break;
        }
        if (step == FALSE) {                               /* Return if waiting for step command           */
            return;
        }
#endif
        ptcb = OSTCBList;                                  /* Point at first TCB in TCB list               */
        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list              */
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0) {     //?÷??..........................
                    Uart_Printf("\ntick\n");                 /* No, Delayed or waiting for event with TO     */
                if (--ptcb->OSTCBDly == 0) {               /* Decrement nbr of ticks to end of delay       */
                                                           /* Check for timeout                            */
                  
                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
                        ptcb->OSTCBStat   &= ~OS_STAT_PEND_ANY;                /* Yes, Clear status flag   */
                        ptcb->OSTCBPendTO  = TRUE;                             /* Indicate PEND timeout    */
                    } else {
                        ptcb->OSTCBPendTO  = FALSE;
                    }

                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  /* Is task suspended?       */
                        OSRdyGrp               |= ptcb->OSTCBBitY;             /* No,  Make ready          */
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list                */
            OS_EXIT_CRITICAL();
        }
    }
}
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
嗯我发现如果OSTimeDly();的值小的话
那么就能切换
如果OSTimeDly();的值大了的话就只切换几次就死了.........
郁闷
这是为什么呀
急急.................
在线等候
谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表