Windows 实时操作系统 RTX64 3.6 学习(二)
VS2015共享内存
一、写内存端代码:
1. 创建共享内存
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 匿名共享内存(仅用名称标识)
NULL, // 默认安全属性
PAGE_READWRITE, // 读写权限
0, // 高32位大小(0)
SHARED_MEM_SIZE, // 低32位大小(1025字节)
_T("TestSharedMem") // 共享内存名称(全局唯一)
);
2. 映射共享内存到当前进程地址空间
pBuf = MapViewOfFile(
hMapFile, // 共享内存句柄
FILE_MAP_ALL_ACCESS, // 读写权限
0, 0, // 偏移量(0)
SHARED_MEM_SIZE // 映射大小(与创建大小一致)
);
3. 写入数据,初始化标志位置0(未读取)
*(char*)((BYTE*)pBuf + FLAG_OFFSET) = FLAG_UNREAD; // 标志位初始化
_tcscpy((TCHAR*)((BYTE*)pBuf + DATA_OFFSET), szData); // 写入数据
4. 等待读程序读取(轮询标志位)
while (*(char*)((BYTE*)pBuf + FLAG_OFFSET) != FLAG_READ)
{ Sleep(100); // 每100ms轮询一次,减少CPU占用 }
5. 清理资源
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
二、读内存端代码:
1. 打开已创建的共享内存(名称必须与写程序一致)
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 读写权限
FALSE, // 不继承句柄
_T("TestSharedMem") // 共享内存名称(与写程序一致)
);
2. 映射共享内存到当前进程
pBuf = MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0, 0,
SHARED_MEM_SIZE // 必须与写程序的1025字节一致
);
3. 读取数据(跳过标志位)
TCHAR* szData = (TCHAR*)((BYTE*)pBuf + DATA_OFFSET);
4. 设置标志位为1,通知写程序
*(char*)((BYTE*)pBuf + FLAG_OFFSET) = FLAG_READ;
5. 清理资源
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
示例代码参考:download.csdn.net/download/qq_34492056/93094280?spm=1001.2014.3001.5503
先运行写端代码,再运行读端代码,运行结果如下图:


openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)