我熟悉MicroC / OS-II内核和多任务处理。我编写了以下两个使用信号量的任务:
#define TASK1_PRIORITY 6 // highest priority
#define TASK2_PRIORITY 7
void task1(void* pdata)
{
while (1)
{
INT8U err;
OSSemPend(aSemaphore_task1, 0, &err);
int i;
if (sharedAddress >= 0)
{
printText(text1);
printDigit(++sharedAddress);
}
else
{
printText(text2);
printDigit(sharedAddress);
}
OSTimeDlyHMSM(0, 0, 0, 11);
OSSemPost(aSemaphore_task2);
}
}
void task2(void* pdata)
{
while (1)
{
INT8U err;
OSSemPend(aSemaphore_task2, 0, &err);
sharedAddress *= -1;
OSTimeDlyHMSM(0, 0, 0, 4);
OSSemPost(aSemaphore_task1);
}
}
现在我想测量上下文切换时间,即处理器在这两个任务之间切换所花费的时间。
这是通过使用函数timer()
完成的,如:
void task1(void* pdata)
{
while (1)
{
INT8U err;
OSSemPend(aSemaphore_task1, 0, &err);
int i;
if (sharedAddress >= 0)
{
printText(text1);
printDigit(++sharedAddress);
}
else
{
printText(text2);
printDigit(sharedAddress);
}
OSTimeDlyHMSM(0, 0, 0, 11);
OSSemPost(aSemaphore_task2);
timer(start);
}
}
void task2(void* pdata)
{
while (1)
{
timer(stop):
INT8U err;
OSSemPend(aSemaphore_task2, 0, &err);
sharedAddress *= -1;
OSTimeDlyHMSM(0, 0, 0, 4);
OSSemPost(aSemaphore_task1);
}
}
还是我完全错了?
答案 0 :(得分:3)
我担心您将无法使用任何μC/ OS原语测量上下文切换时间。上下文切换时间太小,无法通过μC/ OS软定时器测量,这很可能是基于系统节拍的倍数(因此几毫秒) - 即使它取决于CPU的特定μC/ OS端口架构。
您必须直接访问处理器的硬件计时器 - 您可能希望将其频率配置为其可以处理的最大频率。将其设置为自由运行定时器(您不需要任何中断)并使用其计数值作为测量切换时间的时基。
或者您可以为您的体系结构读取OS_TASK_SW()的ASM并计算所需的周期数;)
答案 1 :(得分:2)
对于性能测量,标准方法是首先校准您的工具。 在这种情况下,它是您的计时器或建议的时钟(如果您使用C ++)。
要校准它,您需要多次调用它(例如1000)并查看平均每次拍摄的时间。现在你知道测量时间的成本了。在这种情况下,它可能与您尝试测量的功能(最多)处于相似的范围内 - 上下文切换。
因此校准很重要。
告诉我们您的情况。
答案 2 :(得分:2)
您可以使用OSTimeGet API来获取执行时间。 uCOS不使用timer()函数来获取执行时间。