1. 配置基本安全分区

任务目标

在VxWorks 7环境中创建两个安全分区(Safety Partition),并为每个分区配置独立的内存区域与CPU亲和性,实现分区间的资源隔离。本案例聚焦于最小可运行的分区配置闭环,不涉及分区内应用逻辑。

环境依赖

  • VxWorks 7(版本≥22.09)
  • 支持分区调度的多核处理器(本案例以4核为例)
  • 已启用INCLUDE_SMP与INCLUDE_PARTITION组件的VIP(VxWorks Image Project)

实现代码

以下代码在VxWorks内核启动后的初始化任务中执行,完成两个分区的创建与隔离参数配置:

#include <vxWorks.h>
#include <partition.h>
#include <memPartLib.h>
#include <taskLib.h>

/* 分区内存池大小:分区0为4MB,分区1为2MB */
#define PART0_MEM_SIZE  (4 * 1024 * 1024)
#define PART1_MEM_SIZE  (2 * 1024 * 1024)

/* 分区CPU亲和性掩码:分区0使用CPU0-1,分区1使用CPU2-3 */
#define PART0_CPU_MASK  0x03
#define PART1_CPU_MASK  0x0C

static PARTITION_ID part0Id = NULL;
static PARTITION_ID part1Id = NULL;

STATUS safetyPartitionInit(void)
{
    /* 创建分区0:独立内存池 + CPU亲和性 */
    part0Id = partitionCreate("safetyPart0", PART0_MEM_SIZE, PART0_CPU_MASK);
    if (part0Id == NULL)
    {
        return ERROR;
    }

    /* 创建分区1:独立内存池 + CPU亲和性 */
    part1Id = partitionCreate("safetyPart1", PART1_MEM_SIZE, PART1_CPU_MASK);
    if (part1Id == NULL)
    {
        partitionDelete(part0Id);
        return ERROR;
    }

    /* 验证分区已正确创建 */
    if ((partitionCpuAffinityGet(part0Id) != PART0_CPU_MASK) ||
        (partitionCpuAffinityGet(part1Id) != PART1_CPU_MASK))
    {
        return ERROR;
    }

    return OK;
}

/* 分区创建辅助函数:封装内存池与CPU亲和性设置 */
PARTITION_ID partitionCreate(const char *name, size_t memSize, UINT32 cpuMask)
{
    PARTITION_ID partId;
    void *memPool;

    /* 从系统堆中分配独立内存池 */
    memPool = malloc(memSize);
    if (memPool == NULL)
    {
        return NULL;
    }

    /* 创建分区并绑定内存池 */
    partId = partitionCreateWithMem(name, memPool, memSize);
    if (partId == NULL)
    {
        free(memPool);
        return NULL;
    }

    /* 设置CPU亲和性 */
    if (partitionCpuAffinitySet(partId, cpuMask) != OK)
    {
        partitionDelete(partId);
        free(memPool);
        return NULL;
    }

    return partId;
}

运行与验证

  1. 将上述代码添加到VxWorks内核的usrAppInit.c中,并在usrAppInit()内调用safetyPartitionInit()。
  2. 编译并启动VxWorks镜像。
  3. 在VxWorks shell中执行以下命令验证分区状态:
-> partitionShow

预期输出应显示两个分区:safetyPart0(内存池4MB,CPU亲和性0-1)和safetyPart1(内存池2MB,CPU亲和性2-3)。

通过条件:

  • partitionShow输出中包含两个分区名称及对应的内存大小。
  • 两个分区的CPU亲和性掩码分别为0x03和0x0C。
  • 系统无内存分配失败或分区创建错误日志。

关键说明

  • partitionCreateWithMem是VxWorks提供的底层分区创建接口,本案例通过partitionCreate封装了内存分配与亲和性设置的完整流程。
  • 分区内任务调度默认使用与分区绑定的CPU集合,无需额外配置。
  • 若需删除分区,调用partitionDelete(partId)即可,分区内任务会被终止。