gpt4 book ai didi

c - FreeRTOS : How to measure context switching time?

转载 作者:太空狗 更新时间:2023-10-29 12:14:18 24 4
gpt4 key购买 nike

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

这是我的想法:

有两个任务:

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com