超碰激情 I 成人福利网站 I 淫国产 I 曰批视频免费30分钟成人 I 刘亦菲裸体视频一区二区三区 I 午夜久 I 尤物综合 I 亚洲一区av在线观看 I 欧美亚洲国产精品久久高清 I 欧美老熟妇乱子伦视频 I 无码中出人妻中文字幕av I 久久美女福利视频 I 精品无人区乱码1区2区3区在线 I 性饥渴的农村熟妇 I 色综合综合色 I 少妇人妻88久久中文字幕 I 久久夜色精品国产噜噜av I 老熟妇仑乱视频一区二区 I 男女做爰猛烈叫床视频动态图 I 日本大片一区二区 I 人成午夜免费视频在线观看 I 激情婷婷av I 男女下面一进一出免费视频网站 I 久久影视一区 I 午夜污网站 I 先锋人妻无码av电影 I 久久久久久久岛国免费网站 I 又粗又大又黄又硬又爽免费看 I 人妻无码免费一区二区三区 I www.色成人100 I 欧美高清网站 I 精品国产第一页 I 国产suv一区二区三区88区 I 橹图极品美女无圣光 I 午夜宅男欧美

產品分類

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

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

ESM6802( iMX6-WEC7)多核性能測試

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

  • 關鍵詞:                                                                ESM6802                                                                iMX6-WEC7

  • 摘要:WEC7一個最重要的特性就是對多核處理器的支持(Symmetric Multi-Processing(SMP)),下面將通過應用程序來測試在單核和多核情況下系統的執行情況,為了更直觀的比較,同時參與測試的還有ESM3354,ESM3354是基于TI Coertex-A8處理器的工控主板,CPU主頻1GHz,同樣預裝WEC7操作系統。


  ESM6802是英創公司推出的基于Freescale i.MX6DL雙核處理器(ARM Cortex-A9,主頻1GHz)的高性能工控主板,預裝正版Windows Embedded Compact 7(WEC7)嵌入式操作系統,WEC7一個最重要的特性就是對多核處理器的支持(Symmetric Multi-Processing(SMP)),下面將通過應用程序來測試在單核和多核情況下系統的執行情況,為了更直觀的比較,同時參與測試的還有ESM3354,ESM3354是基于TI Coertex-A8處理器的工控主板,CPU主頻1GHz,同樣預裝WEC7操作系統。


  所設計的測試程序代碼如下,其中的TestSmp函數有兩個輸入參數,第一參數表示要創建測試線程的數量,第二個參數為所創建線程的運行時長。cbTestSmp是被創建的測試線程,測試線程主要是在一個while循環中,反復讀取內存變量然后與預設值進行比較,在運行設定的時間后自動退出循環,其中的threadParam->loops變量會記錄下while循環總共執行的次數。


  typedef struct _SMP_THREAD_PARAM

  {

      UINT32 durationMs;

      UINT32 threadId;

      UINT64 loops;

      BOOL   bSetAffinity;

      UINT32 sandBoxSize;

      LPVOID sandBoxStart;

  }SMP_THREAD_PARAM, *PSMP_THREAD_PARAM;


  ULONG cbTestSmp(LPVOID param)

  {

      PSMP_THREAD_PARAM threadParam = (PSMP_THREAD_PARAM)param;

      DWORD tStart = GetTickCount();

      UINT8 *buffer = (UINT8 *)threadParam->sandBoxStart;


      wprintf(L"Ahou, Thread %d, running for %d ms ", threadParam->threadId,

           threadParam->durationMs);


      // Write to sandbox

      for (UINT32 i = 0; i < threadParam->sandBoxSize; i++)

      {

          buffer[i] = (UINT8)(i);

      }


      while ( (GetTickCount() - tStart) < threadParam->durationMs)

      {

          // Read back from sandbox

          for (UINT32 i = 0; i < threadParam->sandBoxSize; i++)

          {

              if (buffer[i] != (UINT8)(i))

              {

                  wprintf(L"Thread %d : error at byte %d for loop %I64d !! ",

                      threadParam->threadId, i, threadParam->loops);

              }          

          }      


          threadParam->loops++;

      }


      wprintf(L"Thread %d : terminating ", threadParam->threadId);

 

     return 0;

  }


  void TestSmp(UINT32 nNumOfThread, UINT32 durationMs)

  {

      UINT32 i;


      PSMP_THREAD_PARAM threadParams;

      HANDLE *threadHandles;

      UINT64 totalLoops = 0;

      UINT32 sandBoxSize = 1024 * 128; // 128 kB


      HANDLE h_array[1];


      threadParams = (PSMP_THREAD_PARAM)malloc(nNumOfThread * sizeof(SMP_THREAD_PARAM));


      if (threadParams == NULL)

      {

          wprintf(L"Failed allocating thread params ! ");

          return;

      }


      threadHandles = (HANDLE *)malloc(nNumOfThread * sizeof(HANDLE));


     if (threadHandles == NULL)

      {

          wprintf(L"Failed allocating thread handles ! ");

          return;

      }


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

      {

          threadParams[i].bSetAffinity = TRUE;

          threadParams[i].threadId = i;

          threadParams[i].durationMs = durationMs;

          threadParams[i].loops = 0;

          threadParams[i].sandBoxSize = sandBoxSize;

          threadParams[i].sandBoxStart = malloc(sandBoxSize);

          threadHandles[i] = CreateThread(NULL, 0, cbTestSmp, &threadParams[i], 0, NULL);

          wprintf(L"Thread handle %d : 0x%x ", i, threadHandles[i]);

      }


      h_array[0] = threadHandles[0];

      DWORD res = WaitForSingleObject(h_array[0], INFINITE);


      Sleep(500);


      if (res == WAIT_TIMEOUT)

      {

          wprintf(L"Timeout waiting for threads ! ");

      }

      else

      {

          wprintf(L"All threads exited ");

      }


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

      {

         wprintf(L"Thread %d did run %I64d loops ", i, threadParams[i].loops);

          totalLoops += threadParams[i].loops;

          free(threadParams[i].sandBoxStart);

          CloseHandle(threadHandles[i]);

      }


      wprintf(L"Total number of loops %I64d (%I64d millions) ", totalLoops,

          totalLoops / 1000000);


      free(threadHandles);

      free(threadParams);

  }


  將上述測試代碼編譯生成為exe文件,分別在ESM3354和ESM6802上運行,設置while循環的執行時間均為10000ms,測試結果如下:


