我想计算一系列任务的执行时间,我启动任务然后激活它,我使用taskCreateHookAdd来启动计时器,并且在每个任务的每个开关上我将使用taskSwitchHookAdd重新计算时间。删除任务后。我在taskDeleteHookAdd中最后一次计算时间。
我在我的系统中创建了4个任务,它们是插入,遍历,删除,搜索二进制树。最后,我计算的任务执行时间对于我的两个任务似乎没有问题,有时它们是0.和其余时间具有完全相同的值。我已经检查了任务的优先级,但它们似乎没问题。所有任务都有实现,并且它们不是空的。你可以在下面看到我的代码的开关部分,我确定其他部分工作正常(通过调试),但我对开关挂钩不太确定。如果你能提前帮助我,我将不胜感激。谢谢。
` void switchtaskHook(WIND_TCB * pOldTcb,WIND_TCB * pNewTcb) {
if((int)pOldTcb == tidInsert)
{
inserttotal+=tickGet()-inserttick;
}
else if((int)pOldTcb == tidTraverse)
{
traversetotal+=tickGet()-traversetick;
}
else if((int)pOldTcb == tidSearch)
{
searchtotal+=tickGet()-searchtick;//;count++;
}
else if((int)pOldTcb == tidDelete)
{
deletetotal+=tickGet()-deletetick;
}
if((int)pNewTcb == tidInsert)
{
inserttick=tickGet();
else if((int)pNewTcb == tidTraverse)
{
traversetick=tickGet();
}
else if((int)pNewTcb == tidSearch)
{
searchtick=tickGet();
}
else if((int)pNewTcb == tidDelete)
{
deletetick=tickGet();
}
}
`
答案 0 :(得分:0)
请阅读tickGet()的手册条目。
它返回系统节拍计数,通常以60到2KHz运行。太粗糙,无法进行性能测量。 这是由BSP控制的,你真的不想在没有充分理由的情况下改变它(并且上限速率通常是8KHz,这仍然太粗糙),因为它会影响系统开销。
更好的方法是使用通常具有微秒分辨率的时间戳驱动程序。 在文档中查找sysTimestamp *函数。
答案 1 :(得分:0)
如果要测量任务中代码的执行时间,可以尝试将有问题的代码分成可单独调用的子程序,然后通过vxWorks timexLib
测量每个子程序的性能,参见例如它的timexN()
方法。
timexN()
非常准确。如果您可以将代码模块化以允许按子例程进行基准测试,那么您的设计可能会从整体上受益,但可能并非总是如此。
如果您无法执行此类模块化测试,并且需要比tickLib
更精细的计时器,则您的选项可能取决于您的目标平台。在您的BSP的sysLib.c
文件中,您通常会找到一个例程sysUsDelay()
,其使用的时间比tickGet()
高得多。查找读取“Time Base Lower Register”滴答计数的代码,该计数递增接近CPU速度。不幸的是,细节特定于您的目标平台(CPU,..)。尽管如此,只要您保持相同的目标,您就可以在那里查看如何获得更高分辨率的计时器以进行执行时间分析。