4. 配置CPU时间配额

任务目标

在VxWorks 7环境中,为两个安全分区分别配置CPU时间配额(例如分区A为70%,分区B为30%),并通过运行周期任务统计实际CPU占用率,验证调度器按配额公平分配CPU资源。

环境依赖

本案例基于VxWorks 7 + Safety Profile(启用分区调度)。需要以下组件:

  • VxWorks 7 工程(含 INCLUDE_SMP 或单核均可,分区调度在单核下同样生效)
  • 已创建两个分区:partitionA、partitionB
  • 分区调度使能:在VIP中配置 CONFIGURE_PARTITION_SCHEDULER

核心实现

以下代码在系统启动后动态创建两个分区并设置CPU配额,每个分区内运行一个统计任务,通过累加运行时间计算实际CPU占用率。

/* 分区CPU配额配置与验证示例 */
#include <vxWorks.h>
#include <partition.h>
#include <taskLib.h>
#include <tickLib.h>
#include <stdio.h>

/* 分区句柄 */
PARTITION_ID partA, partB;

/* 统计任务:累加自身运行时间 */
static void statsTask(void *arg)
{
    int *counter = (int *)arg;
    while (1)
    {
        *counter += 1;  /* 忙等计数,占用CPU */
        taskDelay(0);   /* 让出CPU,但不睡眠 */
    }
}

/* 统计周期(秒) */
#define STATS_INTERVAL  10

/* 验证函数:运行10秒后打印各分区CPU占用率 */
void verifyCpuQuota(void)
{
    int countA = 0, countB = 0;
    int ticksPerSec = sysClkRateGet();
    int totalTicks = STATS_INTERVAL * ticksPerSec;

    /* 创建分区A:配额70% */
    partA = partitionCreate("partitionA", 0x10000, 0);
    if (partA == NULL) { printf("create A failed\n"); return; }
    partitionQuotaSet(partA, 70);

    /* 创建分区B:配额30% */
    partB = partitionCreate("partitionB", 0x10000, 0);
    if (partB == NULL) { printf("create B failed\n"); return; }
    partitionQuotaSet(partB, 30);

    /* 在每个分区内创建统计任务 */
    taskSpawnToPartition(partA, "tStatsA", 100, 0, 0x2000,
                         (FUNCPTR)statsTask, &countA, 0,0,0,0,0,0,0,0);
    taskSpawnToPartition(partB, "tStatsB", 100, 0, 0x2000,
                         (FUNCPTR)statsTask, &countB, 0,0,0,0,0,0,0,0);

    /* 等待统计周期结束 */
    taskDelay(totalTicks);

    /* 计算并打印结果 */
    int total = countA + countB;
    if (total > 0)
    {
        printf("Partition A CPU: %d%%\n", (countA * 100) / total);
        printf("Partition B CPU: %d%%\n", (countB * 100) / total);
    }
    else
    {
        printf("No CPU activity detected\n");
    }
}

运行与验证

  1. 将上述代码加入VxWorks工程,编译生成VxWorks镜像。
  2. 启动目标机,在shell中调用:
    verifyCpuQuota
  3. 观察输出:
Partition A CPU: 70%
Partition B CPU: 30%

通过条件:实际统计值在配额±5%范围内(即A在65%~75%,B在25%~35%),且多次运行结果稳定。若偏差超过5%,检查分区调度是否使能、配额设置是否生效。

关键说明

  • partitionQuotaSet() 的配额参数为整数百分比,所有分区配额之和应≤100,剩余CPU归系统分区。
  • taskSpawnToPartition() 用于在指定分区内创建任务,任务继承分区的调度属性。
  • 统计任务使用忙等循环(taskDelay(0))确保持续占用CPU,从而反映配额分配效果。
  • 若系统为SMP模式,分区调度同样按配额分配CPU时间,但统计结果可能受多核并发影响,建议在单核或绑定CPU的场景下验证。