对嵌入式操作系统的性能信息进行实时监测的方法

文档序号:6555677阅读:229来源:国知局
专利名称:对嵌入式操作系统的性能信息进行实时监测的方法
技术领域
本发明涉及计算机系统领域,特别涉及计算机嵌入式操作系统性能监控技术领域,具体是指一种对嵌入式操作系统的性能信息进行实时监测的方法。

背景技术
随着计算机技术的不断发展,嵌入式操作系统已经成为各种便携式移动设备中必不可少的软件操作平台,而其中内存使用量和CPU利用率是嵌入式操作系统的两项重要性能指标。内存在嵌入式系统中是相当昂贵和有限的资源,CPU利用率能够反映系统以及各程序对CPU的使用状况,这两项性能指标对于系统开发人员而言具有非常重要的参考价值;而对这两个性能指标的直观的实时的监测无疑具有重要的意义。
嵌入式操作系统不同于桌面操作系统,各种硬件资源相当有限,监测程序本身不能占用过多的系统资源,不能采用复杂的图形监测手段,否则会降低监测的准确性;请参阅图1所示,在嵌入式系统开发早期不具备图形系统的情况下,无法对性能指标进行直观的监测,只能作到简单的打印输出到屏幕观察或者记录到文件中事后观察,这样的检测模式缺乏形象的表达方式,同时不能实时进行监控,无法对于运行中的各种情况进行实时跟踪,检测效率低下。


发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种使得系统开发人员能够方便的监测系统内存以及CPU使用状况、容易判断系统内存和CPU使用是否合理、直观形象、检测结果准确可靠、运行性能稳定、适用范围较为广泛的对嵌入式操作系统的性能信息进行实时监测的方法。
为了实现上述的目的,本发明的对嵌入式操作系统的性能信息进行实时监测的方法如下 该对嵌入式操作系统的性能信息进行实时监测的方法,包括嵌入式操作系统宿主目标机和开发计算机,所述的目标机和开发计算机上均具有通信接口设备,所述的目标机的通信接口设备通过通信数据线和开发计算机的通信接口设备相连接,其主要特点是,所述的方法包括以下步骤 (1)目标机系统和开发计算机系统分别进行初始化操作; (2)目标机系统创建系统性能信息监控线程,并对该线程设置最高优先级; (3)所述的系统性能信息监控线程周期性的经过系统预设的一时间间隔的睡眠后,进行系统性能信息采集和传送至通信接口设备的处理操作; (4)开发计算机系统通过通信接口设备进行接收所述的系统性能信息的处理操作; (5)如果接收成功,则将该系统性能信息存入数据缓冲区中; (6)开发计算机系统获取数据缓冲区中的系统性能信息数据,并进行系统性能信息的图形化显示操作。
所述的通信接口设备为串行通信接口设备,所述的通信数据线为串行通信数据线。
所述的系统性能信息采集和传送至通信接口设备的处理操作包括以下步骤 (1)该系统性能信息监控线程获取当前系统内存使用量和CPU利用率信息; (2)将上述的性能信息按照预设的数据包格式进行封装; (3)将封装好的数据包写入目标机的串行通信接口设备中; (4)目标机的串行通信接口设备通过串行通信数据线将该数据包传送至开发计算机的串行通信接口设备。
所述的CPU利用率信息的获取包括以下步骤 (1)在第一时刻获取系统自启动以来经过的时间ExcTime1和系统自启动以来空闲线程Idle所执行的时间IdleTime1; (2)经过一段时间后,在第二时刻获取系统自启动以来经过的时间ExcTime2和系统自启动以来空闲线程Idle所执行的时间IdleTime2; (3)根据以下公式计算出得到该段时间长度t1以及该段时间内Idle线程执行的时间t2 t1=ExcTime2-ExcTime1,t2=IdleTime2-IdleTime1; (4)使用以下公式计算出CPU利用率信息 CPU利用率=(t1-t2)/t1。
所述的预设的数据包格式包括数据包头、数据包体和校验数据,其中数据包体为性能信息数据。
所述的接收所述的系统性能信息的处理操作包括以下步骤 (1)读取串行通信接口设备中的数据包; (2)当获取到数据包头后,对后面的数据进一步读取; (3)当获取到数据包体后,对后面的数据进一步读取; (4)获取到校验数据后进行校验,如果校验正确,则返回接收成功的结果,否则丢弃这个数据包并返回接收失败的结果。
所述的将系统性能信息存入数据缓冲区包括以下步骤 (1)将该系统性能信息数据存入数据缓冲区的尾部; (2)判断该数据缓冲区是否超过了系统预设的长度; (3)如果是,则删除数据缓冲区头部的系统性能信息数据。
所述的系统性能信息的图形化显示操作包括以下步骤 (1)系统依据窗口大小绘制背景颜色和直角坐标系网格; (2)输出当前内存使用量和CPU利用率的文本信息; (3)绘制内存使用量曲线纵轴刻度,其中该刻度为将总的内存量等分成十份的刻度; (4)绘制CPU利用率曲线纵轴刻度,其中该刻度为将100%等分成十份的刻度; (5)读取数据缓冲区中的系统性能信息数据,将当前缓冲区中的所有内存使用量数据和所有CPU利用率数据在各自的直角坐标系中的坐标点分别使用曲线进行连接并显示出来; (6)根据系统预设的时间间隔周期性的刷新缓冲区数据,并将各个数据坐标点的横坐标增加一定数值,显示出曲线随时间横向动态移动的效果。
所述的系统预设的时间间隔为1秒钟。
采用了该发明的对嵌入式操作系统的性能信息进行实时监测的方法,由于在宿主目标机系统中创建了一个最高优先级线程定时采集并发送性能数据,最高优先级确保该线程在执行操作时不被其它线程打断,保证数据包的完整性以及发送的定时可靠性,而且该线程不再进行其它任何操作,从而能够将监测程序本身对性能的影响降到最低,使得测试结果更接近实际性能本身,并且目标机在监测性能的同时可以运行一些程序,通过这些程序对系统在程序执行时的内存使用量和CPU利用率信息进行更好的察看;同时,采用特定数据包格式发送数据,避免其它数据对性能数据的干扰造成数据传输的错误;不仅如此,由于开发计算机接收并解析数据包,使用曲线图形的方式动态显示性能数据,让性能数据的表达更加直观和形象;而且该方法的检测结果准确可靠,系统运行性能稳定,适用范围较为广泛,使得系统开发人员能够方便直观的对系统性能进行监测,提高了监测效率和效果,从而能够快速的改善嵌入式操作系统的性能,为嵌入式操作系统的进一步发展和新的应用的开发奠定了坚实的基础。



