我正在熟悉 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);
}
}
还是我完全弄错了?
最佳答案
恐怕您无法使用任何 µC/OS 原语测量上下文切换时间。上下文切换时间太小,无法通过 µC/OS 软计时器测量,这很可能基于系统节拍的倍数(因此是几毫秒)——即使它取决于特定的 µC/OS 端口到您的 CPU架构。
您将不得不直接访问处理器的硬件计时器 - 您可能希望将其频率配置为它可以处理的最大值。将其设置为一个自由运行的定时器(不需要任何中断),并以其计数值作为时基来测量切换时间。
或者您可以阅读您的体系结构的 OS_TASK_SW() 的 ASM 并计算所需的周期数;)
关于c - 测量上下文切换的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12759280/