0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术基于WEC7的多核系统编程方法

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-05 11:05 次阅读

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

#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
    +关注

    关注

    3

    文章

    3440

    浏览量

    87146
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34620
收藏 人收藏

    评论

    相关推荐

    单片机通过USB升级固件的方法

    单片机升级固件的方法有很多中,比如:ISP(在系统编程)、ICP(在电路编程)、IAP(在应用编程)等。
    的头像 发表于 01-11 09:37 619次阅读
    单片机通过USB升级固件的<b class='flag-5'>方法</b>

    C语言嵌入式系统编程修炼之一:背景篇

    电子发烧友网站提供《C语言嵌入式系统编程修炼之一:背景篇.rar》资料免费下载
    发表于 11-17 11:35 1次下载
    C语言嵌入式<b class='flag-5'>系统编程</b>修炼之一:背景篇

    浅谈多核系统编程技术

    因为NI LabVIEW是数据流编程语言,开发者们可以编写并行的应用程序,这些应用程序可以直接映射到并行的硬件(如多核心处理器和FPGA等)上以获得最优异的性能。这篇白皮书讨论了什么是数据流编程以及为什么说NI LabVIEW是
    的头像 发表于 10-27 17:08 197次阅读

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    Rust的多线程编程概念和使用方法

    Rust是一种强类型、高性能的系统编程语言,其官方文档中强调了Rust的标准库具有良好的并发编程支持。Thread是Rust中的一种并发编程方式,本文将介绍Rust中thread的相关概念、
    的头像 发表于 09-20 11:15 510次阅读

    请问什么接口在系统编程(ISP)工具支持系统升级?

    什么接口在系统编程(ISP)工具支持系统升级?
    发表于 08-24 07:26

    信息技术促使轨道交通全面升级

    有别于传统的铁公路系统,新型基础建设强调的是将新一代的信息技术纳入基建领域,在未来的交通系统中,智能化、信息化的轨道交通系统网络,搭配5G等
    的头像 发表于 08-21 11:11 481次阅读

    CoreSight技术系统设计指南

    。 这是内核全速运行时的非侵入性调试,使用: -关于指令执行和数据传输的信息集合--实时在芯片外交付--用于将数据与开发工作站上的源代码合并以供将来分析的工具。 CoreSight技术满足了对多核调试和跟踪解决方案的需求,该解决
    发表于 08-12 06:00

    2023年国家级高职学校信息技术教师能力培训会圆满举行

    2023年国家级高职学校信息技术教师能力培训会圆满举行
    的头像 发表于 07-31 22:56 391次阅读
    2023年国家级高职学校<b class='flag-5'>信息技术</b>教师能力培训会圆满举行

    SLG47004 在系统编程指南

    SLG47004 在系统编程指南
    发表于 07-04 18:51 0次下载
    SLG47004 在<b class='flag-5'>系统编程</b>指南

    Linux 系统编程的难点是什么

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程的开发人员来说,其难点在于,Linux 所囊括的技术点繁杂,往往不知从何下手。
    发表于 06-28 12:54 395次阅读

    迅为RK3568开发板系统编程手册全新升级

    迅为RK3568开发板系统编程手册全新升级
    的头像 发表于 06-25 15:50 650次阅读
    迅为RK3568开发板<b class='flag-5'>系统编程</b>手册全新升级

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49

    为什么我们要掌握Linux系统编程

    为什么我们要掌握Linux系统编程
    的头像 发表于 05-17 10:00 612次阅读

    权威榜单发布!“2022-2023信息技术应用创新榜”隆重揭晓

    2023年5月8日,由信息化观察网、信息技术应用创新榜组委会组织发起的“2022-2023信息技术应用创新榜”评审结果正式公示。本次榜单征集旨在全面展示信创发展最新成果,遴选出信创细分领域创新
    的头像 发表于 05-09 09:40 851次阅读