我想测量上下文切换时间的开销。
这是我的想法:
有两个任务:
- 任务A
- 空闲
我创建一个任务如下:
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/