测量上下文切换的时间

3

我正在熟悉MicroC/OS-II内核和多任务处理。我编写了以下两个使用信号量的任务:

#define TASK1_PRIORITY      6  // highest priority
#define TASK2_PRIORITY      7

void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }  
    OSTimeDlyHMSM(0, 0, 0, 11);  
    OSSemPost(aSemaphore_task2);  
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1; 
    OSTimeDlyHMSM(0, 0, 0, 4);                                 
    OSSemPost(aSemaphore_task1);
  }
}

现在我想要测量上下文切换时间,即处理器在这两个任务之间切换所需的时间。
这可以通过使用函数timer()来完成吗?
void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }    
     OSTimeDlyHMSM(0, 0, 0, 11);
     OSSemPost(aSemaphore_task2);
     timer(start);
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    timer(stop):
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1;  
    OSTimeDlyHMSM(0, 0, 0, 4);                                
    OSSemPost(aSemaphore_task1);
  }
}

或者我完全理解错了吗?

首先,你能保证这两个任务始终在同一个CPU核心上运行吗?然后,让我们考虑如何测量上下文切换的持续时间。 - lashgar
是的,它始终在同一个核心上运行。 - Smajjk
有一个函数clock(),返回自应用程序启动以来经过的当前时钟滴答数。您可以使用它代替time。请参考此链接以获取用法:http://www.cplusplus.com/reference/clibrary/ctime/clock/ - lashgar
1
内核是否具有这方面的工具?很可能有。上次使用VxWorks时,其中一个非常方便的功能是WindView工具-它允许您捕获内核事件,然后在图形上显示它们,以便您可以精确地看到上下文切换发生的时间和持续时间。可以肯定,在这些年里其他实时操作系统也具备了这种功能。 - marko
你能找到上下文切换函数吗?你可以查看切换所需的指令数量,并从中推断出时间。 - Josh Petitt
3个回答

3
很抱歉,通过任何µC/OS基元都无法测量上下文切换时间。µC/OS软定时器的精度太低,它们大多基于系统时钟(几毫秒)的倍数 - 即使这取决于您CPU架构的特定µC/OS端口也不行。
您需要直接访问处理器的硬件计时器 - 您可能希望将其频率配置为最大值。将其设置为自由运行计时器(您不需要任何中断),并使用其计数值作为时间基准来测量切换时间。
或者,您可以阅读适合您体系结构的OS_TASK_SW()的ASM,并计算所需的周期数;)

2

您可以使用OSTimeGet API来获取执行时间。

UCOS不使用timer()函数来获取执行时间。


2

进行性能测量的标准方法是首先校准您的工具。

在这种情况下,您需要校准计时器或建议的时钟(如果您使用C ++)。

为了校准它,您需要多次调用它(例如1000次),并查看每次平均需要多长时间。现在您知道了测量时间的成本。在这种情况下,它很可能与您尝试测量的特征 - 上下文切换的范围相似(最好是)。

因此,校准非常重要。

请告诉我们您的进展情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接