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;
}
运行与验证
- 将上述代码添加到VxWorks内核的
usrAppInit.c中,并在usrAppInit()内调用safetyPartitionInit()。 - 编译并启动VxWorks镜像。
- 在VxWorks shell中执行以下命令验证分区状态:
-> partitionShow
预期输出应显示两个分区:safetyPart0(内存池4MB,CPU亲和性0-1)和safetyPart1(内存池2MB,CPU亲和性2-3)。
通过条件:
partitionShow输出中包含两个分区名称及对应的内存大小。- 两个分区的CPU亲和性掩码分别为
0x03和0x0C。 - 系统无内存分配失败或分区创建错误日志。
关键说明
partitionCreateWithMem是VxWorks提供的底层分区创建接口,本案例通过partitionCreate封装了内存分配与亲和性设置的完整流程。- 分区内任务调度默认使用与分区绑定的CPU集合,无需额外配置。
- 若需删除分区,调用
partitionDelete(partId)即可,分区内任务会被终止。