3. 实现分区内多进程调度

任务目标

在ARINC 653分区内创建多个进程,为每个进程设置优先级与调度策略,并通过周期调度验证进程按优先级抢占执行。本案例基于分区操作系统调度器(如VxWorks 653或PikeOS原生接口)实现分区内多进程的创建与调度属性配置。

核心实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arinc653.h>

/* 进程入口函数 */
static void PROCESS_LOW(void) {
    while (1) {
        printf("[LOW] running\n");
        WAITING(10);  /* 释放CPU,等待下一周期 */
    }
}

static void PROCESS_MID(void) {
    while (1) {
        printf("[MID] running\n");
        WAITING(10);
    }
}

static void PROCESS_HIGH(void) {
    while (1) {
        printf("[HIGH] running\n");
        WAITING(10);
    }
}

int main(void) {
    PROCESS_ATTRIBUTE_TYPE attr;
    PROCESS_ID_TYPE pid_low, pid_mid, pid_high;
    SYSTEM_TIME_TYPE period = 100;  /* 主时间帧100ms */
    RETURN_CODE_TYPE ret;

    /* 初始化分区 */
    CONFIGURATION_MANAGER_INIT(&ret);
    if (ret != NO_ERROR) return -1;

    /* 创建低优先级进程 */
    memset(&attr, 0, sizeof(attr));
    strcpy(attr.NAME, "LOW_PROC");
    attr.ENTRY_POINT = PROCESS_LOW;
    attr.BASE_PRIORITY = 30;        /* 低优先级 */
    attr.PERIOD = period;
    attr.TIME_CAPACITY = 20;        /* 每周期最大执行20ms */
    attr.STACK_SIZE = 4096;
    attr.DEADLINE = HARD;
    CREATE_PROCESS(&attr, &pid_low, &ret);
    if (ret != NO_ERROR) return -1;

    /* 创建中优先级进程 */
    memset(&attr, 0, sizeof(attr));
    strcpy(attr.NAME, "MID_PROC");
    attr.ENTRY_POINT = PROCESS_MID;
    attr.BASE_PRIORITY = 20;        /* 中优先级 */
    attr.PERIOD = period;
    attr.TIME_CAPACITY = 20;
    attr.STACK_SIZE = 4096;
    attr.DEADLINE = HARD;
    CREATE_PROCESS(&attr, &pid_mid, &ret);
    if (ret != NO_ERROR) return -1;

    /* 创建高优先级进程 */
    memset(&attr, 0, sizeof(attr));
    strcpy(attr.NAME, "HIGH_PROC");
    attr.ENTRY_POINT = PROCESS_HIGH;
    attr.BASE_PRIORITY = 10;        /* 高优先级(数值小优先级高) */
    attr.PERIOD = period;
    attr.TIME_CAPACITY = 20;
    attr.STACK_SIZE = 4096;
    attr.DEADLINE = HARD;
    CREATE_PROCESS(&attr, &pid_high, &ret);
    if (ret != NO_ERROR) return -1;

    /* 启动所有进程 */
    START(pid_low, &ret);
    START(pid_mid, &ret);
    START(pid_high, &ret);

    /* 分区主循环 */
    while (1) {
        WAITING(period);
    }
    return 0;
}

调度策略说明

ARINC 653分区内默认采用固定优先级抢占式调度。数值越小的优先级值代表越高的调度优先级。当高优先级进程就绪时,低优先级进程立即被抢占;同优先级进程按时间片轮转。本案例中三个进程周期相同(100ms),每周期内高优先级进程先执行,随后中优先级,最后低优先级。

编译与运行

  1. 依赖环境:需要ARINC 653分区操作系统(如VxWorks 653、PikeOS)及其开发工具链。本代码使用标准ARINC 653 API,可直接在目标分区中编译。
  2. 编译命令(以VxWorks 653为例):
    cc -c partition_sched.c -o partition_sched.o
    ld -r partition_sched.o -o partition_sched.out
  3. 集成:将生成的partition_sched.out链接到分区配置中,确保分区主时间帧设为100ms。

验证方法

运行分区后,观察串口输出。预期输出顺序为:

[HIGH] running
[MID] running
[LOW] running
[HIGH] running
[MID] running
[LOW] running
...

通过条件:输出严格按HIGH→MID→LOW循环重复,且每个进程每100ms周期内执行一次。若出现顺序错乱或某进程长期得不到执行,则说明优先级设置或调度配置有误。

常见问题

  • 进程不执行:检查START是否调用,以及进程入口函数是否包含死循环(ARINC 653周期进程不允许返回)。
  • 优先级不生效:确认BASE_PRIORITY数值设置正确(小值高优先级),且分区调度器配置为抢占模式。
  • 时间容量不足:若进程内printf耗时超过TIME_CAPACITY,进程会被挂起。可增大容量或减少打印频率。