我想测量上下文切换时间的开销。
我的想法是:
有两项任务:
我创建了如下任务:
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以获得上下文切换时间的平均开销吗?
得到时间()如下:
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);
}
答案 0 :(得分:2)
首先,不是FreeRTOS特有的信息:
测量上下文切换时间的大多数尝试都会测量执行函数的时间,该函数恰好在其中进行了上下文切换。因此,您测量的时间取决于您选择的功能,并且与上下文切换时间无关。在测量一个RTOS的时间时也是如此,当尝试比较RTOS时它更复杂,因为所选择的功能将包括跨不同RTOS的非常不同的功能 - 使得比较在很大程度上无用,尽管人们没有意识到这一点,并把它作为一个绝对的&#39;。毕竟,获得最快切换时间的方法是删除所有功能,或者中断调度策略,以便执行更少的逻辑。
如果您想测量上下文切换时间,那么只需测量一下,并且不要尝试测量功能执行时间,因为上下文切换只是实际测量时间的一小部分。
然后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包含跟踪宏,允许您将代码插入上下文切换。您可以使用这些宏来设置可在范围上测量的输出。这将允许您测量上下文切换,而不是中断输入时间,但您还将测量设置或清除输出所花费的时间 - 从架构到架构会有所不同。
您想测量上下文切换时间,还是执行其中包含上下文切换功能的时间?
答案 1 :(得分:0)
我可能会使用两个线程来连续交换两个信号量的单位,直到达到一些计数。如果计数足够高,您可以使用秒表计时,然后除以计数,以获得几乎所有上下文切换时间的间隔。