任务调度

时间:2013-01-29 09:54:03

标签: vxworks

我的系统由七个任务组成。 我创建了一些演示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并连接了Performance Profiler。 性能分析器为我提供了每项任务的CPU使用率。 我要检查的是每个任务按时执行, 例如,我想确保task1每7 * 16 = 112毫秒执行一次 (我的系统时钟频率为60HZ,意味着调度程序每16毫秒调用一次)

问题: 在分析器中有任何方法可以使这种情况发生。 2.如果不能检查这个?

感谢。

1 个答案:

答案 0 :(得分:1)

我从未使用过探查器,因此我对此一无所知,但我在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
  • taskRuns
  • 任务已完成,但没有其他任务准备就绪,因此系统进入空闲状态....
  • 稍后一些任务准备就绪......
  • taskSwitch_Out

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

  • taskSwitch_In
  • taskRuns
  • taskSwitch_Out(如果没有其他任务准备好,则为lowPriTask)

除此之外,它还可以根据此低优先级任务运行的时间长度准确估算出空闲时间。

这很粗糙,但确实有效。