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(),该函数应在系统启动早期、分区尚未开始执行前完成调用。
验证方法:
- 在
PARTITION_1的入口函数中记录时间戳T1_start,在窗口结束前记录T1_end;同样在PARTITION_2中记录T2_start和T2_end。 - 通过串口或日志输出这些时间戳,检查以下条件:
预期输出(基于代码逻辑推导):
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精度不足导致验证误差。