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

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

3天内不再提示

英创信息技术应用程序助手AppHelper使用介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-04 10:14 次阅读

为保证系统稳定运行,系统CPU应避免长时间满负荷运作,应用程序CPU占用不宜过高。客户需要在调试阶段监测应用程序各个进程线程占用情况,对占用过高的进程线程进行优化。因CE自身不带进程线程系统占用查看工具,我们增加了AppHelper助手工具方便客户使用。

在之前的技术文章《CE应用程序助手简介》中简单介绍过英创AppHelper应用程序助手,本文将详细介绍AppHelper的使用方法。

AppHelper查看方法

客户在自制底板上只要引出了网络USBOTG,DEBUG调试串口,或板子其它串口任意之一便可以查看AppHelper信息

网络方式

通过telnet登录上板子,运行命令sysinfo,即可获得AppHelper打印的进程线程信息。

telnet模式打印示例图

USBOTG方式

使用AHC工具(使用方法见本文下一节)配置AppHelper输出为COM1。连接上板子USBOTG口,板子将以虚拟串口形式被PC识别。使用任意串口工具向该串口输出任意三个字符(任意波特率),即可获得AppHelper打印的进程线程信息。

USBOTG,DEBUG及其它串口打印示例图

DEBUG调试串口方式

使用AHC工具(使用方法见本文下一节)配置AppHelper输出为DEBUG。连接板子的DEBUG串口,PC端使用任意串口工具,设置波特率115200,向DEBUG口输出任意三个字符,即可获得AppHelper打印的进程线程信息。

串口方式

将底板上引出,且客户应用程序未使用的串口连接上PC。使用AHC工具(使用方法见本文下一节)配置好串口号及波特率。PC端使用任意串口工具,用设定的波特率向该串口输出任意三个字符,即可获得AppHelper打印的进程线程信息。

AHC工具使用介绍

AHC工具即AppHelper Config工具,用于设置AppHelper打印信息的输出位置。有两种办法进行设置。

控制面板方式

在板子控制面板中运行AHC工具。

选择好输出信息的串口及波特率(其中COM1为USBOTG),点击OK键保存配置,板子重启后配置生效。

telnet方式

通过telnet登录上板子,执行命令AHC port [baud]

参数port:串口号,值为0-6,0表示DEBUG串口,1表示USBOTG转虚拟串口,2-6分别表示板子的COM2-COM6。

参数baud:波特率,可选参数,如果不填表示保持原波特率,支持1200,2400,4800,9600,19200,38400,57600,115200。当port为0时,baud固定为115200,当port为1时,baud值不生效。

命令执行后,DEBUG口可以看到打印提示信息。

打印格式说明

打印结果为数行,其中每行的格式均为:类型 ID号 占用情况 名称

以下图一次打印的部分截图为例:

类型

PID表示为process进程。TID表示为上面进程下的thread线程。

ID号

即进程ID值或线程ID值。

占用情况

显示格式为 K n% U m% total%

n值为该进程或线程在Kernel系统层的占用

m值为该进程或线程在User用户层的占用

total值为总占用,它应当等于n+m的和

进程下各个线程total占用和应当等于进程的total占用

名称

进程名即EXE的名称,线程默认没有名称,下一节会介绍如何给线程命名,从而能在AppHelper中显示出来。

进程及线程监视说明

AppHelper会打印系统下所有的进程的CPU占用信息。

只有在\NandFlash目录下的exe生成的进程会额外打印出它下面所有线程的CPU占用信息。

默认情况下,生成的线程只有ID号,没有名称,如果线程较多会不便于查看。我们可以通过简单代码给线程命名。

以光盘里的串口例程SPT_HEX为例:

添加一个结构体的定义

typedef struct _THREAD_INDEX

{

DWORDdwSize;

DWORDdwThreadID;

TCHARszThreadName[32];

_THREAD_INDEX*pNext;

}THREAD_INDEX;

在创建线程后给线程命名

这里把串口接收线程命名为"CommRecvTread"

hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &m_dwTID);

HANDLE hHLP;

DWORD dwLen;

