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