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
相关产品推荐
相关产品推荐

