VxWorks平台下计算cpu的利用率

1、VxWorks的spyLib库提供的spy工具的实现原理。

 

Spy利用辅助定时器来产生中断,并且为每个任务维护一个计数器。然后记下被中断的任务,并且将该任务的计数器加一。经过一段时间后,每个任务的计数器反映了该任务占用CPU利用率的情况。很明显,这是利用抽样技术。并且得到的CPU利用率的准确程度取决于任务的持续性和周期性。

 

通过查找spyLib.h的文件,我们发现除了spy()函数外,还有一spyCommon函数,带一函数指针参数。推测函数指针类型为(int)(*p)(char * fmtStr,…)(经过验证确实如此)。所以可以写一自己的函数去接受spy需要打印的数据,Spy调用该函数按行打印结果。我们可以不断分析一行字符串来得到我们需要的结果。

int SpyPtnFunc(const char * fmtPtn,...)

{

  char buf[128];

  CPUUSAGEDATAMSG data;

 

  va_list vl;

  va_start(vl,fmtPtn);

  vsprintf(buf,fmtPtn,vl);  //得到一行字符串。

  va_end(vl);

 

  //分析buf,得到一个任务的CPU的使用情况。

  return 0;

}

 

另外一种方法是利用一特殊任务,该任务的优先级比系统中的所有任务的优先级都低,该任务是死循环,该任务的目的就是消耗cpu资源,占用cpu空闲时间,因为当系统中其它任务都被挂其时,该任务才能得到cpu的使用权。假设一段时间total内,该任务的运行时间为idle,cpu利用率的计算公式为(total-idle)%total。这一种方法实现起来很简单,但是它只能算得整个系统的cpu使用情况,不能得到单个任务的cpu使用情况!同时它会使cpu满负荷工作。源代码如下

#include "VxWorks.h"

#include "semLib.h"

#include "taskLib.h"

 

#define SECONDS_TO_BURN 60

 

typedef struct cpuUsage {

    SEM_ID        startSem;

    int           didNotComplete;

    unsigned long ticksNoContention;

    int           nBurnNoContention;

    unsigned long ticksNow;

    int           nBurnNow;

    double        usage;

} cpuUsage;

 

static cpuUsage *pcpuUsage=0;

 

static double cpuBurn()

{

    int i;

    double result = 0.0;

 

    for(i=0;i<5; i++) result += sqrt((double)i);

    return(result);

}

 

static void cpuUsageTask()

{

    while(TRUE) {

        int    i;

        unsigned long tickStart,tickEnd;

 

        semTake(pcpuUsage->startSem,WAIT_FOREVER);

        pcpuUsage->ticksNow=0;

        pcpuUsage->nBurnNow=0;

        tickStart = tickGet();

        for(i=0; i< pcpuUsage->nBurnNoContention; i++) {

            cpuBurn();

            pcpuUsage->ticksNow = tickGet() - tickStart;

            ++pcpuUsage->nBurnNow;

        }

        tickEnd = tickGet();

        pcpuUsage->didNotComplete = FALSE;

        pcpuUsage->ticksNow = tickEnd - tickStart;

    }

}

 

 double getCpu()

{

    if(pcpuUsage->didNotComplete && pcpuUsage->nBurnNow==0) {

        pcpuUsage->usage = 0.0;

    } else {

        double temp;

        double ticksNow,nBurnNow;

 

        ticksNow = (double)pcpuUsage->ticksNow;

        nBurnNow = (double)pcpuUsage->nBurnNow;

        ticksNow *= (double)pcpuUsage->nBurnNoContention/nBurnNow;

        temp = ticksNow - (double)pcpuUsage->ticksNoContention;

        temp = 100.0 * temp/ticksNow;

        if(temp<0.0 || temp>100.0) temp=0.0; /*handle tick overflow*/

        pcpuUsage->usage = temp;

    }

    pcpuUsage->didNotComplete = TRUE;

    semGive(pcpuUsage->startSem);

    printf("CPU usage:%f/r/n",pcpuUsage->usage);

    return(pcpuUsage->usage);

}

 

 void cpuUsageInit(void)

