⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsmmc_perf.cpp

📁 s3c2450 HSMMC接口wince500测试程序
💻 CPP
字号:
// HSMMC_Perf.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include <commctrl.h>
#include <Oleauto.h>

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE	hInst;                      // current instance
HWND		hWnd;
HWND		hWndCB;
TCHAR		szTitle[MAX_LOADSTRING];        // The title bar text
TCHAR		szWindowClass[MAX_LOADSTRING];  // The title bar text
BSTR		g_WritePerfResult;
BSTR		g_ReadPerfResult;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK PerfProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL WritePerfMeasureProc();
BOOL ReadPerfMeasureProc();

// Target List
TCHAR cTargetList[5][20] = {TEXT("NandFlash"), TEXT("PocketMory"), TEXT("CFDisk"), TEXT("Storage Card"), TEXT("Storage Card2")};
DWORD dwIndexOfTarget;

// Transfer Size List
TCHAR cTransferSizeList[12][10] = {TEXT("0.5 KB"), TEXT("1 KB"), TEXT("2 KB"), TEXT("4 KB"),
	TEXT("8 KB"),TEXT("16 KB"), TEXT("32 KB"), TEXT("64 KB"), TEXT("128 KB"), TEXT("256 KB"),
	TEXT("512 KB"), TEXT("1024 KB")};
DWORD dwIndexOfTransferSize;

// Total Size List
TCHAR cTotalSizeList[5][10] = {TEXT("1 MB"), TEXT("2 MB"), TEXT("4 MB"), TEXT("8 MB"), TEXT("16 MB")};
DWORD dwIndexOfTotalSize;


int WINAPI WinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance,
		LPTSTR     lpCmdLine,
		int       nCmdShow)
{
	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_HSMMC_Perf, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HSMMC_Perf);

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//int nLen
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASS wc;

	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = (WNDPROC) WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = 0;
	wc.hCursor = 0;
	wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = 0;
	wc.lpszClassName = szWindowClass;

	return RegisterClass(&wc);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	hInst = hInstance; // Store instance handle in our global variable

	hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU,
			0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return FALSE;
	}

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	if (hWndCB)
		CommandBar_Show(hWndCB, TRUE);
	return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

	switch (message) 
	{
		case WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case ID_FILE_START:
					DialogBox(hInst, (LPCTSTR)IDD_MAIN_DLG, hWnd, (DLGPROC)PerfProc);
					break;
				case ID_FILE_EXIT:
					DestroyWindow(hWnd);
					break;
				default:
					return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_CONTEXTMENU:
			//			hMenu = LoadMenu(GetModuleHandle(NULL), (LPCTSTR)IDR_MENU);
			//			TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN, LOWORD(lParam), HIWORD(lParam), 0, hWnd, NULL);
			//			DestroyMenu(hMenu);
			break;
		case WM_CREATE:
			hWndCB = CommandBar_Create(hInst, hWnd, 1);			
			CommandBar_InsertMenubar(hWndCB, hInst, IDR_MENU, 0);
			//CommandBar_AddAdornments(hWndCB, 0, 0);
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			// TODO: Add any drawing code here...
			RECT rt;
			GetClientRect(hWnd, &rt);
			DrawText(hdc, szHello, _tcslen(szHello), &rt, DT_CENTER);
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			CommandBar_Destroy(hWndCB);
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

LRESULT CALLBACK PerfProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	DWORD i = 0;
	TCHAR *cTest = NULL;
	switch(message)
	{
		case WM_INITDIALOG:
			for(i=0; i<5; i++)
				SendDlgItemMessage(hDlg,
						IDC_COMBO_TARGET,
						CB_ADDSTRING,
						0,
						(LPARAM)cTargetList[i]);
			for(i=0; i<12; i++)
				SendDlgItemMessage(
						hDlg,
						IDC_COMBO_TR_SIZE,
						CB_ADDSTRING,
						0,
						(LPARAM)cTransferSizeList[i]);
			for(i=0; i<5; i++)
				SendDlgItemMessage(
						hDlg,
						IDC_COMBO_TT_SIZE,
						CB_ADDSTRING,
						0,
						(LPARAM)cTotalSizeList[i]);
			return TRUE;
		case WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case IDC_COMBO_TARGET:
					switch (HIWORD(wParam)) {
						case CBN_SELCHANGE:
							dwIndexOfTarget = SendDlgItemMessage(
									hDlg,
									IDC_COMBO_TARGET,
									CB_GETCURSEL,
									0,
									0);
							RETAILMSG(0, (TEXT("* Target       : %d, %s\n"),
										dwIndexOfTarget, cTargetList[dwIndexOfTarget]));
							break;
					}
					return FALSE;
				case IDC_COMBO_TR_SIZE:
					switch (HIWORD(wParam)) {
						case CBN_SELCHANGE:
							dwIndexOfTransferSize = SendDlgItemMessage(hDlg,
									IDC_COMBO_TR_SIZE,
									CB_GETCURSEL,
									0,
									0);
							RETAILMSG(0, (TEXT("* TransferSize : %d, %s\n"),
										dwIndexOfTransferSize, cTransferSizeList[dwIndexOfTransferSize]));
							break;
					}
					return FALSE;
				case IDC_COMBO_TT_SIZE:
					switch (HIWORD(wParam)) {
						case CBN_SELCHANGE:
							dwIndexOfTotalSize = SendDlgItemMessage(hDlg,
									IDC_COMBO_TT_SIZE,
									CB_GETCURSEL,
									0,
									0);
							RETAILMSG(0, (TEXT("* TotalSize    : %d, %s\n"),
										dwIndexOfTotalSize, cTotalSizeList[dwIndexOfTotalSize]));
							break;
					}
					return FALSE;
				case IDC_BUTTON_START:
//					if (!PerfMeasureProc()) return FALSE;
						SendDlgItemMessage(hDlg,
								IDC_PROGRESS1,
								PBM_SETPOS,
								0,
								0);
					if (!WritePerfMeasureProc()) {
						MessageBox (hWnd, TEXT("Write Performance Measurement has been failed!\n"), (TEXT("Notify")), MB_OK);
						return FALSE;
					} else {
						SendDlgItemMessage(hDlg,
								IDC_PROGRESS1,
								PBM_SETPOS,
								50,
								0);
						SendDlgItemMessage(hDlg,
								IDC_EDIT_WRITE,
								WM_SETTEXT,
								0,
								(LPARAM)g_WritePerfResult);
					}

					if (!ReadPerfMeasureProc()) {
						MessageBox (hWnd, TEXT("Read Performance Measurement has been failed!\n"), (TEXT("Notify")), MB_OK);
						return FALSE;
					} else {
						SendDlgItemMessage(hDlg,
								IDC_PROGRESS1,
								PBM_SETPOS,
								100,
								0);
						SendDlgItemMessage(hDlg,
								IDC_EDIT_READ,
								WM_SETTEXT,
								0,
								(LPARAM)g_ReadPerfResult);
					}
					return TRUE;
				case IDC_BUTTON_FINISH:
					EndDialog(hDlg, LOWORD(wParam));
					return TRUE;
			}
			break;
	}
	return FALSE;
}

