c - 自由RTOS : How to measure context switching time?

标签 c linux operating-system cpu-architecture freertos

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

这是我的想法:

有两个任务:

  1. 任务A
  2. 空闲

我创建一个任务如下:

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() 时,会转入阻塞状态。这意味着发生上下文切换到空闲任务。

我可以在最后使用 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);
}

最佳答案

首先,非 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 - 自由RTOS : How to measure context switching time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975423/

相关文章:

c - 在 FPGA 设备上编程

c - 如何读取记住文件的最后偏移量?

c - 从秒获取 UTC 时间

linux - 为什么ps和free的内存占用差异这么大?

linux - Zipkin + Elasticsearch (ELK) 不创建索引

python - 在 python 中使用 for 循环探索目录 - 顺序是否改变?

c - 无限循环后我需要返回语句吗?

c - 链接 c 和程序集

linux - ELF 的代码段何时加载到内存中?

c - C 指针是否导致我的自制内核 VGA 部分出现三重错误?