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

📄 pagechart.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
字号:
// PageChart.cpp : 实现文件
//

#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "TestFunc.h"
#include "PageChart.h"
#include ".\pagechart.h"
#include "freq.h"
#include "testfunc.h"
#include "PageDevice.h"

#include "Pagedebug.h"
#include "Pagetest.h"
#include "PCIEBoardTestDlg.h"


// CPageChart 对话框

IMPLEMENT_DYNAMIC(CPageChart, CDialog)
CPageChart::CPageChart(CWnd* pParent /*=NULL*/)
	: CDialog(CPageChart::IDD, pParent)
{
}

CPageChart::~CPageChart()
{
}

void CPageChart::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_PROGRESS_CHART, m_prgChartRefresh);
}


BEGIN_MESSAGE_MAP(CPageChart, CDialog)
    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_TIMER()
    ON_BN_CLICKED(IDC_BTN_CHART_START, OnBnClickedBtnChartStart)
END_MESSAGE_MAP()


// CPageChart 消息处理程序

void CPageChart::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码
//    OnCancel();
}

int CPageChart::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此添加您专用的创建代码
    CRect   ClientRect;

    GetClientRect(ClientRect);

    for(int i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
    {
        m_ChartWnd[i].Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, ClientRect, this, 0);
        m_ChartWnd[i].SetLayers(8, 6);
        m_ChartWnd[i].SetAxresName("Transfer size(Kbytes)", "Transfer Rate(Mbyte/s)");
    }

    m_ChartWnd[0].SetTitle("CPU Single DWORD Read (Card -> System)");
    m_ChartWnd[1].SetTitle("CPU Single DWORD Write (System -> Card)");
    m_ChartWnd[2].SetTitle("DMA-Based Burst Read (Card -> System)");
    m_ChartWnd[3].SetTitle("DMA-Based Burst Write (System -> Card)");

    SetTimer(0, 100, NULL);

    return 0;
}

void CPageChart::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    CRect   ClientRect;
    CRect   ButtonRect;
    CRect   PrgRect;
    CRect   ChartRect[4];
    int     i;

    GetClientRect(ClientRect);

    if (GetDlgItem(IDC_BTN_CHART_START) == NULL)
        return;

    GetDlgItem(IDC_BTN_CHART_START)->GetWindowRect(ButtonRect);
    ScreenToClient(ButtonRect);
    m_prgChartRefresh.GetWindowRect(PrgRect);
    ScreenToClient(PrgRect);


    PrgRect.right = ClientRect.right - 10;
    m_prgChartRefresh.MoveWindow(PrgRect);

    ClientRect.top = ButtonRect.bottom + 4;
    ClientRect.bottom -= 4;
    ClientRect.left += 4;
    ClientRect.right -= 4;

    for(i=0; i<sizeof(ChartRect)/sizeof(ChartRect[0]); ++i)
        ChartRect[i] = ClientRect;

    ChartRect[0].right  = (ChartRect[0].left + ChartRect[0].right ) / 2 - 2;
    ChartRect[0].bottom = (ChartRect[0].top  + ChartRect[0].bottom) / 2 - 2;

    ChartRect[1].left   = (ChartRect[1].left + ChartRect[1].right ) / 2 + 2;
    ChartRect[1].bottom = (ChartRect[1].top  + ChartRect[1].bottom) / 2 - 2;

    ChartRect[2].right  = (ChartRect[2].left + ChartRect[2].right ) / 2 - 2;
    ChartRect[2].top    = (ChartRect[2].top  + ChartRect[2].bottom) / 2 + 2;

    ChartRect[3].left   = (ChartRect[3].left + ChartRect[3].right ) / 2 + 2;
    ChartRect[3].top    = (ChartRect[3].top  + ChartRect[3].bottom) / 2 + 2;

    for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
        m_ChartWnd[i].MoveWindow(ChartRect[i]);
}

void CPageChart::OnTimer(UINT nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CDialog::OnTimer(nIDEvent);

    m_prgChartRefresh.SetPos(0);

    KillTimer(0);
}

