FreeRTOS:如何衡量上下文切换时间?

时间:2015-06-22 08:39:27

标签: c linux operating-system computer-architecture freertos

我想测量上下文切换时间的开销。

我的想法是:

有两项任务:

  1. 任务A
  2. 空闲
  3. 我创建了如下任务:

    void calculate_ct(void *pvParameters)
    {
        int i = 0; 
        for(; i < 100; i++)
        {
            vTaskDelay(100 / portTICK_RATE_MS); // delay 100 ms
        }    
        // get_time();
        vTaskDelete(NULL);
    }
    

    当任务调用vTaskDelay()时,它将变为阻塞状态。这意味着发生context switch空闲任务。

    我可以在结尾处使用get_time()并减去延迟时间(10 * 100ms)来获得上下文切换时间的总开销,并将开销除以10以获得上下文切换时间的平均开销吗?

    得到时间()如下:

    unsigned int get_reload()
    {
        return *(uint32_t *) 0xE000E014;
    }
    
    unsigned int get_current()
    {
        return *(uint32_t *) 0xE000E018;
    }
    
    unsigned int get_time()
    {
        static unsigned int const *reload = (void *) 0xE000E014;
        static unsigned int const *current = (void *) 0xE000E018;
        static const unsigned int scale = 1000000 / configTICK_RATE_HZ;
                                        /* microsecond */
        return xTaskGetTickCount() * scale + (*reload - *current) * (1.0) / (*reload / scale);
    }
    

2 个答案:

答案 0 :(得分:2)

首先,不是FreeRTOS特有的信息:

测量上下文切换时间的大多数尝试都会测量执行函数的时间,该函数恰好在其中进行了上下文切换。因此,您测量的时间取决于您选择的功能,并且与上下文切换时间无关。在测量一个RTOS的时间时也是如此,当尝试比较RTOS时它更复杂,因为所选择的功能将包括跨不同RTOS的非常不同的功能 - 使得比较在很大程度上无用,尽管人们没有意识到这一点,并把它作为一个绝对的&#39;。毕竟,获得最快切换时间的方法是删除所有功能,或者中断调度策略,以便执行更少的逻辑。

如果您想测量上下文切换时间,那么只需测量一下,并且不要尝试测量功能执行时间,因为上下文切换只是实际测量时间的一小部分。

然后FreeRTOS具体细节:

有关上下文切换中所用周期数的信息,请参见此处:http://www.freertos.org/FAQMem.html#ContextSwitchTime。您需要按如下方式配置系统:

将configUSE_PORT_OPTIMISED_TASK_SELECTION设置为1 - 将使用一个或多个asm指令选择要运行的下一个任务,而不是使用通用C实现。

configCHECK_FOR_STACK_OVERFLOW设置为0 - 这将删除堆栈溢出检查,这是在上下文切换中执行的最长的事情。

确保将编译器优化设置为针对速度进行优化。

确保没有定义跟踪宏。跟踪宏将代码添加到内核中。

确保configGENERATE_RUN_TIME_STATS设置为0 - 这将删除收集统计信息的代码。

FreeRTOS包含跟踪宏,允许您将代码插入上下文切换。您可以使用这些宏来设置可在范围上测量的输出。这将允许您测量上下文切换,而不是中断输入时间,但您还将测量设置或清除输出所花费的时间 - 从架构到架构会有所不同。

您想测量上下文切换时间,还是执行其中包含上下文切换功能的时间?

答案 1 :(得分:0)

我可能会使用两个线程来连续交换两个信号量的单位,直到达到一些计数。如果计数足够高,您可以使用秒表计时,然后除以计数,以获得几乎所有上下文切换时间的间隔。