[英]Measuring the time for a context switch
我熟悉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軟定時器測量,這很可能是基於系統節拍的倍數(因此幾毫秒) - 即使它取決於CPU的特定μC/ OS端口建築。
您必須直接訪問處理器的硬件計時器 - 您可能希望將其頻率配置為它可以處理的最大頻率。 將其設置為自由運行定時器(您不需要任何中斷)並使用其計數值作為測量切換時間的時基。
或者,您可以為您的體系結構讀取OS_TASK_SW()的ASM並計算所需的周期數;)
對於性能測量,標准方法是首先校准您的工具。 在這種情況下,它是您的計時器,或建議的時鍾(如果您使用C ++)。
要進行校准,您需要多次調用它(例如1000次)並查看每次平均需要多長時間。 現在你知道測量時間的成本了。 在這種情況下,它可能與您嘗試測量的功能(最多)處於相似的范圍內 - 上下文切換。
因此校准很重要。
讓我們知道你是怎么走的。
您可以使用OSTimeGet API來獲取執行時間。 uCOS不使用timer()函數來獲取執行時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.