c - 测量上下文切换的时间

标签 c time semaphore context-switch microc

我正在熟悉 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);
  }
}

还是我完全弄错了?

最佳答案

恐怕您无法使用任何 µC/OS 原语测量上下文切换时间。上下文切换时间太小,无法通过 µC/OS 软计时器测量,这很可能基于系统节拍的倍数(因此是几毫秒)——即使它取决于特定的 µC/OS 端口到您的 CPU架构。

您将不得不直接访问处理器的硬件计时器 - 您可能希望将其频率配置为它可以处理的最大值。将其设置为一个自由运行的定时器(不需要任何中断),并以其计数值作为时基来测量切换时间。

或者您可以阅读您的体系结构的 OS_TASK_SW() 的 ASM 并计算所需的周期数;)

关于c - 测量上下文切换的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12759280/

相关文章:

java - 使用超时和信号量进行线程阻塞

c - 在C中动态创建sembuf结构

c - 获取列表中节点的当前值和位置

c# - 如何检查字符串值的时间格式是否正确?

c - C 程序中的错误

java - MongoDB 与 Java/Morphia 的约会

mysql - 同一 ID 票务系统之间的时间

java - 尝试访问临界区的三种类型的线程

c++ - 在 g++ 中编译 .c 假定 c++ 任何命令行选项都将其视为 .c

c - HAL_UART_Transmit发送错误数据