2. 配置分区周期与窗口

任务目标

在ARINC 653分区操作系统中,分区调度由主时间框架(Major Time Frame)决定。本案例要求为两个分区分别配置周期(窗口起始时间)与窗口长度,使它们在一个主时间框架内按固定顺序执行,并验证调度配置正确性。

核心概念

ARINC 653使用窗口(Window)作为分区获得CPU时间的基本单位。每个窗口由两个参数决定:起始偏移(Offset)和持续时间(Duration)。所有窗口必须落在主时间框架内,且同一框架内窗口不得重叠。分区周期即该分区窗口在主时间框架中的重复间隔。

实现代码

以下代码基于VxWorks 653平台API,配置一个包含两个分区(P1、P2)的主时间框架,主框架长度为40ms:

#include <vxWorks.h>
#include <arinc653.h>

/* 主时间框架长度(毫秒) */
#define MAJOR_FRAME_MS   40

/* 分区窗口配置 */
static WINDOW_T p1Window = {0, 20};   /* P1: 偏移0ms,持续20ms */
static WINDOW_T p2Window = {20, 20};  /* P2: 偏移20ms,持续20ms */

/* 窗口配置表(按时间顺序排列) */
static WINDOW_T *windowTable[] = {
    &p1Window,
    &p2Window
};

/* 分区ID */
static PARTITION_ID_T p1Id, p2Id;

STATUS configurePartitionSchedule(void)
{
    /* 创建两个分区 */
    p1Id = PARTITION_CREATE("PARTITION_1", 0, 0);
    p2Id = PARTITION_CREATE("PARTITION_2", 0, 0);
    if (p1Id == INVALID_PARTITION_ID || p2Id == INVALID_PARTITION_ID) {
        return ERROR;
    }

    /* 设置主时间框架 */
    if (SET_MAJOR_FRAME(MAJOR_FRAME_MS) != OK) {
        return ERROR;
    }

    /* 将窗口绑定到分区 */
    if (WINDOW_BIND(p1Id, &p1Window) != OK) {
        return ERROR;
    }
    if (WINDOW_BIND(p2Id, &p2Window) != OK) {
        return ERROR;
    }

    /* 启动调度 */
    if (START_SCHEDULER(windowTable, 2) != OK) {
        return ERROR;
    }

    return OK;
}

运行与验证

编译与链接:在VxWorks 653开发环境中,将上述代码编译为可加载模块,并确保系统镜像包含ARINC 653核心模块支持。

调用方式:在应用初始化代码中调用configurePartitionSchedule(),该函数应在系统启动早期、分区尚未开始执行前完成调用。

验证方法:

  1. 在PARTITION_1的入口函数中记录时间戳T1_start,在窗口结束前记录T1_end;同样在PARTITION_2中记录T2_start和T2_end。
  2. 通过串口或日志输出这些时间戳,检查以下条件:
预期输出(基于代码逻辑推导):
T1_start - T1_end 的差值 ≈ 20ms
T2_start - T2_end 的差值 ≈ 20ms
T2_start 应晚于 T1_end(无重叠)
主框架周期为40ms,即每40ms P1和P2各执行一次

通过判定标准:若实际观测到的时间差与窗口配置一致(允许±1ms系统调度误差),且两个窗口无重叠、按P1→P2顺序循环执行,则调度配置正确。

常见问题

  • 窗口重叠:若两个窗口的偏移与持续时间之和超过主框架长度,系统启动调度时将返回错误。检查START_SCHEDULER返回值。
  • 分区ID无效:确认PARTITION_CREATE参数正确,且系统资源足够创建两个分区。
  • 时间戳精度:使用tickGet()或高精度定时器获取时间,避免系统Tick精度不足导致验证误差。