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

C FreeRTOS:如何测量上下文切换时间?,c,linux,operating-system,computer-architecture,freertos,C,Linux,Operating System,Computer Architecture,Freertos,我想测量上下文切换时间的开销 以下是我的想法: 有两项任务: 塔斯卡 闲散 我创建了一个任务,如下所示: void calculate_ct(void *pvParameters) { int i = 0; for(; i < 100; i++) { vTaskDelay(100 / portTICK_RATE_MS); // delay 100 ms } // get_time(); vTaskDelete(NUL

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

以下是我的想法:

有两项任务:

  • 塔斯卡
  • 闲散
  • 我创建了一个任务,如下所示:

    void calculate_ct(void *pvParameters)
    {
        int i = 0; 
        for(; i < 100; i++)
        {
            vTaskDelay(100 / portTICK_RATE_MS); // delay 100 ms
        }    
        // get_time();
        vTaskDelete(NULL);
    }
    
    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特有的信息:

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

    如果您想测量上下文切换时间,那么只需测量它,而不要尝试测量函数执行时间,因为上下文切换时间只占实际测量时间的一小部分

    然后是FreeRTOS的具体细节:

    此处显示了有关上下文开关中的循环数的信息:。您需要按如下方式配置系统:

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

    设置为0-这将删除堆栈溢出检查,这大约是在上下文开关中执行的最长时间

    确保编译器优化设置为优化速度

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

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

    FreeRTOS包含跟踪宏,允许您将代码插入上下文开关。您可以使用这些宏来设置输出,然后可以在范围上进行测量。这将允许您测量上下文切换,而不是中断输入时间,但您也将测量设置或清除输出所需的时间,这将因体系结构而异


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

    我不知道如何测量它。什么是“如果你想测量上下文切换时间,那么就测量一下”的意思?空闲任务可以被看作是另一个任务,对吗?因此,我认为这两个任务(block->idle->resume->block->idle)发生了上下文切换。这是真的吗?我能用这种方法测量吗?我也试着用这种方法。我想尝试一下,无论一个任务和空闲任务是否发生上下文切换,我都可以测量它们。