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");
}
}
运行与验证
- 将上述代码加入VxWorks工程,编译生成VxWorks镜像。
- 启动目标机,在shell中调用:
verifyCpuQuota - 观察输出:
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的场景下验证。