BOOL WritePerfMeasureProc()
{
	const DWORD dwTransferSize = 512 * (1<<dwIndexOfTransferSize);
	const DWORD dwTotalSize    = 1024 * 1024 * (1<<dwIndexOfTotalSize);
	const DWORD dwTransferIndex = dwTotalSize / dwTransferSize;

	DWORD dwStartTicks = 0;
	double dPerfResult = 0;
	unsigned char *ucSRCData;
	ucSRCData = new unsigned char[dwTotalSize];
	memset(ucSRCData, 0xAA, dwTotalSize);

	RETAILMSG(1, (TEXT("## Write Test # TrSize: %d, Count: %d, TtSize: %d #\n"), dwTransferSize, dwTransferIndex, dwTotalSize));

	{
		HANDLE hFile;
		DWORD dwWritten = 0;
		DWORD dwRead    = 0;
		DWORD dwCount = dwTotalSize;
		int nLen        = 0;
		char cPerfResult[10];
		BSTR bstr;
		TCHAR *szFileName;
		switch (dwIndexOfTarget)
		{
			case 0:
				szFileName = (TEXT("\\NandFlash\\PerfTest.DAT"));
				break;
			case 1:
				szFileName = (TEXT("\\PocketMory\\PerfTest.DAT"));
				break;
			case 2:
				szFileName = (TEXT("\\CFDisk\\PerfTest.DAT"));
				break;
			case 3:
				szFileName = (TEXT("\\Storage Card\\PerfTest.DAT"));
				break;
			case 4:
				szFileName = (TEXT("\\Storage Card2\\PerfTest.DAT"));
				break;
		}

		//----------------    write   --------------------------------

		hFile = CreateFile(
				szFileName,
				GENERIC_WRITE,
				0,
				NULL,
				CREATE_ALWAYS,
				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,
				NULL);
		if (hFile == INVALID_HANDLE_VALUE) {
			MessageBox (hWnd, TEXT("It can not create a test file!!"), (TEXT("Notify")), MB_OK);
			return TRUE;
		}

		dwStartTicks = GetTickCount();  // Start!
		while (dwCount) {
			WriteFile(hFile, ucSRCData, dwTransferSize, &dwWritten, NULL);	// To move the file pointer is not needed for performance.
			dwCount -= dwWritten;
		}
		dwStartTicks = GetTickCount() - dwStartTicks; // End!
		CloseHandle(hFile);
		RETAILMSG(1, (TEXT("Write elapsed time : %d\n"), dwStartTicks));

		dPerfResult = ((double)dwTotalSize*1024/(double)dwStartTicks)/(double)1000000;
		fprintf(stdout, "** Write Perf: %0.2f MS/s\n", dPerfResult);
		//sprintf_s( cPerfResult, 10, "%.2f", dPerfResult);
		sprintf( cPerfResult, "%.2f", dPerfResult);		// 08.05.15 by KYS for compile on PB5.0

		nLen = MultiByteToWideChar(CP_ACP, 0, cPerfResult, strlen(cPerfResult), NULL, NULL);
		bstr = SysAllocStringLen(NULL, nLen);
		MultiByteToWideChar(CP_ACP, 0, cPerfResult, strlen(cPerfResult), bstr, nLen);
		g_WritePerfResult = bstr;
		SysFreeString(bstr);
	}

	delete []ucSRCData;
	return TRUE;
}


