2. 配置分区调度表
任务说明
在VxWorks ARINC 653环境中,分区调度表(Partition Schedule)定义了各分区在MAF(Major Frame)周期内的执行窗口。本案例为两个分区(P1、P2)配置周期性调度表,设置窗口长度与偏移,并通过系统调用验证调度配置的正确性。
核心实现
/* 配置文件:partition_schedule.c */
#include <vxWorks.h>
#include <arinc653.h>
/* 分区ID定义 */
#define P1_ID 1
#define P2_ID 2
/* MAF周期:200ms,窗口长度单位:ms */
#define MAF_PERIOD_MS 200
#define P1_WINDOW_LENGTH 120
#define P1_WINDOW_OFFSET 0
#define P2_WINDOW_LENGTH 80
#define P2_WINDOW_OFFSET 120
/* 调度表条目数(2个分区各1个窗口) */
#define SCHEDULE_ENTRIES 2
/* 分区调度表配置 */
static SCHEDULING_TABLE g_partitionSchedule[SCHEDULE_ENTRIES] = {
{
.partitionId = P1_ID,
.windowStart = P1_WINDOW_OFFSET,
.windowDuration = P1_WINDOW_LENGTH
},
{
.partitionId = P2_ID,
.windowStart = P2_WINDOW_OFFSET,
.windowDuration = P2_WINDOW_LENGTH
}
};
/* 验证调度表配置 */
static STATUS verifyScheduleConfig(void)
{
SCHEDULING_TABLE currentTable[SCHEDULE_ENTRIES];
SYSTEM_STATUS sysStatus;
STATUS result;
/* 获取当前系统调度表 */
result = GET_SYSTEM_STATUS(&sysStatus);
if (result != OK) {
printf("ERROR: GET_SYSTEM_STATUS failed\n");
return ERROR;
}
/* 读取实际生效的调度表 */
result = GET_PARTITION_SCHEDULE(currentTable, SCHEDULE_ENTRIES);
if (result != OK) {
printf("ERROR: GET_PARTITION_SCHEDULE failed\n");
return ERROR;
}
/* 逐项比对配置 */
for (int i = 0; i < SCHEDULE_ENTRIES; i++) {
if (currentTable[i].partitionId != g_partitionSchedule[i].partitionId ||
currentTable[i].windowStart != g_partitionSchedule[i].windowStart ||
currentTable[i].windowDuration != g_partitionSchedule[i].windowDuration) {
printf("ERROR: Schedule entry %d mismatch\n", i);
return ERROR;
}
}
printf("Schedule verification PASSED: %d entries, MAF=%dms\n",
SCHEDULE_ENTRIES, sysStatus.maf);
return OK;
}
/* 应用调度表并验证 */
void configurePartitionSchedule(void)
{
STATUS result;
/* 将调度表写入系统 */
result = SET_PARTITION_SCHEDULE(g_partitionSchedule, SCHEDULE_ENTRIES);
if (result != OK) {
printf("ERROR: SET_PARTITION_SCHEDULE failed (code=%d)\n", result);
return;
}
/* 执行验证 */
if (verifyScheduleConfig() == OK) {
printf("Partition schedule configured successfully\n");
}
}
构建与运行
- 将上述代码加入VxWorks ARINC653工程,确保包含
arinc653.h头文件路径。 - 编译生成可加载模块(.out文件)。
- 在VxWorks shell中加载模块并调用:
ld < partition_schedule.out
configurePartitionSchedule
验证方法
执行configurePartitionSchedule后,观察串口输出:
- 若配置成功且验证通过,输出:
Schedule verification PASSED: 2 entries, MAF=200ms及Partition schedule configured successfully。 - 若任一窗口参数与配置不符,输出对应
ERROR信息,需检查窗口偏移与长度是否满足MAF约束(P1窗口0~120ms,P2窗口120~200ms,无重叠且覆盖完整MAF周期)。
判定标准:所有校验项返回OK,且无ERROR输出,即证明调度表已正确配置并生效。
上图展示了本案例配置的调度时序:P1在0~120ms窗口执行,P2在120~200ms窗口执行,两窗口无缝衔接覆盖完整MAF周期,无重叠或空闲间隙。