Windows Embedded Compact 7(WEC7)一個(gè)最重要的特性就是對(duì)多核處理器的支持(Symmetric Multi-Processing(SMP)),ESM6802是英創(chuàng)公司推出的基于Freescale i.MX6DL雙核處理器的高性能工控主板,預(yù)裝正版WEC7嵌入式操作系統(tǒng),并且內(nèi)核啟用了對(duì)SMP的支持。在多個(gè)程序同時(shí)執(zhí)行的情況下,支持SMP的多核系統(tǒng)具有比單處理器更好的性能,因?yàn)椴煌某绦蚩梢栽诓煌奶幚砥魃贤瑫r(shí)運(yùn)行,支持SMP還可以實(shí)現(xiàn)在一個(gè)核心上執(zhí)行硬實(shí)時(shí)應(yīng)用程序,而用戶(hù)界面(UI)或其它應(yīng)用程序可在另一個(gè)核心上運(yùn)行,以提高系統(tǒng)的效率。
WEC7提供了一組處理多核系統(tǒng)上線(xiàn)程和處理器調(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)前線(xiàn)程正在運(yùn)行的處理器 |
CeGetIdleTimeEx | 獲取指定處理器的空閑時(shí)間 |
CeGetProcessAffinity | 獲取指定進(jìn)程的進(jìn)程關(guān)聯(lián) |
CeGetThreadAffinity | 獲取指定線(xiàn)程的線(xiàn)程關(guān)聯(lián) |
CeGetTotalProcessors | 獲取系統(tǒng)中的處理器核心總數(shù) |
CeSetProcessAffinity | 為指定的進(jìn)程設(shè)置處理器關(guān)聯(lián) |
CeSetThreadAffinity | 為指定的線(xiàn)程設(shè)置處理器關(guān)聯(lián) |
默認(rèn)情況下,WEC7系統(tǒng)會(huì)自動(dòng)的將系統(tǒng)負(fù)載分配到CPU的所有核心上運(yùn)行,應(yīng)用程序不需要做任何設(shè)置。但根據(jù)不同的應(yīng)用場(chǎng)景,應(yīng)用程序也可以利用SMP API手動(dòng)的設(shè)置每個(gè)進(jìn)程、每個(gè)線(xiàn)程在指定的CPU核心上運(yùn)行,這里以計(jì)算ESM6802 i.MX6DL CPU每個(gè)核心的負(fù)載為例,介紹WEC7 SMP API的使用方法。
應(yīng)用程序首先通過(guò)CeGetTotalProcessors函數(shù)獲取當(dāng)前系統(tǒng)總的處理器(核心)個(gè)數(shù),然后根據(jù)CPU核心個(gè)數(shù)創(chuàng)建相同數(shù)量的CPUIdleMonitorThread應(yīng)用線(xiàn)程用于計(jì)算CPU負(fù)載,在創(chuàng)建線(xiàn)程后通過(guò)CeSetThreadAffinity函數(shù)將所創(chuàng)建的線(xiàn)程固定在指定的CPU核心上運(yùn)行。CPUIdleMonitorThread線(xiàn)程函數(shù)在執(zhí)行時(shí)先調(diào)用GetCurrentProcessorNumber函數(shù)取得執(zhí)行當(dāng)前線(xiàn)程的CPU核,而后再利用CeGetIdleTimeEx函數(shù)最終計(jì)算出每個(gè)CPU核心的負(fù)載率。完整的例子代碼如下:
#include"stdafx.h"
// time in seconds to run the monitor thread
#defineIDLE_MONITOR_TIME 100
HANDLE g_hMonitorThreads[4];
UINT32CPUIdleMonitorThread(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\r\n", 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%%)\r\n",
nCPUId, diff.LowPart, nIdleDiff, nCPUId, 100 - nIdlePercent));
nRunTime--;
}
SetEvent(g_hMonitorThreads[nCPUId - 1]);
returnnReturn;
}
intWINAPI 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\r\n", nTemp));
return0;
}
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3611瀏覽量
91327 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6100瀏覽量
36264
發(fā)布評(píng)論請(qǐng)先 登錄
京能信息蒞臨中軟國(guó)際數(shù)字電力科創(chuàng)中心調(diào)研
科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略

2025第二屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽正式開(kāi)賽
信創(chuàng)浪潮下,國(guó)產(chǎn)主板有什么新的發(fā)展機(jī)遇?

長(zhǎng)沙新一代信息技術(shù)產(chǎn)教聯(lián)合體正式成立,拓維信息當(dāng)選理事長(zhǎng)單位

龍芯中科榮獲2024年度信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
芯盛智能榮獲2024年信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿(mǎn)落幕
有方科技參編的信息技術(shù)團(tuán)體標(biāo)準(zhǔn)發(fā)布
龍芯中科助力2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦
拓維信息參與牽頭組建!長(zhǎng)沙新一代信息技術(shù)產(chǎn)教聯(lián)合體正式獲批

中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)
信創(chuàng)國(guó)產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀
梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單
GB/T 35590-2017信息技術(shù) 便攜式數(shù)字設(shè)備用移動(dòng)電源推薦標(biāo)準(zhǔn)

評(píng)論