BOOL ReadPerfMeasureProc()
{
	const DWORD dwTransferSize = 512 * (1<<dwIndexOfTransferSize);
	const DWORD dwTotalSize    = 1024 * 1024 * (1<<dwIndexOfTotalSize);
	const DWORD dwTransferIndex = dwTotalSize / dwTransferSize;

	DWORD dwStartTicks = 0;
	double dPerfResult = 0;
	unsigned char *ucSRCData;

	ucSRCData = new unsigned char[dwTotalSize];
	memset(ucSRCData, 0x0, dwTotalSize);

	RETAILMSG(1, (TEXT("## Read Test # TrSize: %d, Count: %d, TtSize: %d #\n"), dwTransferSize, dwTransferIndex, dwTotalSize));

	{
		HANDLE hFile;
		DWORD dwWritten = 0;
		DWORD dwRead    = 0;
		DWORD dwCount = dwTotalSize;
		int nLen        = 0;
		char cPerfResult[10];
		BSTR bstr;
		TCHAR *szFileName;
		switch (dwIndexOfTarget)
		{
			case 0:
				szFileName = (TEXT("\\NandFlash\\PerfTest.DAT"));
				break;
			case 1:
				szFileName = (TEXT("\\PocketMory\\PerfTest.DAT"));
				break;
			case 2:
				szFileName = (TEXT("\\CFDisk\\PerfTest.DAT"));
				break;
			case 3:
				szFileName = (TEXT("\\Storage Card\\PerfTest.DAT"));
				break;
			case 4:
				szFileName = (TEXT("\\Storage Card2\\PerfTest.DAT"));
				break;
		}

		//----------------    read   --------------------------------
		hFile = CreateFile(
				szFileName,
				GENERIC_READ,
				0,
				NULL,
				OPEN_EXISTING,
				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_NO_BUFFERING,
				NULL);
		if (hFile == INVALID_HANDLE_VALUE) {
			MessageBox (hWnd, TEXT("It can not create a test file!!"), (TEXT("Notify")), MB_OK);
			return TRUE;
		}
		dwStartTicks = GetTickCount();  // Start!
		while (dwCount) {
			ReadFile(hFile, ucSRCData, dwTransferSize, &dwRead, NULL);	// To move the file pointer is not needed for performance.
			dwCount -= dwRead;
		}
		dwStartTicks = GetTickCount() - dwStartTicks; // End!
		CloseHandle(hFile);
		RETAILMSG(1, (TEXT("Read elapsed time : %d\n"), dwStartTicks));

		dPerfResult = ((double)dwTotalSize*1024/(double)dwStartTicks)/(double)1000000;
		fprintf(stdout, "** Read Perf: %0.2f MS/s\n", dPerfResult);
		//sprintf_s( cPerfResult, 10, "%.2f", dPerfResult);
		sprintf( cPerfResult, "%.2f", dPerfResult);		// 08.05.15 by KYS for compile on PB5.i0

		nLen = MultiByteToWideChar(CP_ACP, 0, cPerfResult, strlen(cPerfResult), NULL, NULL);
		bstr = SysAllocStringLen(NULL, nLen);
		MultiByteToWideChar(CP_ACP, 0, cPerfResult, strlen(cPerfResult), bstr, nLen);
		g_ReadPerfResult = bstr;
		SysFreeString(bstr);
	}

	delete []ucSRCData;
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -