You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VXWorks 6.9 DKM项目shm_open符号未解析问题求助

解决VXWorks 6.9 DKM项目中shm_open未解析符号问题

问题背景

  • 基于三菱Melsec R12CCPU-V PLC,使用WindRiver 3.3的CW Workbench开发VXWorks 6.9的DKM(可下载内核模块)项目,采用C++语言
  • 尝试通过shm_open()和mmap()实现多任务间共享内存,编译无错误,但下载调试时出现shm_open unresolved symbol list警告
  • PLC硬件支持INCLUDE_POSIX_SHM和INCLUDE_POSIX_MAPPED_FILES组件,已尝试在configAll.h中添加相关配置但未生效,且无法找到编辑VXWorks镜像或BSP的途径

代码示例

#include <vxWorks.h>
#include <stdio.h>
#include <string.h>
#include <sysLib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>

int producer ()
{
    int   fd;
    int   ix;
    int * pData;
    
    /* create a new SHM object */
    fd = shm_open("/myshm", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);

    if (fd == -1)
        exit (1);

    /* set object size */
    if (ftruncate (fd, 0x1000) == -1)
        exit (1);

    /* Map shared memory object in the address space of the process */
    pData = (int *) mmap (0, 0x1000,  PROT_READ | PROT_WRITE, 
                          MAP_SHARED, fd, 0);

    if (pData == (int *) MAP_FAILED)
        exit (1);

    /* close the file descriptor; the mapping is not impacted by this */
    close (fd);

    /* The mapped image can now be written via the pData pointer */
    for (ix = 0; ix < 25; ix++)
        *(pData + ix) = ix;

    /* unmap shared memory object */
    munmap ((void *)pData, 0x1000);
}

解决方案

1. 修正DKM项目的链接库配置

在CW Workbench中操作:

  • 右键DKM项目 → Properties → VxWorks Linker → Libraries
  • 添加posixShm和posixMappedFiles两个库(对应POSIX共享内存和内存映射文件组件)
  • 或者直接在项目的Makefile中手动添加链接选项:-lposixShm -lposixMappedFiles

2. 确保configAll.h配置正确且生效

  • 检查配置项拼写:原问题中INLUDE_POSIX_MAPPED_FILES是拼写错误,需改为#define INCLUDE_POSIX_MAPPED_FILES,同时添加#define INCLUDE_POSIX_SHM
  • 确认configAll.h被包含在项目编译路径中,没有被其他优先级更高的配置文件覆盖

3. 确认目标VXWorks镜像包含所需组件

由于部分嵌入式PLC的VXWorks镜像是预编译的,无法直接编辑BSP或镜像:

  • 联系PLC供应商或系统管理员,确认目标系统的VXWorks镜像已编译并包含INCLUDE_POSIX_SHM和INCLUDE_POSIX_MAPPED_FILES组件
  • 若供应商提供了镜像配置工具,通过工具启用这两个组件后重新生成镜像

4. 替代方案:使用VXWorks原生共享内存API

如果POSIX接口始终无法生效,可改用VXWorks内核原生的共享内存函数,无需依赖POSIX组件:

  • 核心函数:smMemCreate()(创建共享内存)、smMemOpen()(打开共享内存)、smMemMap()(映射共享内存到地址空间)
  • 原生API与VXWorks内核兼容性更好,适合嵌入式PLC场景

内容的提问来源于stack exchange,提问作者thangmn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:54:51