创建文件映射时出现Error code 0xC1的问题排查与解决
Xilinx FPGA设备内存映射CreateFileMapping报错0xC1问题分析与修复
问题背景
使用基于Xilinx的FPGA板卡,LED硬件地址为0x40000,Windows 11已正确识别驱动,通过WriteFile直接读写设备文件可正常控制LED开关,但尝试通过CreateFileMapping将设备文件映射到内存时,在调用CreateFileMapping处返回NULL句柄,错误码为0xC1,错误信息显示"%1 is not a valid Win32 application."
测试核心代码片段:
// 尝试内存映射设备文件 size_t mapping_size = sizeof(DWORD); DWORD dwMaximumSizeHigh = (LED_Addr + mapping_size) >> 32; DWORD dwMaximumSizeLow = (LED_Addr + mapping_size) & 0xFFFFFFFF; HANDLE file_mapping_handle_ = ::CreateFileMapping( file_handle, 0, PAGE_READWRITE, dwMaximumSizeHigh, dwMaximumSizeLow, 0); if (file_mapping_handle_ == NULL) { DWORD error = GetLastError(); auto message = error_message(error); return -1; }
错误码0xC1的含义
错误码0xC1对应系统定义的ERROR_BAD_EXE_FORMAT,原含义是"不是有效的Win32应用程序",但此处属于系统错误信息的复用——实际并非应用程序格式问题,而是设备驱动不支持内存映射操作导致的错误反馈。
问题原因
Xilinx XDMA驱动提供的\\user设备通道不支持内存映射(CreateFileMapping/MapViewOfFile)机制:
\\user通道属于字符设备,仅支持基础的读写(ReadFile/WriteFile)、指针定位(SetFilePointer)操作,驱动未实现内存映射所需的回调接口。CreateFileMapping主要针对磁盘文件或专门支持映射的设备(如内存映射类设备),传入字符设备句柄时,驱动无法响应该操作,因此返回错误码0xC1。
修复方案
方案1:保留直接读写方式(已验证可行)
继续使用测试代码中已生效的SetFilePointer+WriteFile组合控制LED,这是XDMA \\user通道的标准用法:
// 定位到LED硬件地址 DWORD dwPos = SetFilePointer(file_handle, LED_Addr, NULL, FILE_BEGIN); if (dwPos == INVALID_SET_FILE_POINTER) { printf("SetFilePointer Error"); return -1; } // 写入LED控制值 DWORD bytesWritten; if (!WriteFile(file_handle, &LED_ON, sizeof(DWORD), &bytesWritten, NULL)) { DWORD error = GetLastError(); std::string message = error_message(error); std::cout << "Error code: " << error << std::endl; std::cout << "Error message: " << message << std::endl; return -1; }
方案2:切换到XDMA的MMAP通道(需硬件/驱动支持)
若FPGA板卡和XDMA驱动支持mmap通道,可替换设备路径为\\mmap,该通道专门用于内存映射访问:
// 修改通道路径为mmap string channelPath = devicePaths[0] + "\\mmap";
注意事项:
- 需确认XDMA驱动版本支持mmap通道,可查阅Xilinx官方文档。
- 硬件端需配置AXI映射区域,确保0x40000地址在mmap通道的映射范围内。
内容的提问来源于stack exchange,提问作者mans
相关产品推荐
相关产品推荐