图1为现有技术中一般的嵌入式操作系统性能监测模型示意图。
图2为本发明的嵌入式操作系统开发数据通信模型示意图。
图3为本发明的对嵌入式操作系统的性能信息进行实时监测的方法的工作原理示意图。
图4为本发明的对嵌入式操作系统的性能信息进行实时监测的方法的各功能模块的逻辑关系示意图。
图5为本发明的对嵌入式操作系统的性能信息进行实时监测的方法的CPU占用率图形界面在某一时刻截取的曲线示意图。

具体实施例方式 为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图2至图5所示,该对嵌入式操作系统的性能信息进行实时监测的方法,包括嵌入式操作系统宿主目标机和开发计算机,所述的目标机和开发计算机上均具有通信接口设备,所述的目标机的通信接口设备通过通信数据线和开发计算机的通信接口设备相连接,所述的通信接口设备为串行通信接口设备,所述的通信数据线为串行通信数据线,当然也可以根据情况采用其它类型的通信接口设备,其中,所述的方法包括以下步骤 (1)目标机系统和开发计算机系统分别进行初始化操作; (2)目标机系统创建系统性能信息监控线程,并对该线程设置最高优先级; (3)所述的系统性能信息监控线程周期性的经过系统预设的一时间间隔的睡眠后,进行系统性能信息采集和传送至串行通信接口设备的处理操作,其中,所述的系统预设的时间间隔为1秒钟,该处理操作包括以下步骤 (a)该系统性能信息监控线程获取当前系统内存使用量和CPU利用率信息,所述的CPU利用率信息的获取包括以下步骤 (i)在第一时刻获取系统自启动以来经过的时间ExcTime1和系统自启动以来空闲线程Idle所执行的时间IdleTime1; (ii)经过一段时间后,在第二时刻获取系统自启动以来经过的时间ExcTime2和系统自启动以来空闲线程Idle所执行的时间IdleTime2; (iii)根据以下公式计算出得到该段时间长度t1以及该段时间内Idle线程执行的时间t2 t1=ExcTime2-ExcTime1,t2=IdleTime2-IdleTime1; (iv)使用以下公式计算出CPU利用率信息 CPU利用率=(t1-t2)/t1; (b)将上述的性能信息按照预设的数据包格式进行封装,该数据包格式包括数据包头、数据包体和校验数据,其中数据包体为性能信息数据; (c)将封装好的数据包写入目标机的串行通信接口设备中; (d)目标机的串行通信接口设备通过串行通信数据线将该数据包传送至开发计算机的串行通信接口设备; (4)开发计算机系统通过通信接口设备进行接收所述的系统性能信息的处理操作,该处理操作包括以下步骤 (a)读取串行通信接口设备中的数据包; (b)当获取到数据包头后,对后面的数据进一步读取; (c)当获取到数据包体后,对后面的数据进一步读取; (d)获取到校验数据后进行校验,如果校验正确,则返回接收成功的结果,否则丢弃这个数据包并返回接收失败的结果; (5)如果接收成功,则将该系统性能信息存入数据缓冲区中,包括以下步骤 (a)将该系统性能信息数据存入数据缓冲区的尾部; (b)判断该数据缓冲区是否超过了系统预设的长度; (c)如果是,则删除数据缓冲区头部的系统性能信息数据; (6)开发计算机系统获取数据缓冲区中的系统性能信息数据,并进行系统性能信息的图形化显示操作,该图形化显示操作包括以下步骤 (a)系统依据窗口大小绘制背景颜色和直角坐标系网格; (b)输出当前内存使用量和CPU利用率的文本信息; (c)绘制内存使用量曲线纵轴刻度,其中该刻度为将总的内存量等分成十份的刻度; (d)绘制CPU利用率曲线纵轴刻度,其中该刻度为将100%等分成十份的刻度; (e)读取数据缓冲区中的系统性能信息数据,将当前缓冲区中的所有内存使用量数据和所有CPU利用率数据在各自的直角坐标系中的坐标点分别使用曲线进行连接并显示出来; (f)根据系统预设的时间间隔周期性的刷新缓冲区数据,并将各个数据坐标点的横坐标增加一定数值,显示出曲线随时间横向动态移动的效果。
在实际使用当中,本发明的主要目的是为了提供一种嵌入式操作系统的直观的实时的性能监测方法,在该监测方法中,嵌入式操作系统每隔一段时间通过串口将当前性能数据以一定的格式打包实时的传输至开发计算机,开发计算机端实现一个程序用于读取串口,并进行性能数据包处理将其实时图形化显示出来,使得系统开发人员能够方便的监测系统内存以及CPU使用状况,这是判断系统是否合理使用内存和CPU的重要依据。
嵌入式操作系统通常在开发计算机端(如装有Windows操作系统的计算机)进行编译链接,将程序上传到嵌入式系统上运行,查看嵌入式系统控制台的输出,还可以在开发计算机端进行远程调试等。而宿主目标机即运行嵌入式操作系统和相关程序的设备。
嵌入式操作系统开发过程中串口通常作为连接开发机与目标机的工具,是信息传送的通道,目标机的控制台信息可以在开发机显示出来,以及可以在开发机端进行调试等。
数据传输过程中为避免特殊需要的数据与其它数据(例如操作系统或运行程序的控制台输出)混合而不便于提取,可将特殊数据合成数据包,数据包具有数据包头,数据包体以及校验数据三个组成部分。
数据包头——采用特殊字符串作为数据包开始的标志; 数据包体——真正需要的数据; 校验数据——用于校验数据包的正确性,可采用奇偶校验,或运算校验等。通常较长的数据需要校验。
在该嵌入式操作系统的性能实时监测方法中,目标机每隔一段时间通过串口将当前性能数据以一定的格式打包实时的传输至开发机,开发机端实现一个程序用于读取串口,并进行性能数据包处理将其实时图形化显示出来。
为了实现上述的方法,该目标机中至少具有 ●串口设备,用于传输性能数据; ●嵌入式操作系统具有串口驱动程序,支持串口读写;以及获取当前性能数据的接口,使用该接口通常每隔一定的时间向串口输出当前内存使用和CPU利用率性能数据。
上述的开发机至少具有 ●串口设备,用于接收性能数据; ●安装有具备图形系统的操作系统,支持串口读写,可开发一个图形程序用于实时图形化显示接收到的性能数据。
该嵌入式操作系统的性能实时监测方法步骤如下 步骤1——目标机使用一个具有最高优先级的线程进行操作,这个线程每睡眠一段时间之后便执行操作,这些操作包括 ●步骤1A——调用嵌入式操作系统获取性能数据的接口方法,获取当前性能数据,包括内存使用量和CPU利用率信息; ●步骤1B——将性能数据按照一定的数据包格式封装,写入串口。
步骤2——开发机读取串口数据,当读取到数据包头时,对后面的数据进一步读取,就获得了数据包体,如果有校验位则获取校验数据进行校验,如果校验正确便执行下一步骤,否则丢弃这个数据包并等待读取下个数据包。
步骤3——开发机将获取的性能数据保存在一段能够存储特定个性能数据的数据缓冲区,每当新数据到来之时就对该缓冲区的所有数据进行一次数据处理,包括 ●步骤3A——如果写入的数据个数超过特定个数时便抛弃最先进入缓冲区的那个数据; ●步骤3B——获取缓冲区数据,将各个同类数据使用“时间——数据”曲线连接并显示出来,下一次数据显示时将各个数据横坐标增加一定数值,这样显示出来的曲线会横向动态移动。
内存使用量和CPU利用率分别用不同的曲线显示,通俗的讲,图形化显示一种类似心电图的曲线,这样便可以实时动态的看到性能变化过程。由于目标机的性能数据获取采用线程进行,这样操作人员可以同时运行一些程序,查看这些程序运行时的内存和CPU使用变化曲线,快速的对这些系统性能的合理性作出判断。
再请参阅图4所示,下面将结合具体实施例的计算机代码详细说明实现该方法的过程 (1)目标机线程处理模块——数据采集和性能数据包发送 首先要获取性能数据,由嵌入式操作系统提供接口方法获取当前内存信息以及两个与CPU利用率计算相关的方法获取系统自启动以来经过的时间以及系统自启动以来Idle线程执行的时间。然后将性能数据以一定的包格式封装,通过串口发送,见如下实现代码 ECODE_stdcall DetectorThread(void*pArg);  ECODE DetectorStart()  {  IThread*pIThread=NULL;  //创建监测线程  ECODE ec=EzCreateThread(DetectorThread,NULL,0,&amp;pIThread);  if(FAILED(ec)){  printf("Create detector thread failed.\n");  return ec;  }  //设置该线程为最高优先级线程  pIThread->SetPriority(ThreadPriority_Highest);  WaitResult wr;  pThread->Join(INFINITE,&amp;wr);  pIThread->Release();  return S_OK;  }  ECODE_stdcall DetectorThread(void*pArg)<!-- SIPO <DP n="7"> --><dp n="d7"/>  {  uint_t ElapsedStart;  uint_t tIdleStart;  uint_t tElapsedEnd;  uint_t tIdleEnd,;  IDriver*pDry=NULL; //获取系统提供性能信息的服务   ECODE ec=EzFindService(EZCSTR("device:mstatserver"),(IObject**)&amp;pDrv);    if(FAILED(ec)){  printf("EzFindService error\n");  return ec;  }  EzByteBuf_<20>ebbElapsedStart;  EzByteBuf_<20>ebbIdleStart;  EzByteBuf_<sizeof(struct STATINFO)>ebbMemStat;  pDrv->Control(1,EZBYTEBUF_NULL,ebbElapsedStart,NULL);  pDrv->Control(2,EZBYTEBUF_NULL,ebbIdleStart,NULL);  tElapsedStart=*(uint_t*)((char*)ebbElapsedStart);  tIdleStart=*(uint_t*)((char*)ebbIdleStart);  //循环向串口输出性能数据包  while(TRUE){  EzSleep(1000,NULL);  pDrv->Control(1,EZBYTEBUF_NULL,ebbElapsedStart,NULL);  pDrv->Control(2,EZBYTEBUF_NULL,ebbIdleStart,NULL);  pDrv->Control(0,EZBYTEBUF_NULL,ebbMemStat,NULL);  tElapsedEnd=*(uint_t*)((char*)ebbElapsedStart);  tIdleEnd=*(uint_t*)((char*)ebbIdleStart);  //计算CPU利用率并放大1000倍便于数据传送  logItem.cpuRate=1000-1000*(tIdleEnd-tIdleStart)/(tElapsedEnd-tElapsedStart);  struct STATINFO*pMStatInfo=(struct STATINFO*)(char*)ebbMemStat;  intnDataLen=0;  char szData[100];  nDataLen=sprintf(szData,"\n\x02OSLCPU%03d\n\n\x02OSLMEM%08x %08x %08x\n",  logItem.cpuRate,\  pMStatInfo->uTotalPages*1024*4,\  pMStatInfo->uFreePages*1024*4,\  (pMStatInfo->uTotalPages*1024*4)|\  (pMStatInfo->uFreePages*1024*4));  //写串口  WriteComPort(szData,nDataLen);  tElapsedStart=tElapsedEnd;  tIdleStart=tIdleEnd;  }  pDrv->Release();  return S_OK;  } 其中,步骤1——系统在后台调用DetectorStart创建了监测线程DetectorThread,并设置该线程为最高优先级线程。
步骤2——监测线程获取系统的“mstatserver”服务,该服务提供Control方法可以获得当前的内存信息ebbMemStat,系统自启动以来经过的时间ebbElapsedStart以及系统自启动以来Idle线程执行的时间ebbIdleStart。
步骤3——循环执行系统每隔1秒(EzSleep(1000,NULL))通过Control方法获取步骤2所述性能数据;CPU利用率的计算方法为某段时间间隔内,将这段时间间隔减去期间Idle线程的执行时间,再除以这段时间间隔即算出CPU利用率;然后将性能数据使用sprintf格式化成数据包,代码中格式化了两个数据包后调用WriteComPort一起写入串口——一个数据包为CPU利用率数据包,具有数据包头(\x02OSLCPU)和数据包体(CPU利用率的1000倍,便于格式化成3位整数传输),另一个数据包为内存信息数据包,具有数据包头(\x02OSLMEM)、数据包体(总的内存量和空闲的内存量)以及校验数据(总的内存量与空闲内存量的或运算结果)。
(2)开发机的串口数据处理和绘图模块 开发机采用安装有Windows2000操作系统的计算机。开发机端的图形程序采用VisualC++6.0开发。主要包含以下步骤 步骤1——通过串口接收目标机发来的数据包,并进行解析和校验,然后以Windows消息形式发送数据包,见如下实现代码   typedef struct tagTRACEPKG{  int TotalMem;  int AvailMem;  int CPUPercentage;  }TRACEPKG,*pTRACEPKG;  const unsigned int START_MAGIC=0x02;//char of'stx'  const unsigned int OSL_MAGIC =0x4c534f;//char of"OSL"  const unsigned int MEM_MAGIC =0x4d454d; //char of"MEM"  const unsigned int CPU_MAGIC =0x555043; //char of"CPU"  #define MEM_DATA_LEN26  #define CPU_DATA_LEN 3  void CTraceCom::SendData(TRACEPKG*pTracePkg)  {  CWnd*pWnd=theWndCtrl.m_pwndOslatView;  if(pWnd!=NULL){  ::SendMessage(pWnd->GetSafeHwnd(),WM_GETTRACEDATA,0,(LPARAM)pTracePkg);  }  }  BOOL CTraceCom::Trace(void)  {  char cStart;  UINT magic=0,subMagic=0;  char szMem[MEM_DATA_LEN];  char szCpu[CPU_DATA_LEN];  DWORD dwRead=0;  int checkSum=0;  while(!m_bStop){  if(!ReadFile(m_hCom,&amp;cStart,1,&amp;dwRead,NULL)){  printf("error reading COM port.%d\n",GetLastError());  return FALSE;  }  if(dwRead &amp;&amp;(START_MAGIC==cStart)){  if(!ReadFile(m_hCom,(char*)&amp;magic,3,&amp;dwRead,NULL)){  printf("error reading COM port.%d\n",GetLastError());  return FALSE;<!-- SIPO <DP n="9"> --><dp n="d9"/>  }  switch(magic){  case OSL_MAGIC:  if(!ReadFile(m_hCom,(char*)&amp;subMagic,3,&amp;dwRead,NULL)){  printf("error reading COM port.%d\n",GetLastError());  return FALSE;  }  switch(subMagic){  case MEM_MAGIC:  ReadFile(m_hCom,szMem,MEM_DATA_LEN,&amp;dwRead,NULL);  sscanf(szMem,"%08x %08x %08x",&amp;m_TracePkg.TotalMem,  &amp;m_TracePkg.AvailMem,&amp;checkSum);  if(checkSum!=(m_TracePkg.TotalMem|m_TracePkg.AvailMem))  m_TracePkg.TotalMem=0;  break;  case CPU_MAGIC:  ReadFile(m_hCom,szCpu,CPU_DATA_LEN,&amp;dwRead,NULL);  sscanf(szCpu,"%03d",&amp;m_TracePkg.CPUPercentage);  if(m_TracePkg.TotalMem==0)break;  SendData(&amp;m_TracePkg);  m_TracePkg.TotalMem=0;  break;  default:  printf("Unknown SubMagic.\n");  break;  }  break;  default:  printf("Unknown Magic.\n");  break;  }  }  }  return TRUE;  } 实现了一个CTraceCom类专门用于处理串口相关的操作并发送Windows消息处理该数据包。成员变量m_hCom是创建的串口操作句柄,串口句柄的创建和配置过程不另外详细写明,需要注意的是,开发机和目标机端的串口配置必须一致,否则无法正确的进行数据接收。循环执行如下步骤 ●步骤1A——首先一个字符一个字符的读取串口,当读到“0x02”字符时确认此时后面的数据有可能为有效的数据包,否则重新读取一个字符。随后连续读取三个字符“OSL”,确认为有效数据包;然后再连续读取三个字符,如果是“MEM”则确认为内存信息数据包,如果是“CPU”则确认为CPU利用率数据包; ●步骤1B——将提取出来的内存信息和CPU利用率数据存放入结构体TRACEPKG中,向Windows发送WM_GETTRACEDATA消息,该消息中夹带了TRACEPKG数据。
步骤2——处理Windows消息,将性能信息存入缓冲区中,然后采用缓冲区数据动态绘图,见如下实现代码   BEGIN_MESSAGE_MAP(COslatView,CView)  //{{AFX_MSG_MAP(COslatView)  ON_WM_LBUTTONDOWN()  ON_WM_RBUTTONDOWN()  //}}AFX_MSG_MAP  ON_MESSAGE(WM_GETTRACEDATA,OnGetTraceData)END_MESSAGE_MAP()  LRESULT CTraceView::OnGetTraceData(WPARAM wParam,LPARAM lParam)  {  pTRACEPKG lpPkg=(pTRACEPKG)lParam;  m_CurReadData=lpPkg;  m_bTraceStop=FALSE;  TRACEPKG*pTmpPkg=new TRACEPKG;  memcpy(pTmpPkg,(void*)lpPkg,sizeof(TRACEPKG));  //将TRACEPKG数据存入m_myList缓冲区尾  m_myList.AddTail(pTmpPkg);  int iTotalListCount=(m_CPURect.right-m_CPURect.left)/m_iLengthPerDraw;  //如果缓冲区操作一定的大小则从缓冲区头部删除一个数据  if(m_myList.GetCount()>iTotalListCount+1){  delete m_myList.GetHead();  m_myList.RemoveHead();  }  CDC*pDC=GetDC();  //绘制图形背景  DrawMapBk(pDC);  //绘制性能曲线  DrawTrace(pDC);  ReleaseDC(pDC);  return 0;  } 实现一个CTraceView类专门用于处理数据缓冲区和动态绘图。“ON_MESSAGE(WM_GETTRACEDATA,OnGetTraceData)”中的WM_GETTRACEDATA即为步骤1B中Windows发送的消息,OnGetTraceData为CTraceView实现的一个用于处理数据缓冲区和动态绘图的方法,每次消息发送数据包TRACEPKG时就调用该方法进行一次处理。具体处理步骤如下 ●步骤2A——接收到TRACEPKG数据包,将其放入缓冲区m_myList链表尾中,如果缓冲区超过了一定大小,则删除链表头; ●步骤2B——调用DrawMapBk依据窗口大小绘制背景。主要是绘制了背景颜色和网格,输出一些文本信息表明内存和CPU使用,以及内存曲线Y轴刻度(将总的内存量等分成十份作为刻度)和CPU利用率曲线Y轴刻度(将100等分成十份作为刻度)。
●步骤2C——调用DrawTrace依据背景和刻度大小绘制曲线。下一次数据显示时将各个数据横坐标增加一定数值,这样连续显示曲线和背景时可以看出曲线随时间横向动态移动。见如下实现代码   void COslatView::DrawTrace(CDC*pDC)  {<!-- SIPO <DP n="11"> --><dp n="d11"/>  int iReadData=0;  int ListNum=m_myList.GetCount();  int iCpuTempY1,iCpuTempY2;  float iMem Temp;  int iMemTempY1,iMemTempY2;  //创建画笔对象  CPen*pPenGreen=new CPen;  pPenGreen->CreatePen(PS_SOLID,1,RGB(0,255,0));  //选中绿色画笔,并保存以前的画笔  CGdiObject*pOldPen=pDC->SelectObject(pPenGreen);  for(int i=ListNum;i>0;i--){  if(i==ListNum)continue;  m_readData=m_myList.GetAt(m_myList.FindIndex(ListNum-i-1));  iMemTemp=((float)m_readData->AvailMem*100/(float)m_readData->TotalMem);  iMemTempY1=(int)((float)(m_MemRect.bottom-m_MemRect.top)\  *iMemTemp/100)+m_MemRect.top;  iCpuTempY1=(int)((float)(m_CPURect.bottom-m_CPURect.top)\  *(1000-m_readData->CPUPercentage)/1000)+m_CPURect.top;  if(iCpuTempY1<m_CPURect.top)  iCpuTempY1+=m_CPURect.top;  m_readData=m_myList.GetAt(m_myList.FindIndex(ListNum-i));  iMemTemp=((float)m_readData->AvailMem*100/(float)m_readData->TotalMem);  iMemTempY2=(int)((float)(m_MemRect.bottom-m_MemRect.top)*iMemTemp\  /100)+m_MemRect.top;  iCpuTempY2=(int)((float)(m_CPURect.bottom-m_CPURect.top)\  *(1000-m_readData->CPUPercentage)/1000)+m_CPURect.top;  if(iCpuTempY2<m_CPURect.top){  iCpuTempY2+=m_CPURect.top;  }  pDC->MoveTo(m_CPURect.right-i*m_iLengthPerDraw,iCpuTempY1);  pDC->LineTo(m_CPURect.right-(i-1)*m_iLengthPerDraw,iCpuTempY2);  pDC->MoveTo(m_MemRect.right-i*m_iLengthPerDraw,iMemTempY1);  pDC->LineTo(m_MemRect.right-(i-1)*m_iLengthPerDraw,iMemTempY2);  }  //恢复以前的画笔  pDC->SelectObject(pOldPen);  delete pPenGreen;  } 采用了上述的对嵌入式操作系统的性能信息进行实时监测的方法,由于在宿主目标机系统中创建了一个最高优先级线程定时采集并发送性能数据,最高优先级确保该线程在执行操作时不被其它线程打断,保证数据包的完整性以及发送的定时可靠性,而且该线程不再进行其它任何操作,从而能够将监测程序本身对性能的影响降到最低,使得测试结果更接近实际性能本身,并且目标机在监测性能的同时可以运行一些程序,通过这些程序对系统在程序执行时的内存使用量和CPU利用率信息进行更好的察看;同时,采用特定数据包格式发送数据,避免其它数据对性能数据的干扰造成数据传输的错误;不仅如此,由于开发计算机接收并解析数据包,使用曲线图形的方式动态显示性能数据,让性能数据的表达更加直观和形象;而且该方法的检测结果准确可靠,系统运行性能稳定,适用范围较为广泛,使得系统开发人员能够方便直观的对系统性能进行监测,提高了监测效率和效果,从而能够快速的改善嵌入式操作系统的性能,为嵌入式操作系统的进一步发展和新的应用的开发奠定了坚实的基础。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
权利要求
1、一种对嵌入式操作系统的性能信息进行实时监测的方法,包括嵌入式操作系统宿主目标机和开发计算机,所述的目标机和开发计算机上均具有通信接口设备,所述的目标机的通信接口设备通过通信数据线和开发计算机的通信接口设备相连接,其特征在于,所述的方法包括以下步骤
(1)目标机系统和开发计算机系统分别进行初始化操作;
(2)目标机系统创建系统性能信息监控线程,并对该线程设置最高优先级;
(3)所述的系统性能信息监控线程周期性的经过系统预设的一时间间隔的睡眠后,进行系统性能信息采集和传送至通信接口设备的处理操作;
(4)开发计算机系统通过通信接口设备进行接收所述的系统性能信息的处理操作;
(5)如果接收成功,则将该系统性能信息存入数据缓冲区中;
(6)开发计算机系统获取数据缓冲区中的系统性能信息数据,并进行系统性能信息的图形化显示操作。
2、根据权利要求1所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的通信接口设备为串行通信接口设备,所述的通信数据线为串行通信数据线。
3、根据权利要求2所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的系统性能信息采集和传送至通信接口设备的处理操作包括以下步骤
(1)该系统性能信息监控线程获取当前系统内存使用量和CPU利用率信息;
(2)将上述的性能信息按照预设的数据包格式进行封装;
(3)将封装好的数据包写入目标机的串行通信接口设备中;
(4)目标机的串行通信接口设备通过串行通信数据线将该数据包传送至开发计算机的串行通信接口设备。
4、根据权利要求3所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的CPU利用率信息的获取包括以下步骤
(1)在第一时刻获取系统自启动以来经过的时间ExcTime1和系统自启动以来空闲线程Idle所执行的时间IdleTime1;
(2)经过一段时间后,在第二时刻获取系统自启动以来经过的时间ExcTime2和系统自启动以来空闲线程Idle所执行的时间IdleTime2;
(3)根据以下公式计算出得到该段时间长度t1以及该段时间内Idle线程执行的时间t2
t1=ExcTime2-ExcTime1,t2=IdleTime2-IdleTime1;
(4)使用以下公式计算出CPU利用率信息
CPU利用率=(t1-t2)/t1。
5、根据权利要求3所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的预设的数据包格式包括数据包头、数据包体和校验数据,其中数据包体为性能信息数据。
6、根据权利要求5所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的接收所述的系统性能信息的处理操作包括以下步骤
(1)读取串行通信接口设备中的数据包;
(2)当获取到数据包头后,对后面的数据进一步读取;
(3)当获取到数据包体后,对后面的数据进一步读取;
(4)获取到校验数据后进行校验,如果校验正确,则返回接收成功的结果,否则丢弃这个数据包并返回接收失败的结果。
7、根据权利要求3至6中任一项所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的将系统性能信息存入数据缓冲区包括以下步骤
(1)将该系统性能信息数据存入数据缓冲区的尾部;
(2)判断该数据缓冲区是否超过了系统预设的长度;
(3)如果是,则删除数据缓冲区头部的系统性能信息数据。
8、根据权利要求7所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的系统性能信息的图形化显示操作包括以下步骤
(1)系统依据窗口大小绘制背景颜色和直角坐标系网格;
(2)输出当前内存使用量和CPU利用率的文本信息;
(3)绘制内存使用量曲线纵轴刻度,其中该刻度为将总的内存量等分成十份的刻度;
(4)绘制CPU利用率曲线纵轴刻度,其中该刻度为将100%等分成十份的刻度;
(5)读取数据缓冲区中的系统性能信息数据,将当前缓冲区中的所有内存使用量数据和所有CPU利用率数据在各自的直角坐标系中的坐标点分别使用曲线进行连接并显示出来;
(6)根据系统预设的时间间隔周期性的刷新缓冲区数据,并将各个数据坐标点的横坐标增加一定数值,显示出曲线随时间横向动态移动的效果。
9、根据权利要求8所述的对嵌入式操作系统的性能信息进行实时监测的方法,其特征在于,所述的系统预设的时间间隔为1秒钟。
全文摘要
本发明涉及一种该对嵌入式操作系统的性能信息进行实时监测的方法,包括目标机系统和开发计算机系统分别进行初始化操作、创建系统性能信息监控线程并设置最高优先级、监控线程周期性进行系统性能信息采集和传送至通信接口设备的处理操作、开发计算机系统通过通信接口设备进行接收所述的系统性能信息的处理操作、将该系统性能信息存入数据缓冲区中、获取数据缓冲区中的系统性能信息数据并进行系统性能信息的图形化显示操作。采用该种对嵌入式操作系统的性能信息进行实时监测的方法,表达更加直观和形象,检测结果准确可靠,系统运行性能稳定,适用范围较广,监测方便直观,提高了监测效率和效果,为嵌入式操作系统的进一步发展奠定了坚实基础。
文档编号G06F11/34GK1904850SQ20061002975
公开日2007年1月31日 申请日期2006年8月4日 优先权日2006年8月4日
发明者雷光亮, 付强 申请人:上海科泰世纪科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1