void CPageChart::OnBnClickedBtnChartStart()
{
    // TODO: 在此添加控件通知处理程序代码
    int     i;
    __int64 i64Start;
    __int64 i64End;
    ULONG   TimeElapse[7];
    ULONG   uData;

    TPOINT * pPoint[3];
    int     iCount[3];
    int     CPUTest[6] = {128, 256, 512, 1024, 2048, 8192};
    int     DMATest[] = {8, 16, 32, 64, 128, 256, 512, 1024, 2048, 3072, 4096, 5000, 5500, 6000, 6300};     // COUNT for size = 0x20 DWORD

    m_prgChartRefresh.SetPos(0);
    m_prgChartRefresh.SetRange(0, sizeof(CPUTest) / sizeof(CPUTest[0]) * 2 + sizeof(DMATest)/sizeof(DMATest[0]) * 2);

    int     prgPos = 0;

    for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
        m_ChartWnd[i].ClearChart();

    // 
    iCount[0] = iCount[1] = sizeof(CPUTest)/sizeof(CPUTest[0]);
    pPoint[0] = new TPOINT[iCount[0]];
    pPoint[1] = new TPOINT[iCount[1]];
    
    // CPU Single DWORD Read(Card -> System)

    ULONG   uAddr = 0x18;
    // ReadREG
    for(i=0; i<sizeof(CPUTest)/sizeof(CPUTest[0]); ++i)
    {
        // use this ULONG to do test
        // unsigned int        Reserved1;                          // 0x18

        m_prgChartRefresh.SetPos(prgPos);

        CString strInfor;
        strInfor.Format("Read REG at 0x%08x for %d DWORDs.", uAddr, CPUTest[i]);
        GetDlg()->Log(strInfor);

        GetCurrentTSC(i64Start);
        Test_ReadREG(GetDlg()->GetDeviceHandle(), uAddr, uData, &TimeElapse[0], CPUTest[i]/sizeof(ULONG));
        GetCurrentTSC(i64End);

        TimeElapse[0] = TimeElapse[0] / (nCPUFreq / 1000.0);
        TimeElapse[1] = (i64End - i64Start) / (nCPUFreq / 1000.0);

        (pPoint[0] + i)->x = CPUTest[i];
        (pPoint[0] + i)->y = CPUTest[i] / (TimeElapse[0] / (1000.0 * 1000 * 1000));   // BPS

        (pPoint[1] + i)->x = CPUTest[i];
        (pPoint[1] + i)->y = CPUTest[i] / (TimeElapse[1] / (1000.0 * 1000 * 1000));   // BPS

        ++prgPos;
    }

    m_ChartWnd[0].AddChart(RGB(0, 0, 255), "Driver", iCount[0], pPoint[0]);
    m_ChartWnd[0].AddChart(RGB(0, 255, 0), "GUI", iCount[1], pPoint[1]);

    // CPU Single DWORD Write(System -> Card)
    // WriteREG

    for(i=0; i<sizeof(CPUTest)/sizeof(CPUTest[0]); ++i)
    {
        // use this ULONG to do test
        // unsigned int        Reserved1;                          // 0x18
        m_prgChartRefresh.SetPos(prgPos);

        CString strInfor;
        strInfor.Format("Write REG at 0x%08x for %d DWORDs.", uAddr, CPUTest[i]);
        GetDlg()->Log(strInfor);

        GetCurrentTSC(i64Start);
        Test_WriteREG(GetDlg()->GetDeviceHandle(), uAddr, uData, &TimeElapse[0], CPUTest[i]/sizeof(ULONG));
        GetCurrentTSC(i64End);

        TimeElapse[0] = TimeElapse[0] / (nCPUFreq / 1000.0);
        TimeElapse[1] = (i64End - i64Start)  / (nCPUFreq / 1000.0);

        (pPoint[0] + i)->x = CPUTest[i];
        (pPoint[0] + i)->y = CPUTest[i]  * 1000.0 * 1000 * 1000 / TimeElapse[0];   // BPS

        (pPoint[1] + i)->x = CPUTest[i];
        (pPoint[1] + i)->y = CPUTest[i]  * 1000.0 * 1000 * 1000 / TimeElapse[1];   // BPS

        ++prgPos;
    }

    m_ChartWnd[1].AddChart(RGB(0, 0, 255), "Driver", iCount[0], pPoint[0]);
    m_ChartWnd[1].AddChart(RGB(0, 255, 0), "GUI", iCount[1], pPoint[1]);

    delete[] pPoint[0];
    delete[] pPoint[1];
    pPoint[0] = pPoint[1] = NULL;


    // DMA Test: 
    iCount[0] = iCount[1] = iCount[2] = sizeof(DMATest)/sizeof(DMATest[0]);
    pPoint[0] = new TPOINT[iCount[0]];
    pPoint[1] = new TPOINT[iCount[1]];
    pPoint[2] = new TPOINT[iCount[2]];

    // DMA Read(Card -> System)
    for(i=0; i<sizeof(DMATest)/sizeof(DMATest[0]); ++i)
    {
        m_prgChartRefresh.SetPos(prgPos);

        Test_Dev2Host(GetDlg()->GetDeviceHandle(), iDeviceWriteSize, DMATest[i], 0xA55AA55A, TimeElapse);

        if (TimeElapse[1] == 0)
        {
            AfxMessageBox("DMA Failed!");
            delete[] pPoint[0];
            delete[] pPoint[1];
            delete[] pPoint[2];
            return;
        }

        (pPoint[0] + i)->x = DMATest[i] * sizeof(ULONG) * iDeviceWriteSize;
        (pPoint[0] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[0];   // BPS

        (pPoint[1] + i)->x = (pPoint[0] + i)->x;
        (pPoint[1] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[1];   // BPS

        (pPoint[2] + i)->x = (pPoint[0] + i)->x;
        (pPoint[2] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[2];   // BPS

        ++prgPos;
    }

    m_ChartWnd[2].AddChart(RGB(255, 0, 0), "Hardware", iCount[0], pPoint[0]);
    m_ChartWnd[2].AddChart(RGB(0, 0, 255), "Driver", iCount[1], pPoint[1]);
    m_ChartWnd[2].AddChart(RGB(0, 255, 0), "GUI", iCount[2], pPoint[2]);

    // DMA Read(System -> Card)
    for(i=0; i<sizeof(DMATest)/sizeof(DMATest[0]); ++i)
    {
        m_prgChartRefresh.SetPos(prgPos);

        Test_Host2Dev(GetDlg()->GetDeviceHandle(), iDeviceReadSize, DMATest[i] * 0x20 / iDeviceReadSize, TimeElapse);
        
        if (TimeElapse[1] == 0)
        {
            AfxMessageBox("DMA Failed!");
            delete[] pPoint[0];
            delete[] pPoint[1];
            delete[] pPoint[2];
            return;
        }

        (pPoint[0] + i)->x = DMATest[i] * sizeof(ULONG) * 0x20;
        (pPoint[0] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[0];   // BPS

        (pPoint[1] + i)->x = (pPoint[0] + i)->x;
        (pPoint[1] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[1];   // BPS

        (pPoint[2] + i)->x = (pPoint[0] + i)->x;
        (pPoint[2] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[2];   // BPS

        ++prgPos;
    }

    m_prgChartRefresh.SetPos(prgPos);

    m_ChartWnd[3].AddChart(RGB(255, 0, 0), "Hardware", iCount[0], pPoint[0]);
    m_ChartWnd[3].AddChart(RGB(0, 0, 255), "Driver", iCount[1], pPoint[1]);
    m_ChartWnd[3].AddChart(RGB(0, 255, 0), "GUI", iCount[2], pPoint[2]);

    delete[] pPoint[0];
    delete[] pPoint[1];
    delete[] pPoint[2];
    pPoint[0] = pPoint[1] = pPoint[2] = NULL;

    // 刷新显示
    for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
        m_ChartWnd[i].Invalidate();

    m_prgChartRefresh.SetPos(0);
}

⌨️ 快捷键说明

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