Windows下的mmap——Windows环境下模拟嵌入式Flash一法

嵌入式系统下,Flash数据往往可以拿着地址直接访问,就好象用内存指针一样。同时我们常常在windows下搭建模拟环境开发嵌入式产品,这就需要模拟这种特征。
       Linux可以用mmap把一个文件映射到一段内存上,让文件也差不多跟Flash一样可以拿地址直接指访问。
       以下是在Windows下执行相同目地的参考代码,用的是进行进程通讯的内存共享的函数,但Google出来的结果以用于内存共享的居多,此法甚少,虽然差别不大,但权且记下,以作日后参考,更详细的用法msdn,Google都多多很,不再复述。

#include <windows.h>
#include <stdio.h>

#define FLASH_SIZE        1024*1024*4
#define COPY_DATA        "Hello"

int main(int argc,char* argv[])
{
    //以读写方式打开,保证flash能读能写
    HANDLE fileHandle = CreateFile("Flash.bin",GENERIC_READ | GENERIC_WRITE ,
        0,0,OPEN_ALWAYS,0,0);
    if(fileHandle != NULL)
    {
        //以只读方式映射,整个文件,因为Flash只能当内存读,不能当内存写
        HANDLE hMapping = CreateFileMapping(fileHandle,0,PAGE_READONLY,0,
            FLASH_SIZE,"CSFlash");
        if(hMapping)
        {
            //以只读方式映射其中的FLASH_SIZE大小
            LPSTR lpData = (LPS TR)MapViewOfFile(hMapping,FILE_MAP_READ,0,0,FLASH_SIZE);
           
            //此后,我们可以拿文件句柄操作文件,用以实现Flash读写接口等
            unsigned long size = 0;
            WriteFile(fileHandle,COPY_DATA,sizeof(COPY_DATA),&size,0);

            //也可以拿指针进行操作

            //不能拷贝,因为Flash也不支持这么用
            //memcpy(lpData,COPY_DATA,sizeof(COPY_DATA));
           
            //但可以读
            printf(lpData);

            //关闭映射,进程退出时,会自动进行
            //UnmapViewOfFile(lpData);
            //CloseHandle(hMapping);
            //CloseHandle(fileHandle);
        }
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 操作系统中,mmap 函数可以使用 MapViewOfFile 函数来实现。mmap 函数通常在 Unix/Linux 系统中使用,用于将文件映射到内存中,以便于随机访问文件中的内容。Windows 中的 MapViewOfFile 函数也有类似的功能,它将文件映射到进程的地址空间中,允许进程直接访问文件内容,而无需通过 read、write 等系统调用。 使用 MapViewOfFile 函数需要先通过 CreateFile 函数打开文件,然后通过 CreateFileMapping 函数创建文件映射对象。最后,通过 MapViewOfFile 函数将文件映射到进程的地址空间中。如果需要对映射区域进行读写操作,可以使用指针来进行访问。 以下是使用 mmap 函数实现将文件映射到内存中的示例代码: ``` #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { int fd; void *addr; struct stat sb; fd = open("file.txt", O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } if (fstat(fd, &sb) == -1) { perror("fstat"); exit(EXIT_FAILURE); } addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (addr == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } printf("%s", (char *)addr); if (munmap(addr, sb.st_size) == -1) { perror("munmap"); exit(EXIT_FAILURE); } close(fd); return 0; } ``` 在 Windows 中,可以使用 MapViewOfFile 函数实现类似的功能。以下是将文件映射到内存中并读取文件内容的示例代码: ``` #include <windows.h> #include <stdio.h> #include <stdlib.h> int main() { HANDLE hFile; HANDLE hMapFile; LPVOID lpMapAddress; DWORD dwFileSize; hFile = CreateFile("file.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { perror("CreateFile"); exit(EXIT_FAILURE); } dwFileSize = GetFileSize(hFile, NULL); if (dwFileSize == INVALID_FILE_SIZE) { perror("GetFileSize"); exit(EXIT_FAILURE); } hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL); if (hMapFile == NULL) { perror("CreateFileMapping"); exit(EXIT_FAILURE); } lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwFileSize); if (lpMapAddress == NULL) { perror("MapViewOfFile"); exit(EXIT_FAILURE); } printf("%s", (char *)lpMapAddress); if (UnmapViewOfFile(lpMapAddress) == 0) { perror("UnmapViewOfFile"); exit(EXIT_FAILURE); } if (CloseHandle(hMapFile) == 0) { perror("CloseHandle"); exit(EXIT_FAILURE); } if (CloseHandle(hFile) == 0) { perror("CloseHandle"); exit(EXIT_FAILURE); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值