{

    unsigned long tickStart,tickNow;

    int           nBurnNoContention=0;

    int         ticksToWait;

 

    ticksToWait = SECONDS_TO_BURN*sysClkRateGet();

    pcpuUsage = calloc(1,sizeof(cpuUsage));

    tickStart = tickGet();

    /*wait for a tick*/

    while(tickStart==(tickNow = tickGet())) {;}

    tickStart = tickNow;

    while(TRUE) {

        if((tickGet() - tickStart)>=ticksToWait) break;

        cpuBurn();

        nBurnNoContention++;

    }

    pcpuUsage->nBurnNoContention = nBurnNoContention;

    pcpuUsage->startSem = semBCreate (SEM_Q_FIFO,SEM_EMPTY);

    pcpuUsage->ticksNoContention = ticksToWait;

    pcpuUsage->didNotComplete = TRUE;

    taskSpawn("cpuUsageTask",255,VX_FP_TASK,1000,(FUNCPTR)cpuUsageTask,

        0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】DCMTK开源库类继承结构与DICOM3.0标准元素定义的对应关系图

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/9275271 最近由于课题需要&#xff0c;拿出来一些时间阅读了下DICOM3.0标准。在处理相关的DCM医学图像时使用了DCMTK开源库&#xff0c;废话不多说&#xff0c;直接贴图&#xff1a; 图一&#xff1a;DCMTK开…

c语言中用简易暗纹来输入密码,确定夫琅和费单缝衍射明、暗纹位置的不同教学方法的讨论...

崔红玲苏向英摘要&#xff1a;夫琅和费单缝衍射的明、暗纹位置及相应光强是波动光学中的重要部分&#xff0c;用不同的方法讲解效果不同。本文比较了惠更斯-菲涅耳原理定量积分法及半波带法得到的结论&#xff0c;表明在近似情况下&#xff0c;这两种方法都可以对其进行描述。关…

tickGet

tickGet&#xff08;&#xff09;返回的是从系统启动开始tick计数后的总的tick数目。 tick是啥&#xff0c;是“滴答”&#xff0c;它是一个数值量&#xff0c;本身不能代表时间。 如果说要知道tick增加一个代表多少时间的话&#xff0c;那就要看系统的时钟率了。 在Shell下…

C#控制台程序,发送邮件,可带附件

最近几天由于公司发送了大量内容相同的邮件,而被国外的反垃圾邮件组织列入了黑名单,致使很多客户收不到我们的邮件,客服接到投诉,而之前做的一个查询日志的小页面,因为某种原因,访问速度很慢,甚至这几天人一多,页面就总是超时.刚开始以为是程序问题或者是数据量比较大,但是程序…

【转】从零开始学图形学:10分钟看懂贝塞尔曲线

转自&#xff1a;https://zhuanlan.zhihu.com/p/344934774 引入 在画画的时候&#xff0c;你可能会遇到画曲线的情况。比如你想画一个肥宅的大肚子轮廓&#xff0c;此时你随手一画&#xff0c;发现不好看&#xff0c;感觉太鼓了&#xff0c;于是你只能重新画&#xff0c;再画一…

Linux重启网卡的方法

重启网卡的几种方法&#xff1a;一、network利用root帐户# service network restart二、ifdown/ifup# ifdown eth0# ifup eth0三、ifconfig# ifconfig eth0 down# ifconfig eth0 up

android webview url scheme,Android Webview ERR_UNKNOWN_URL_SCHEME错误

当我点击链接到mailto&#xff1a;adminikiyuzoniki.net时,我收到此错误&#xff1a;net: ERR_UNKNOWN_URL_SCHEME我试图添加一个if(url.startsWith(“mailto&#xff1a;”))条件,但它不起作用.这是我的MyWebViewClient方法&#xff1a;public class MyWebViewClient extends …

【转】编译DCMTK

转自&#xff1a;https://blog.51cto.com/u_2845385/1053291 也许是DCMTK的开发人员认为DCMTK是一个专用的库&#xff0c;没有必要做成动态链接库。 也许是DCMTK的开发人员认为DCMTK需要跨平台&#xff0c;做成动态链接库就平台相关了&#xff0c;违背了跨平台的本意。 …

WinCE6下的kernelIoControl使用方法

WinCE6下的kernelIoControl可不是谁都可以调的。 这个可能很多人曾经知道&#xff0c;但是老是忘记&#xff0c;比如我&#xff0c;哈哈。 kerneliocontrol以前在CE5下面耍惯了&#xff0c;用这个接口&#xff0c;AP简直可以无法无天啊&#xff0c;动不动就reset你&#xff0…

Flex 学习随笔 ---- 使用WebService 与数据库连接

任何一个网络工具&#xff0c; 如果不能和数据打交道&#xff0c;那它就是失败的。 还好Flex是可以的&#xff0c;由于本人刚学&#xff0c;就用asp.netc#来讲下这个简单的连接。 Flex 和数据库通讯现在只能使用Service&#xff0c;如httpservice,rpcservice,webservice等等。 …

第三方登录android代码,Android Learning:微信第三方登录(示例代码)

这两天&#xff0c;解决了微信第三方授权登录的问题&#xff0c;作为一个新手&#xff0c;想想也是一把辛酸泪。我想着&#xff0c;就把我的遇到的坑给大家分享一下&#xff0c;避免新手遇到我这样的问题能够顺利避开。步骤一 微信开发者平台我开始的解决思路是&#xff0c;去这…

【转】基于DCMTK的DICOM相关程序编写攻略

转自&#xff1a;https://blog.csdn.net/jackmacro/article/details/5332654 零、前言&#xff1a; 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢&#xff0c;因此&#xff0c;我们在进行医学图像处理的过程中&#xff0c;经常需要自己编写和DICOM格式的图…

对象与函数

摘自《UMLOOPC嵌入式C语言开发精讲》 11.3 对象与函数11.3.1 函数的角色经济诺贝尔奖得主H.A.Simon&#xff08;H.A.Simon&#xff0c;计算机人工智能之父&#xff09;在其1962年的文章《The Architecture of Complexity》中说道&#xff1a;“从小系统建造成庞大系统时&…

android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...

今天写一篇文章来总结下android批量打渠道包美团版本。之前项目上一直用的是gradle 批量打包方式&#xff0c;那个速度啊真是令人发指&#xff0c;15个渠道得跑上半个小时&#xff0c;出去吃顿饭回来&#xff0c;还在跑。特别是赶上项目上线的话&#xff0c;如果给测试提交了正…

【转】云社区 博客 博客详情 二维异形件排版算法介绍(一)

转自&#xff1a;https://bbs.huaweicloud.com/blogs/175385 【摘要】 排样问题&#xff08;Nesting Problem&#xff09;又称为下料问题(Cutting and stock problems)或填充问题(Packing Problem)&#xff0c;其目标是在材料切割过程中寻找一个较高的材料利用率。排样问题属于…

增加RIL组件时编辑出现的问题

当我把RIL组件加进到CE6的项目里去编译,本来好好的项目编译不过去了,我就选择了RIL的所有feature&#xff0c;没有改任何东西,理论上sysgen就可以了&#xff0c;但是确总是编译不过去 看根目录下的build.log: E:/WINCE600/OSDesigns/POS410/POS410/Wince600/E6000_ARMV4I/cesy…

android 微信两个服务的,微信上线两个新功能

微信又上线新功能了&#xff01;一个与你的钱包相关&#xff0c;一个与你的微信号相关&#xff0c;赶紧来看看吧微信支付分全面开放每个微信用户都拥有自己的一个分数值 &#xff0c;且每月根据综合数据更新一次。达到一定的分值门槛&#xff0c;用户即可享受超千项便捷服务。这…

【转】二维异形件排版算法介绍(二)

转自&#xff1a;https://bbs.huaweicloud.com/blogs/196289【摘要】 二维不规则异形件主要有两种策略&#xff1a;分别是基于可行解的排样策略和基于重叠移除的排样策略。所谓基于可行解的排样策略&#xff0c;是指在排样过程中零件之间始终是不重叠的&#xff0c;而基于重叠移…

解决用户控件循环引用的笨办法

在上一篇中提到使用MagicAjax开发了一个项目,因为做这个项目之前对MagicAjax不是很了解,在里面使用了用户控件,我发现这是一个很致命的错误,用户控件在MagicAjax中用起来很痛苦.因我们的项目不是简单的只要求"看起来像"没有刷新页面,其中一个主要的页面有那么一点点复…

【转】介绍一些免费/开源的医学影像后处理工具

转自&#xff1a;https://blog.csdn.net/liaopiankun0618/article/details/84328331 来源&#xff1a;融视影像科技 综述 医学影像的处理有两个特质。一是复杂&#xff0c;整个处理流程涉及多种算法&#xff0c;需要调整的参数较多。二是发展快&#xff0c;从采集、重建到后…