<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產品分類

      當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 溫濕度傳感器

      類型分類:
      科普知識
      數據分類:
      溫濕度傳感器

      基于WEC7的多核系統編程方法

      發布日期:2022-04-26 點擊率:58

      • 關鍵詞:                                                                WEC7

      • 摘要:在多個程序同時執行的情況下,支持SMP的多核系統具有比單處理器更好的性能,因為不同的程序可以在不同的處理器上同時運行,支持SMP還可以實現在一個核心上執行硬實時應用程序,而用戶界面(UI)或其它應用程序可在另一個核心上運行,以提高系統的效率。


        Windows Embedded Compact 7(WEC7)一個最重要的特性就是對多核處理器的支持(Symmetric Multi-Processing(SMP)),ESM6802是英創公司推出的基于Freescale  i.MX6DL雙核處理器的高性能工控主板,預裝正版WEC7嵌入式操作系統,并且內核啟用了對SMP的支持。在多個程序同時執行的情況下,支持SMP的多核系統具有比單處理器更好的性能,因為不同的程序可以在不同的處理器上同時運行,支持SMP還可以實現在一個核心上執行硬實時應用程序,而用戶界面(UI)或其它應用程序可在另一個核心上運行,以提高系統的效率。


        WEC7提供了一組處理多核系統上線程和處理器調度的SMP API接口函數:

        https://msdn.microsoft.com/en-us/library/gg154433(v=winembedded.70).aspx


        其中應用程序常用的SMP API如下所示:


       GetCurrentProcessorNumber  獲取在調用此函數期間當前線程正在運行的處理器

       CeGetIdleTimeEx       獲取指定處理器的空閑時間

       CeGetProcessAffinity     獲取指定進程的進程關聯

       CeGetThreadAffinity     獲取指定線程的線程關聯

       CeGetTotalProcessors    獲取系統中的處理器核心總數

       CeSetProcessAffinity    為指定的進程設置處理器關聯

       CeSetThreadAffinity     為指定的線程設置處理器關聯


        默認情況下,WEC7系統會自動的將系統負載分配到CPU的所有核心上運行,應用程序不需要做任何設置。但根據不同的應用場景,應用程序也可以利用SMP API手動的設置每個進程、每個線程在指定的CPU核心上運行,這里以計算ESM6802 i.MX6DL CPU每個核心的負載為例,介紹WEC7 SMP API的使用方法。


        應用程序首先通過CeGetTotalProcessors函數獲取當前系統總的處理器(核心)個數,然后根據CPU核心個數創建相同數量的CPUIdleMonitorThread應用線程用于計算CPU負載,在創建線程后通過CeSetThreadAffinity函數將所創建的線程固定在指定的CPU核心上運行。CPUIdleMonitorThread線程函數在執行時先調用GetCurrentProcessorNumber函數取得執行當前線程的CPU核,而后再利用CeGetIdleTimeEx函數最終計算出每個CPU核心的負載率。完整的例子代碼如下:


        #include "stdafx.h"

        // time in seconds to run the monitor thread

        #define IDLE_MONITOR_TIME   100


        HANDLE g_hMonitorThreads[4];


        UINT32 CPUIdleMonitorThread(PVOID pContext)

        {

            UINT32 nCPUId = ((UINT32*)pContext)[0];

            UINT32 nRunTime = ((UINT32*)pContext)[1];

            UINT32 nIdleBefore, nIdleAfter, nIdleDiff, nIdlePercent;

            UINT32 nReturn = ERROR_SUCCESS;


           LARGE_INTEGER pcBefore = { 0, 0 };

            LARGE_INTEGER pcAfter = { 0, 0 };

            LARGE_INTEGER diff;

            LARGE_INTEGER freq;


            RETAILMSG(1, (L"[CPU%d] Run monitor thread for %d seconds ", nCPUId, nRunTime));


           // The processor number is a 1-based index.

            QueryPerformanceFrequency(&freq);


            while (nRunTime > 0)

            {

                nCPUId = GetCurrentProcessorNumber();

                CeGetIdleTimeEx(nCPUId, (LPDWORD)&nIdleBefore);


                QueryPerformanceCounter(&pcBefore);

                Sleep(2000);

                QueryPerformanceCounter(&pcAfter);


               CeGetIdleTimeEx(nCPUId, (LPDWORD)&nIdleAfter);


                diff.QuadPart = (pcAfter.QuadPart - pcBefore.QuadPart) * 1000 / freq.QuadPart;

                nIdleDiff = nIdleAfter - nIdleBefore;

                nIdlePercent = nIdleDiff / 20;


                RETAILMSG(1, (L"[CPU%d] Sleep: 2000 ms (actual:%d ms)  Idle: %03d ms (CPU%d = %d%%) ",

                     nCPUId, diff.LowPart, nIdleDiff, nCPUId, 100 - nIdlePercent));

                nRunTime--;

            }


           SetEvent(g_hMonitorThreads[nCPUId - 1]);

            return nReturn;

        }


        int WINAPI WinMain(HINSTANCE hInstance,

                           HINSTANCE hPrevInstance,

                           LPTSTR     lpCmdLine,

                           int       nCmdShow)

        {

           UINT32 nCPUCount;

            UINT32 nTemp = 0;

            UINT32 i;

            UINT32 nParam[8] = { 1, IDLE_MONITOR_TIME, 2, IDLE_MONITOR_TIME, 3, IDLE_MONITOR_TIME, 4, IDLE_MONITOR_TIME };


            nCPUCount = CeGetTotalProcessors();


            for(i = 0; i < nCPUCount; i++)

                g_hMonitorThreads[i] = CreateEvent(NULL, TRUE, FALSE, NULL);

       

            nTemp = 1;


           CeSetThreadAffinity(GetCurrentThread(), 1);


            for (i = 1; i < nCPUCount; i++)

            {

                HANDLE hThread = CreateThread(

                    NULL,

                    0,

                    (LPTHREAD_START_ROUTINE)CPUIdleMonitorThread,

                    &nParam[i * 2],

                    CREATE_SUSPENDED,

                    NULL);


               if (NULL != hThread)

                {

                    CeSetThreadAffinity(hThread, i + 1);

                    ResumeThread(hThread);

                    Sleep(0);

                    CloseHandle(hThread);

                    nTemp++;

                }

                else

                {

                    SetEvent(g_hMonitorThreads[i]);

                }

            }


            CPUIdleMonitorThread(&nParam[0]);


            Sleep(2000);

            for(i = 0; i < nCPUCount; i++)

                WaitForSingleObject(g_hMonitorThreads[i], (IDLE_MONITOR_TIME + 5) * 1000);


            RETAILMSG(1, (L"[CPULOAD] Number of CPUs monitored: %d ", nTemp));


            return 0;

        }


      下一篇: PLC、DCS、FCS三大控

      上一篇: 索爾維全系列Solef?PV

      推薦產品

      更多
      主站蜘蛛池模板: 成人综合伊人五月婷久久| 狠狠色伊人亚洲综合网站色| 97久久婷婷五月综合色d啪蜜芽| 欧美日韩色另类综合| 一本一本久久a久久精品综合| 久久婷婷色综合一区二区| 狠狠色丁香久久综合婷婷| 久久综合丝袜长腿丝袜| 日韩亚洲国产综合久久久| 久久综合图区亚洲综合图区| 一本色道久久综合| 久久久久久综合一区中文字幕 | 综合激情五月综合激情五月激情1 综合久久国产九一剧情麻豆 | 久久精品综合一区二区三区| 69国产成人综合久久精品91| 狠狠色丁香九九婷婷综合五月| 麻豆精品久久精品色综合| 色噜噜狠狠狠狠色综合久不| 亚洲色欲www综合网| 狠狠色伊人久久精品综合网| 国产精品免费综合一区视频| 久久综合久久综合亚洲| 久久一日本道色综合久| 国产成人综合亚洲亚洲国产第一页 | 亚洲av无码兔费综合| 亚洲情综合五月天| 久久久久久久综合日本| 国产成人亚洲综合a∨| 制服丝袜人妻综合第一页| 亚洲国产精品综合久久20| 伊人久久综合热线大杳蕉下载| 亚洲啪啪综合AV一区| 亚洲AV综合色区无码一区| 青青草原综合久久大伊人| 久久香蕉综合色一综合色88| 婷婷综合久久中文字幕蜜桃三电影| 综合激情五月综合激情五月激情1| 久久久综合香蕉尹人综合网| 狠狠色丁香婷综合久久| 亚洲综合无码一区二区三区| 色婷婷综合久久久|