1. 创建第一个ARINC653分区

任务目标

在VxWorks 7环境中,通过ARINC653 API创建一个名为P1的简单分区,配置其标识符、周期与容量等基本属性,并成功启动该分区。本案例聚焦于分区创建与启动的最小可复现闭环,不涉及分区内的进程调度细节。

环境与依赖

  • VxWorks 7(含ARINC653组件,如INCLUDE_ARINC653)
  • Wind River Workbench或VxWorks内核工程
  • 目标机架构:x86/ARM(本案例与架构无关)

实现代码

以下代码在系统启动后(如usrAppInit中)调用,完成分区创建、属性配置与启动。使用ARINC653标准API(CreatePartition、GetPartitionStatus、Start)。

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

#define P1_ID            1
#define P1_PERIOD        1000000    /* 1秒,单位微秒 */
#define P1_DURATION      500000     /* 0.5秒,单位微秒 */
#define P1_IDENTIFIER    "P1"

STATUS createAndStartPartition(void)
{
    STATUS          status;
    PARTITION_ID    p1Id;
    PARTITION_STATUS pStatus;

    /* 1. 创建分区 */
    p1Id = P1_ID;
    status = CreatePartition(P1_IDENTIFIER, P1_PERIOD, P1_DURATION, &p1Id);
    if (status != OK) {
        printf("CreatePartition failed: 0x%x\n", status);
        return ERROR;
    }
    printf("Partition %s created, ID=%d\n", P1_IDENTIFIER, p1Id);

    /* 2. 查询分区状态,确认已创建且处于初始化状态 */
    status = GetPartitionStatus(p1Id, &pStatus);
    if (status != OK) {
        printf("GetPartitionStatus failed: 0x%x\n", status);
        return ERROR;
    }
    printf("Partition state before start: %d\n", pStatus.PARTITION_STATE);

    /* 3. 启动分区 */
    status = Start(p1Id);
    if (status != OK) {
        printf("Start failed: 0x%x\n", status);
        return ERROR;
    }
    printf("Partition %s started successfully\n", P1_IDENTIFIER);

    return OK;
}

运行与验证

  1. 将上述代码添加到VxWorks内核工程的应用源文件中,并在启动任务中调用createAndStartPartition()。
  2. 编译并下载到目标机,观察串口/控制台输出。
  3. 通过条件:依次看到以下输出,且无错误码:
Partition P1 created, ID=1
Partition state before start: 0   (或对应初始化状态值)
Partition P1 started successfully

若CreatePartition返回错误,检查ARINC653组件是否已包含在VxWorks镜像中;若Start失败,确认分区状态为NORMAL或INIT(即未处于COLD_START/WARM_START等异常状态)。

关键说明

  • CreatePartition的第三个参数DURATION表示分区在每个周期内的执行窗口长度,必须小于等于周期值。
  • 分区ID由系统分配,传入的p1Id为期望ID(此处为1),实际ID以输出为准。
  • 本案例仅验证分区创建与启动,分区内进程的创建与调度将在后续案例中展开。