0

我的系统由七个任务组成。我创建了一些演示 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 毫秒执行一次(我的系统时钟频率是 60HZ,这意味着调度程序每 16 毫秒调用一次)

问题: 1. 探查器中是否有任何方法可以确保发生这种情况。2.如果没有怎么检查这个?

谢谢。

4

1 回答 1

1

我从来没有使用过profiler,所以我对它一无所知,但是我之前在vxworks中做过你想要的。这是我的做法:

1)产生一个优先级= 255(或低于任何实时任务)的任务,它消耗100%的CPU,如下所示:


void lowPriTask()
{
    volatile int forever = 1;
    while (forever) {}
}

2) 使用 taskSwitchHookAdd() 安装任务切换挂钩,并且您的切换挂钩回调应该跟踪(在内存中)旧的 taskId 和新的 taskId,以及 tickGet(),基本上只是在内存中编译此信息的列表。

3)然后当你运行你的任务一段时间后,将内存转储到一个文件中,并找出一些很酷的方法来检查它/可视化它,也许在 excel 左右的帮助下。

这个 lowPri 任务的原因是因为在 vxworks 中 taskSwitchHook 仅在发生任务切换时调用(显然),微妙的细节是如果系统空闲则不会发生任务切换。因此,如果您正在跟踪任务切换进出的时间,并且系统处于空闲状态,那么您将有一些任务似乎占用大量 CPU 时间,而实际上系统处于空闲状态。像这样:

  • taskSwitch_In
  • 任务运行
  • 任务已完成,但没有其他任务准备好,因此系统进入空闲状态....
  • 一些滴答声之后,任务就准备好了……
  • taskSwitch_Out

因此,如果您有一个消耗 100% 空闲时间的低优先级任务,那么总是会在任何(更高优先级)任务完成后立即强制切换任务。所以你总是会看到这样的模式:

  • taskSwitch_In
  • 任务运行
  • taskSwitch_Out(在没有其他任务准备好的情况下到 lowPriTask)

除此之外,它还可以根据此低优先级任务运行的时间量准确估计有多少空闲时间。

它很粗糙,但它有效。

于 2013-01-30T18:06:40.973 回答