hHLP = CreateFile(L"HLP1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

THREAD_INDEXthreadIndex;

wsprintf(threadIndex.szThreadName, L"CommRecvTread");

threadIndex.dwThreadID = m_dwTID;

threadIndex.dwSize = sizeof(THREAD_INDEX);

WriteFile(hHLP, &threadIndex, sizeof(THREAD_INDEX), &dwLen, NULL);

CloseHandle(hHLP);

在结束线程后取消命名

线程结束后应当手动将命名取消掉,避免不必要的显示错误,设置线程名为空,即可取消原命名。

HANDLE hHLP;

DWORD dwLen;

hHLP = CreateFile(L"HLP1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

THREAD_INDEXthreadIndex;

wsprintf(threadIndex.szThreadName, L"");

threadIndex.dwThreadID = m_dwTID;

threadIndex.dwSize = sizeof(THREAD_INDEX);

WriteFile(hHLP, &threadIndex, sizeof(THREAD_INDEX), &dwLen, NULL);

CloseHandle(hHLP);

命名线程后再使用AppHelper查看,启动接收线程后,就可以看到CommRecvTread这个线程,另外个没有命名的线程为SerialPort程序的主线程。

计算原理及误差说明

CPU占用时间是通过计算一段时间内(AppHelper设置为2000毫秒)CPU空闲tick值与这段时间里CPU运算周期tick值得出。

CPU空闲tick值 = CPU空闲tick计数t2 – CPU空闲tick计数t1

CPU总周期tick值 = CPU总周期tick计数t2 – CPU总周期tick计数t1

CPU占用 = 1 – (CPU空闲tick值/CPU总周期tick值)× 100%

进程或线程的CPU占用,是通过计算一段时间CPU运算周期tick值,和这段周期里Kernel或User运行线程或进程的tick值,通过相除得到。

进程/线程Kernel占用 = (进程/线程Kernel运行tick值/CPU总周期tick值)× 100%

进程/线程User占用 = (进程/线程User运行tick值/CPU总周期tick值)× 100%

进程/线程CPU占用 = 进程/线程Kernel占用 + 进程/线程User占用

打印结果可能会有少量误差,可能由于以下原因:

1、实验值计算到个位,小数部分四舍五入,所以可能产生细微的误差。

2、理想中的测量情况如下图

但是实际情况由于AppHelper本身也会产生系统消耗,所以测量情况为下图

在Δt值不为0的情况下,如果在Δt期间各个tick值产生较大跳动时,测试结果可能产生误差。

3、各个进程或线程的运行tick值并非完全实时变化,而是在进程或线程完成一个时间片挂起后才加上,所以查询函数获得值不一定非常精确。

测试程序及说明

test_prc_thd是一个简单的程序,用来测试AppHelper的进程线程监视功能。

“添加线程”按钮按下会创建一个新的线程。参数中传入线程编号,线程ID等信息。

void Ctest_prc_thdDlg::OnBnClickedButton1()

{

DWORD dwTID;

HANDLE hTestThread;

m_threadParam[m_dwCnt].dwCnt = m_dwCnt;

m_threadParam[m_dwCnt].dwLv = m_dwCnt;

m_threadParam[m_dwCnt].bThreadStop = FALSE;

hTestThread = CreateThread(0, 0, TestTread, &m_threadParam[m_dwCnt], CREATE_SUSPENDED, &dwTID);

m_threadParam[m_dwCnt].dwThreadID = dwTID;

ResumeThread(hTestThread);

CloseHandle(hTestThread);

}

线程主函数里根据编号给线程自身命名,并且根据各自传入的参数执行负载率不等的计算。这里计算采用简单的循环计数,循环计算次数越多,线程CPU占用越多。

线程结束后,取消自身的命名。

DWORD Ctest_prc_thdDlg::TestTread(LPVOID lparam)

{

THREAD_PARAM *pThreadParam = (THREAD_PARAM*)lparam;

DWORDdwLen;

THREAD_INDEXthreadIndex;

HANDLE hHLP;

volatile int n;

hHLP = CreateFile(L"HLP1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

wsprintf(threadIndex.szThreadName, L"thread%d", pThreadParam->dwCnt);

threadIndex.dwThreadID = pThreadParam->dwThreadID;

threadIndex.dwSize = sizeof(THREAD_INDEX);

WriteFile(hHLP, &threadIndex, sizeof(THREAD_INDEX), &dwLen, NULL);

CloseHandle(hHLP);

HANDLEhFile;

WCHARwsFileName[64];

inti;

while(!pThreadParam->bThreadStop)

{

for (i=0; i<=pThreadParam->dwCnt; i++ )

{

intj;

for (j=0;j<0xfffff;j++)

{

n++;

}

}

Sleep(100);

}

hHLP = CreateFile(L"HLP1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

sprintf(threadIndex.szThreadName, L"");

threadIndex.dwThreadID = pThreadParam->dwThreadID;

threadIndex.dwSize = sizeof(THREAD_INDEX);

WriteFile(hHLP, &threadIndex, sizeof(THREAD_INDEX), &dwLen, NULL);

CloseHandle(hHLP);

return 0;

}

“结束所有线程”按钮按下,通知所有线程结束运行。

void Ctest_prc_thdDlg::OnBnClickedButton2()

{

inti;

for (i=0; i

{

m_threadParam[i].bThreadStop = TRUE;

Sleep(100);

}

m_dwCnt = 0;

}

测试例程,下图为该程序创建多个线程后的打印情况

该程序源码可以联系英创工程师获得,客户有疑问也可以向英创工程师咨询。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6086

    浏览量

    35468
收藏 人收藏

    评论

    相关推荐

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会支持,北京航空航天
    的头像 发表于 12-24 09:57 163次阅读

    有方科技参编的信息技术团体标准发布

    近日,有方科技参编的《信息技术产品供应链成熟度 共性指标 第1部分:企业背景评价》《信息技术产品供应链成熟度 共性指标 第2部分:技术掌控评价》《信息技术产品供应链成熟度 共性指标 第
    的头像 发表于 12-23 10:44 177次阅读

    龙芯中科助力2024首届教育信息技术应用创新大赛成功举办

    近日,2024首届教育信息技术应用创新大赛在北京航空航天大学成功举办。本次大赛由中国教育技术协会主办,教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信
    的头像 发表于 12-19 17:02 257次阅读

    拓维信息参与牵头组建!长沙新一代信息技术产教联合体正式获批

    的长沙新一代信息技术产教联合体成功获批,为长沙市信息技术产业发展注入了新的活力。图/《2024年长沙市市级市域产教联合体名单》长沙新一代信息技术产教联合体将依托龙头企
    的头像 发表于 12-07 01:06 428次阅读
    拓维<b class='flag-5'>信息</b>参与牵头组建!长沙新一代<b class='flag-5'>信息技术</b>产教联合体正式获批

    AWTK-WEB 快速入门(2) - JS 应用程序

    导读AWTK可以使用相同的技术栈开发各种平台的应用程序。有时我们需要使用Web界面与设备进行交互,本文介绍一下如何使用JS语言开发AWTK-WEB应用程序。用AWTKDesigner新
    的头像 发表于 12-05 01:04 135次阅读
    AWTK-WEB 快速入门(2) - JS <b class='flag-5'>应用程序</b>

    AWTK-WEB 快速入门(1) - C 语言应用程序

    导读AWTK可以使用相同的技术栈开发各种平台的应用程序。有时我们需要使用Web界面与设备进行交互,本文介绍一下如何使用C语言开发AWTK-WEB应用程序。用AWTKDesigner新建
    的头像 发表于 11-27 11:46 245次阅读
    AWTK-WEB 快速入门(1) - C 语言<b class='flag-5'>应用程序</b>

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 516次阅读

    国产化背景下的工控主板发展现状

    ,是信息技术应用创新产业的简称,于2016年“信工委会”(信息技术应用创新工作委员会)提出,目的就是要推动我们国内软硬件关键技术的研发
    的头像 发表于 09-21 16:15 447次阅读

    梯度科技入选2023年信息技术应用创新解决方案名单

    日前,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)在天津举办2024信息技术应用创新发展大会暨解决方案应用推广大会。会上正式公布了2023年
    的头像 发表于 09-09 16:29 454次阅读

    中软国际信服务助力大连信产业发展

    为进一步激发大连本地信产业生态的活力与潜力,搭建一个高效、开放的交流平台。由大连软件行业协会携手大连市信息技术应用创新综合服务中心主办,中软国际协办的,2024年大连市信息技术应用创新产业发展大会
    的头像 发表于 08-27 16:49 910次阅读

    应用程序中的服务器错误怎么解决?

    在使用应用程序时,可能会遇到服务器错误的问题。这种错误通常会导致应用程序无法正常运行 ,给用户带来不便。下面将介绍应用程序中的服务器错误及其解决方法,帮助您快速解决这一问题。
    的头像 发表于 03-12 15:13 6360次阅读

    龙芯中科三项信方案入围工信部2023年信息技术应用创新应用示范案例名单

    近日,工业和信息化部通报了2023年信息技术应用创新解决方案征集遴选结果,本次共评选出典型解决方案173个、应用示范案例83个、单项创新案例64个。
    的头像 发表于 03-07 16:45 972次阅读
    龙芯中科三项信<b class='flag-5'>创</b>方案入围工信部2023年<b class='flag-5'>信息技术</b>应用创新应用示范案例名单

    RX78M组 EtherCAT ETG.5003示例程序固件信息技术

    电子发烧友网站提供《RX78M组 EtherCAT ETG.5003示例程序固件信息技术.pdf》资料免费下载
    发表于 02-21 14:22 1次下载
    RX78M组  EtherCAT ETG.5003示例<b class='flag-5'>程序</b>固件<b class='flag-5'>信息技术</b>

    软通动力与捷技术签订战略合作协议

    近日,软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与宁波捷技术股份有限公司(以下简称“捷技术”)正式签订战略合作协议,并
    的头像 发表于 02-03 16:35 1132次阅读

    智能语音助手在教育行业的应用与挑战

    一、引言 随着人工智能技术的不断发展,智能语音助手在教育行业的应用越来越广泛。语音数据集在教育智能语音助手中发挥着重要作用,为系统提供了丰富的语音数据和信息,提高了教育服务的效率和质量
    的头像 发表于 01-19 17:21 901次阅读