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");
    }
}

构建与运行

  1. 将上述代码加入VxWorks ARINC653工程,确保包含arinc653.h头文件路径。
  2. 编译生成可加载模块(.out文件)。
  3. 在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输出,即证明调度表已正确配置并生效。

MAF = 200ms P1 (120ms) P2 (80ms) 0 120 200

上图展示了本案例配置的调度时序:P1在0~120ms窗口执行,P2在120~200ms窗口执行,两窗口无缝衔接覆盖完整MAF周期,无重叠或空闲间隙。