我的系统由七项任务组成。为了检查我的系统,我创建了一些演示RTP,如下所示:
int main()
{
taskSpawn("/task1" , 107 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task1, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task2" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task2, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task3" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task3, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task4" , 104 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task4, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task5" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task5, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task6" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task6, 0,0,0,0,0,0,0,0,0,0);
taskSpawn("/task7" , 101 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task7, 0,0,0,0,0,0,0,0,0,0);
taskExit(OK);
}
void task1() { taskDelay(7); }
void task2() { taskDelay(13); }
void task3() { taskDelay(313); }
void task4() { taskDelay(19); }
void task5() { taskDelay(188); }
void task6() { taskDelay(10); }
void task7() { taskDelay(10); }我运行了RTP并连接了性能分析器。性能分析器给出了每个任务的CPU使用情况。我要检查的是每个任务是否按时执行,例如,我希望确保task1每7*16 = 112毫秒执行一次(我的系统时钟速率为60 my,这意味着每16毫秒调用一次调度器)。
问题:1.剖析器中是否有任何方法可以使shure发生这种情况。2.如果不是,如何检查这一点?
谢谢。
发布于 2013-01-30 18:06:40
我从来没有使用过分析器,所以我对它一无所知,但是我以前在vxworks中做过您想做的事情。我就是这样做的:
1)生成优先级= 255 (或低于任何实时任务)的任务,该任务消耗100% CPU,如下所示:
void lowPriTask()
{
volatile int forever = 1;
while (forever) {}
}2)用taskSwitchHookAdd()安装一个任务开关挂钩,您的开关挂钩回调应该跟踪(在内存中)旧的taskId和新的taskId,而tickGet()基本上只是在内存中编译这个信息的列表。
3)然后,当您运行任务一段时间后,将内存转储到一个文件中,并想出一些很酷的方法来检查它/可视化它,也许可以借助excel之类的工具。
这个lowPri任务的原因是,在vxworks中,只有在发生任务切换时才调用taskSwitchHook (显然),微妙的细节是,如果系统处于空闲状态,则不会发生任务切换。因此,如果您正在跟踪任务切换的时间,并且系统处于空闲状态,那么您将有一些任务似乎占用了大量的CPU时间,而实际上系统是空闲的。就像这样:
因此,如果您的低优先级任务消耗了100%的空闲时间,那么在完成任何(更高优先级)任务之后,总是会立即强制任务切换。所以你总能看到这样的模式:
除此之外,它还根据这个低优先级任务运行的时间,准确地估计了空闲时间。
它是粗糙的,但它是有效的。
https://stackoverflow.com/questions/14580037
复制相似问题