英創WinCE工控主板在系統后,會實時測量主板供電電壓、主板溫度以及CPU溫度等參數,并保存到指定的內存映射文件對像中,應用程序可通過相應的內存映射文件對像快速訪問這些硬件參數。下表是系統目前支持的硬件參數項以及對應的內存映射文件對像名稱。
硬件參數 | 內存映射文件對像名稱 | 數據更新頻率 |
CPU溫度 | L"\\hwmon\\CPUTEMP" | 5次/秒 |
主板溫度 | L"\\hwmon\\BoardTEMP" | 1次/秒 |
主板供電電壓 | L"\\hwmon\\vcc" | 1次/秒 |
內存映射文件提供一種完全不同的讀寫文件的方法,它是將文件內容映射到內存中的某個區域,讀寫文件直接操作內存即可,操作十分簡介、高效。以獲取ESM7000工控主板CPU溫度值為例的操作流程如下:
1、使用CreateFileMapping函數打開名稱為L"\\hwmon\\CPUTEMP"的內存映射文件對像,如果返回失敗則表明系統不支持當前參數。
2、通過MapViewOfFile函數獲取內存映射文件對像的數據內存指針。
3、讀取指針內容獲取CPU溫度值。
4、操作結束后使用UnmapViewOfFile函數取消內存視圖映射。
5、關閉之前CreateFileMapping函數打開的文件句柄。
完整的操作代碼如下:
#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { HANDLE hMapFile1, hMapFile2, hMapFile3; BYTE *pData1 = NULL, *pData2 = NULL, *pData3 = NULL; INT32 dwVcc = 0, dwBoardTEMP = 0, dwCPUTEMP = 0, i; TCHAR szBuf[128]; hMapFile1 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\vcc"); if(hMapFile1 != NULL && GetLastError() == ERROR_ALREADY_EXISTS) pData1 = (BYTE *)MapViewOfFile(hMapFile1, FILE_MAP_READ, 0, 0, 64); hMapFile2 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\BoardTEMP"); if(hMapFile2 != NULL && GetLastError() == ERROR_ALREADY_EXISTS) pData2 = (BYTE *)MapViewOfFile(hMapFile2, FILE_MAP_READ, 0, 0, 64); hMapFile3 = CreateFileMapping((HANDLE)(INVALID_HANDLE_VALUE), NULL, PAGE_READONLY, 0, 64, L"\\hwmon\\CPUTEMP"); if(hMapFile3 != NULL && GetLastError() == ERROR_ALREADY_EXISTS) pData3 = (BYTE *)MapViewOfFile(hMapFile3, FILE_MAP_READ, 0, 0, 64); for(i=0; i<5; i++) { if(pData1) memcpy(&dwVcc, pData1, 4); if(pData2) memcpy(&dwBoardTEMP, pData2, 4); if(pData3) memcpy(&dwCPUTEMP, pData3, 4); wsprintf(szBuf, TEXT("CPU:%2.1fC Board:%2.1fC VCC=%1.2fV"), (dwCPUTEMP/1000.0), (dwBoardTEMP/1000.0),(dwVcc/1000.0)); RETAILMSG(1, (TEXT("%s\r\n"), szBuf)); Sleep(1000); } if(pData1) UnmapViewOfFile(pData1); if(pData2) UnmapViewOfFile(pData2); if(pData3) UnmapViewOfFile(pData3); if(hMapFile1 != NULL) CloseHandle(hMapFile1); if(hMapFile2 != NULL) CloseHandle(hMapFile2); if(hMapFile3 != NULL) CloseHandle(hMapFile3); return 0; }
英創ESMARC系列工控主板在升級到最新內核后都可支持通過內存映射文件方式獲取主板相關硬件參數。
成都英創信息技術有限公司 028-8618 0660