1、創建單個線程


測試主板與線程ESM3354(1GHz單核 Cortex-A8)ESM6802(1GHz雙核Cortex-A9)

 循環次數67917493


  當測試程序只創建一個測試線程時,ESM3354的while循環執行了6791次,ESM6802執行7493次,雖然ESM6802為雙核處理器,但由于程序只有一個線程,即同一時刻只有一個線程在運行,所以在相同的時間內,循環的次數僅略多于ESM3354。由于ESM3354和ESM6802的CPU主頻同樣都是1GHz,所以可以認為ESM6802多出的循環次數也就是Cortex-A8與Cortex-A9在代碼執行效率上的差別。


2、創建兩個線程


測試主板與線程ESM3354(1GHz單核 Cortex-A8)ESM6802(1GHz雙核Cortex-A9)

 線程1循環次數33907438

 線程2循環次數34427452

 總循環次數683214890


  當測試程序創建了兩個線程時,ESM3354會將CPU資源大約平均的分配給兩個線程,如上表中線程1執行了3390次,線程2執行了3442次,兩個線程總共執行的次數與只創建單個線程測試時的循環次數相當。ESM6802為雙核CPU,在測試程序有兩個線程的情況下,在同一時刻兩個線程可以同時運行,所以總的循環次數大約是單個線程測試時的兩倍。


  通過上面的測試可以看到,在多線程情況下,如果操作系統支持多核處理器,那么雙核CPU的運算能力將是單核CPU的兩倍。


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

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

推薦產品

更多