导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→大家觉得UCOS中的OSTimeDly()是否有问题呢?[含笑杨]

 *第25717篇: 大家觉得UCOS中的OSTimeDly()是否有问题呢?

  
楼 主:含笑杨 2004年9月14日11:23
 大家觉得UCOS中的OSTimeDly()是否有问题呢?
我们大家都知道,OSTimeDly()的程序是下面这样的:
void  OSTimeDly (INT16U ticks)
{
    INT8U      y;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status     */
    OS_CPU_SR  cpu_sr;
    cpu_sr = 0;                                  /* Prevent compiler warning                           */
#endif    
    if (ticks >   0) {                             /* 0 means no delay!                                  */
        OS_ENTER_CRITICAL();
        y            =  OSTCBCur->  OSTCBY;        /* Delay current task                                 */
        OSRdyTbl[y] &= ~OSTCBCur->  OSTCBBitX;
        if (OSRdyTbl[y] == 0) {  
            OSRdyGrp &= ~OSTCBCur->  OSTCBBitY;
        }
        OSTCBCur->  OSTCBDly = ticks;              /* Load ticks in TCB                                  */
        OS_EXIT_CRITICAL();
        OS_Sched();                                       /* Find next task to run!                             */
    }
我们从上面的程序可以分析知道,当一个任务运行完主要的工作,调用OSTimeDly (2),想延时两个节拍,我不知道按照这样的程序还能延时吗?
大家看看上面的程序,当TICKS>  0时就可以进行任务调度了, 也就是说不当我一开始调用这个函数OSTimeDly (2)的时候,TICKS肯定是大于0的(时钟节拍一般都在10MS~100MS之间,所以TICKS还没有减到0吧?),那么这样也就是没有延时就有任务切换了,那这样的延时根本就不起作用了。我想应该不对的吧,应该是要等到延时到了以后才进行任务切换的吧?所以我改成了下面的形式:void  OSTimeDly (INT16U ticks)
{
    INT8U      y;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;

    cpu_sr = 0;                                  /* Prevent compiler warning                           */
#endif    
    if (ticks >   0) {                             /* 0 means no delay!                                  */
        OS_ENTER_CRITICAL();
        y            =  OSTCBCur->  OSTCBY;        /* Delay current task                                 */
        OSRdyTbl[y] &= ~OSTCBCur->  OSTCBBitX;
        if (OSRdyTbl[y] == 0) {  
            OSRdyGrp &= ~OSTCBCur->  OSTCBBitY;
        }
        OSTCBCur->  OSTCBDly = ticks;              /* Load ticks in TCB                                  */
        OS_EXIT_CRITICAL();
        //OS_Sched();                              /* Find next task to run!                             */
    }
    else
       OS_Sched(); 
}
但是这样的程序至少要延时3个TICKS以上才会进行任务的切换,我想应该是OSTIMETICK()的问题吧?我正在考虑,我不知道我讲的对不对?希望大家一起讨论一下好吗?

  
2楼:zadix 2005年5月19日19:13
 个人认为:ucos中延时的这种用法本来就
个人认为:ucos中延时的这种用法本来就不是为了保证精确的延时时间,而是为了一种时序,能达到最低延迟两个节拍就可以了.对于像ucos这种抢占式内核而言,重要的是保证最高优先级任务的响应时间.所以一定要在结束后就调度OS_Sched();
  
3楼:yayayong 2009年4月6日15:27
 [原创]
照你这么说当tick=2的时候,就不能进行任务调度(os_sched)了啊?



>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:各位同仁们,谁有HS162-4 LCD 的资料呀,

[下一篇主题]:绘图语言