色另类_婷婷激情四月_亚洲精品无码不卡在线播放he_欧美第七页_精品国产综合区久久久久99_青娱乐极品盛宴在线

產(chǎn)品分類

當(dāng)前位置: 首頁 > 傳感測量產(chǎn)品 > 工業(yè)傳感器 > 溫濕度傳感器

類型分類:
科普知識
數(shù)據(jù)分類:
溫濕度傳感器

基于WEC7的多核系統(tǒng)編程方法

發(fā)布日期:2022-04-26 點擊率:63

  • 關(guān)鍵詞:                                                                WEC7

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


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


  WEC7提供了一組處理多核系統(tǒng)上線程和處理器調(diào)度的SMP API接口函數(shù):

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


  其中應(yīng)用程序常用的SMP API如下所示:


 GetCurrentProcessorNumber  獲取在調(diào)用此函數(shù)期間當(dāng)前線程正在運行的處理器

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

 CeGetProcessAffinity     獲取指定進(jìn)程的進(jìn)程關(guān)聯(lián)

 CeGetThreadAffinity     獲取指定線程的線程關(guān)聯(lián)

 CeGetTotalProcessors    獲取系統(tǒng)中的處理器核心總數(shù)

 CeSetProcessAffinity    為指定的進(jìn)程設(shè)置處理器關(guān)聯(lián)

 CeSetThreadAffinity     為指定的線程設(shè)置處理器關(guān)聯(lián)


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


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


  #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

推薦產(chǎn)品

更多
主站蜘蛛池模板: 一级片片| 天天操网 | 午夜视频一区二区 | 欧美一区二区三区免费视频 | 日韩av成人 | 青草国产超碰人人添人人碱 | 国内精品久久久久久2021浪潮 | 欧美日韩高清一区 | 久草97 | 精品视频一区二区三区四区 | 色爱综合区五月小说 | 日韩在线国产精品 | 先锋影音资源网站 | 一级成人| 成人在线第一页 | 色网站在线 | 亚洲高清一区二区三区 | 成人毛片在线观看 | 狠狠添| 国产一区二区三区免费观看 | 午夜在线亚洲男人午在线 | 9久9久女女热精品视频免费观看 | 欧美另类videosbestsex久久 | 一级成人生活片免费看 | 五月天激情综合网 | 一级做a爰片欧美一区 | 婷婷色综合久久 | av毛片 | 国产毛A片啊久久久久久A | 久久影院一区二区三区 | 久久精品人人做人人看最新章 | 日韩日日夜夜 | 欧美性爽xxxⅹbbbb | 日韩欧美在线一区二区三区 | 国产亚洲久 | 久久亚洲国产精品 | www国产成人免费观看视频,深夜成人网 | 日本欧美一区二区三区视频 | 日韩成人在线观看视频 | 国产伦精品一区二区三区高清 | 日韩精品中文字幕久久 |