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

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

   含笑杨 
含笑杨发表的帖子 

 大家觉得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()的问题吧?我正在考虑,我不知道我讲的对不对?希望大家一起讨论一下好吗?


发表时间:2004年9月14日11:23:09

  
回复该帖

本主题共有 3 帖,分页:>>>>>该主题的所有内容[3]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  78007.[详细]个人认为:ucos中延时的这种用法本来就不是为了保证精确的延时时间,而是为了一种时序,能达到最低延..
摘要:个人认为:ucos中延时的这种用法本来就不是为了保证精确的延时时间,而是为了一种时序,能达到最低延迟两个节拍就可以了.对于像ucos这种抢占式内核而言,重要的是保证最高优先级任务的响应时间.所以一定要在结束后就调度OS_Sched();......(211字)
- [zadix][1839次] 2005年5月19日

[上一篇帖子]:各位同仁们,谁有HS162-4 LCD 的资料呀,各位同仁们,谁有HS162-4
[下一篇帖子]:绘图语言哪位大虾知道:  绘图语言 HPGL 的命令格式是什