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)发生了上下文切换。这是真的吗?我能用这种方法测量吗?我也试着用这种方法。我想尝试一下,无论一个任务和空闲任务是否发生上下文切换,我都可以测量它们。