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

这是我的想法:

有两个任务:

  • taskA
  • 空闲

  • 我创建如下任务:
    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以获得上下文切换时间的平均开销吗?

    得到time()如下:
    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);
    }
    

    最佳答案

    首先,不是特定于FreeRTOS的信息:

    大多数尝试测量上下文切换时间的方法都是测量执行函数的时间,而恰好在其中执行了上下文切换。因此,您测量的时间将取决于您选择的功能,并且与上下文切换时间无关。在测量一个RTOS的时间时确实如此,尝试比较RTOS时会更加复杂,因为所选择的功能将在不同的RTOS之间包含非常不同的功能-尽管人们没有意识到这一点,但比较却毫无用处,因此这是一个“绝对的”。毕竟,获得最快切换时间的方法是删除所有功能或破坏调度策略,从而减少执行逻辑的时间。

    如果要测量上下文切换时间,则只需进行测量即可,不要尝试测量函数执行时间,因为上下文切换将只占实际测量时间的一小部分。

    然后是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包含跟踪宏,可用于将代码插入上下文切换器。您可以使用这些宏来设置输出,然后可以在示波器上对其进行测量。这将允许您测量上下文切换,而不是中断输入时间,但是您还将测量设置或清除输出所花费的时间-随体系结构的不同而不同。

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

    关于c - FreeRTOS : How to measure context switching time?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30975423/

    10-12 20:21