This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

CPU load package


I've turned the CPU load measurement code i mailed to ecos-discuss February 
2000 into a package.

     Andrew

diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/doc/ChangeLog ./doc/ChangeLog
--- ../ecos-clean/ecos/doc/ChangeLog	Fri Aug  9 12:28:26 2002
+++ ./doc/ChangeLog	Thu Aug 15 19:14:56 2002
@@ -1,3 +1,7 @@
+2002-08-15  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* sgml/doclist: Added the CPU load package documentation.
+
 2002-08-09  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* sgml/doclist: Added the CRC package documentation.
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/doc/sgml/doclist ./doc/sgml/doclist
--- ../ecos-clean/ecos/doc/sgml/doclist	Fri Aug  9 12:28:26 2002
+++ ./doc/sgml/doclist	Thu Aug 15 17:42:12 2002
@@ -19,4 +19,5 @@
 net/snmp/agent/current/doc/snmp.sgml
 net/ns/dns/current/doc/dns.sgml
 net/ftpclient/current/doc/ftpclient.sgml
-services/crc/current/doc/crc.sgml
\ No newline at end of file
+services/crc/current/doc/crc.sgml
+services/cpuload/current/doc/cpuload.sgml
\ No newline at end of file
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/ChangeLog ./packages/ChangeLog
--- ../ecos-clean/ecos/packages/ChangeLog	Wed Aug 14 21:01:02 2002
+++ ./packages/ChangeLog	Thu Aug 15 19:17:46 2002
@@ -1,3 +1,7 @@
+2002-08-15  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* ecos.db: Added the CPU load measurement package.
+
 2002-08-14  Yoshinori Sato  <qzb04471@nifty.ne.jp>
 
 	* ecos.db: Add H8/300H watchdog driver package.
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/ecos.db ./packages/ecos.db
--- ../ecos-clean/ecos/packages/ecos.db	Wed Aug 14 21:01:02 2002
+++ ./packages/ecos.db	Thu Aug 15 19:15:55 2002
@@ -1535,6 +1535,16 @@
 POSIX 1003 defined CRC algorithm."
 }  
 
+package CYGPKG_CPULOAD {
+        alias           { "cpuload support" cpuload }
+        directory       services/cpuload
+        script          cpuload.cdl
+        description "
+This package measures the CPU load over the last 100ms, 1second 
+and 10 second. All loads are returned as a percentage, ie 0-100.
+This is only a rough measure."
+}     
+                                   
 package CYGPKG_UITRON {
 	alias		{ "uITRON compatibility" uitron }
 	directory	compat/uitron
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/ChangeLog ./packages/services/cpuload/current/ChangeLog
--- ../ecos-clean/ecos/packages/services/cpuload/current/ChangeLog	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/ChangeLog	Thu Aug 15 19:13:03 2002
@@ -0,0 +1,40 @@
+2002-08-15  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* Created a new package with my CPU load measurement code which
+	  has been sitting in the ecos-discuss archive for 2 and a bit
+	  years.
+
+//===========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2002 Andrew Lunn
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/cdl/cpuload.cdl ./packages/services/cpuload/current/cdl/cpuload.cdl
--- ../ecos-clean/ecos/packages/services/cpuload/current/cdl/cpuload.cdl	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/cdl/cpuload.cdl	Thu Aug 15 18:46:36 2002
@@ -0,0 +1,71 @@
+# ====================================================================
+#
+#      cpuload.cdl
+#
+#      cpu load measurements
+#
+# ====================================================================
+#####ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 2002 Andrew Lunn
+##
+## eCos is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free
+## Software Foundation; either version 2 or (at your option) any later version.
+##
+## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+## WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+## for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+##
+## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+## at http://sources.redhat.com/ecos/ecos-license/
+## -------------------------------------------
+#####ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s):      Andrew Lunn
+# Original data:  Andrew Lunn
+# Contributors:
+# Date:           2002-08-12
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+
+cdl_package CYGPKG_CPULOAD {
+    display       "Measure the current CPU load"
+    requires      CYGPKG_KERNEL
+    include_dir   cyg/cpuload
+    
+    compile cpuload.cxx
+    description "
+       This package measures the CPU load over the last 100ms, 1second 
+       and 10 second. All loads are returned as a percentage, ie 0-100.
+       This is only a rough measure. Any clever power management, sleep 
+       modes etc, will cause these results to be wrong."
+
+    cdl_option CYGPKG_CPULOAD_TESTS {
+        display "POSIX CRC tests"
+        flavor  data   
+        no_define      
+        calculated { "tests/cpuload.c" }
+    }
+}
+
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/doc/cpuload.sgml ./packages/services/cpuload/current/doc/cpuload.sgml
--- ../ecos-clean/ecos/packages/services/cpuload/current/doc/cpuload.sgml	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/doc/cpuload.sgml	Thu Aug 15 18:42:35 2002
@@ -0,0 +1,149 @@
+<PART ID="services-cpuload">
+<TITLE>CPU load measurements</TITLE>
+<PARTINTRO>
+<PARA>
+The cpuload package provides a way to estimate the cpuload. It gives
+an estimated percentage load for the last 100 milliseconds, 1 second
+and 10 seconds.
+</PARA>
+</PARTINTRO>
+<CHAPTER id="cpuload-functions">
+<TITLE>CPU Load Measurements</TITLE>
+<SECT1 id="services-cpuload-api">
+<TITLE>CPU Load API</TITLE>
+<para>
+The package allows the CPU load to be estimated. The measurement code
+must first be calibrated to the target it is running on. Once this
+has been performed the measurement process can be started. This is a
+continuous process, so always providing the most up to data
+measurements. The process can be stopped at any time if required. Once
+the process is active, the results can be retrieved.
+</para>
+<para>
+Note that if the target/processor performs any power saving actions,
+such as reducing the clock speed, or halting until the next interrupt
+etc, these will interfere with the CPU load measurement. Under these
+conditions the measurement results are undefined. The synthetic target
+is one such system. See the implementation details at the foot of this
+page for further information.  </para>
+<para>
+Multi-processor systems will also result in strange results. The load for the first processor will be measured.
+</para> 
+<para> The API for load measuring functions can be
+found in the file <filename>cyg/cpuload/cpuload.h</filename>.
+</para>
+<sect2 id="services-cpuload-api-cyg-cpuload-calibrate">
+<title>cyg_cpuload_calibrate</title>
+<para>
+This function is used to calibrate the cpu load measurement code. It
+makes a measurement to determine the CPU properties while idle.
+</para>
+<programlisting>
+void cyg_cpuload_calibrate(cyg_uint32  *calibration);
+</programlisting>
+<para>
+The function returns the calibration value at the location pointed to
+by <parameter>calibration</parameter>.
+</para>
+<para>
+This function is quite unusual. For it to work correctly a few
+conditions must be met. The function makes use of the two highest
+thread priorities. No other threads must be using these priorities
+while the function is being used. The kernel scheduler must be started
+and not disabled. The function takes 100ms to complete during which
+time no other threads will be run.
+<para>
+</sect2>
+<sect2 id="services-cpuload-api-cyg-cpuload-create">
+<title>cyg_cpuload_create</title>
+<para>
+This function starts the CPU load measurments.
+</para>
+<programlisting>
+void cyg_cpuload_create(cyg_cpuload_t *cpuload, 
+                        cyg_uint32 calibrate,
+                        cyg_handle_t *handle);
+</programlisting>
+<para>
+The measurement process is started and a handle to it is returned in
+<parameter>*handle</parameter>. This handle is used to access the
+results and the stop the measurement process. </para>
+</sect2>
+
+<sect2 id="services-cpuload-api-cyg-cpuload-delete">
+<title>cyg_cpuload_delete</title>
+<para>
+This function stops the measurement process. 
+</para>
+<programlisting>
+void cyg_cpuload_delete(cyg_handle_t handle);
+</programlisting>
+<para>
+<parameter>handle</parameter> should be the value returned by the create function.</para>
+</sect2>
+
+<sect2 id="services-cpuload-api-cyg-cpuload-get">
+<title>cyg_cpuload_get</title>
+<para>
+This function returns the latest measurements.
+</para>
+<programlisting>
+void cyg_cpuload_get(cyg_handle_t handle,
+		 cyg_uint32 *average_point1s, 	    
+		 cyg_uint32 *average_1s, 	    
+		 cyg_uint32 *average_10s);
+</programlisting>
+<para>
+<parameter>handle</parameter> should be the value returned by the
+create function. The load measurements for the last 100ms, 1s and 10s
+are returned in
+<parameter>*average_point1s</parameter>,<parameter>*average_1s</parameter>
+and <parameter>*average_10s</parameter> respectively.
+</para>
+</sect2>
+<sect2 id="services-cpuload-api-implementation">
+<title>Implementation details</title>
+<para>
+This section gives a few details of how the measurements are
+made. This should help to understand what the results mean.
+</para>
+<para>
+When there are no other threads runnable, eCos will execute the idle
+thread. This thread is always runnable and uses the lowest thread
+priority. The idle thread does little. It is an endless loop which
+increments the variable, <literal>idle_thread_loops</literal> and
+executes the macro <literal>HAL_IDLE_THREAD_ACTION</literal>. The cpu
+load measurement code makes use of the variable. It periodically
+examines the value of the variable and sees how much it has
+changed. The idler the system, the more it will have incremented. From
+this it is simple to determine the load of the system.
+</para>
+<para>
+The function <literal>cyg_cpuload_calibrate</literal> executes the
+idle thread for 100ms to determine how much
+<literal>idle_thread_loops</literal> is incremented on a system idle
+for 100ms. <literal>cyg_cpuload_create</literal> starts an alarm which
+every 100ms calls an alarm function. This function looks at the
+difference in <literal>idle_thread_loops</literal> since the last
+invocation of the alarm function and so calculated how idle or busy
+the system has been. The structure <literal>cyg_cpuload</literal> is
+updated during the alarm functions with the new results.  The 100ms
+result is simply the result from the last measurement period. A simple
+filter is used to average the load over a period of time, namely 1s
+and 10s. Due to rounding errors, the 1s and 10s value will probably
+never reach 100% on a fully loaded system, but 99% is often seen.
+</para>
+<para>
+As stated above, clever power management code will interfere with
+these measurements. The basic assumption is that the idle thread will
+be executed un-hindered and under the same conditions as when the
+calibration function was executed. If the CPU clock rate is reduced,
+the idle thread counter will be incremented less and so the CPU load
+measurements will give values too high. If the CPU is halted entirely,
+100% cpu load will be measured.
+<para>
+</sect2>
+</SECT1>
+</CHAPTER>
+</PART>
+
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/include/cpuload.h ./packages/services/cpuload/current/include/cpuload.h
--- ../ecos-clean/ecos/packages/services/cpuload/current/include/cpuload.h	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/include/cpuload.h	Thu Aug 15 18:52:47 2002
@@ -0,0 +1,94 @@
+//==========================================================================
+//
+//      cpuload.h
+//
+//      Interface for the cpuload code.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2002 Andrew Lunn
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    Andrew Lunn
+// Contributors: Andrew Lunn
+// Date:         2002-08-12
+// Purpose:      
+// Description:  
+//      API for the cpuload measurement code
+//        
+// This code is part of eCos (tm).
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#ifndef _SERVICES_CPULOAD_CPULOAD_H
+#define _SERVICES_CPULOAD_CPULOAD_H
+
+#ifdef __cplusplus
+externC 
+{
+#endif  
+
+typedef struct cyg_cpuload_s {
+  cyg_alarm alarm_s;
+  cyg_handle_t alarmH;
+  cyg_uint32 last_idle_loops;
+  cyg_uint32 average_point1s;
+  cyg_uint32 average_1s;
+  cyg_uint32 average_10s;
+  cyg_uint32 calibration;
+} cyg_cpuload_t;
+
+/* Calibrate the CPU load measurement code */
+void cyg_cpuload_calibrate(cyg_uint32  *calibration);
+
+/* Create a measurement object and start the measurements */
+void cyg_cpuload_create(cyg_cpuload_t *cpuload, 
+                        cyg_uint32 calibrate,
+                        cyg_handle_t *handle);
+
+/* Stop the measurements so the object can be freed */
+void cyg_cpuload_delete(cyg_handle_t handle);
+
+/* Get the current CPU load */
+void cyg_cpuload_get(cyg_handle_t handle,
+		 cyg_uint32 *average_point1s, 	    
+		 cyg_uint32 *average_1s, 	    
+		 cyg_uint32 *average_10s);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _SERVICES_CPULOAD_CPULOAD_H */
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/src/cpuload.cxx ./packages/services/cpuload/current/src/cpuload.cxx
--- ../ecos-clean/ecos/packages/services/cpuload/current/src/cpuload.cxx	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/src/cpuload.cxx	Thu Aug 15 20:00:42 2002
@@ -0,0 +1,206 @@
+//==========================================================================
+//
+//      cpuload.cxx
+//
+//      Estimate the current CPU load.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2002 Gary Thomas
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    Andrew Lunn
+// Contributors: Andrew Lunn
+// Date:         2002-08-12
+// Purpose:      
+// Description:  
+//    This provides a simple CPU load meter. All loads are returned
+//    as a percentage, ie 0-100. This is only a rough measure. Any clever
+//    power management, sleep modes etc, will cause these results to be
+//    wrong.
+//              
+// This code is part of eCos (tm).
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <cyg/kernel/kapi.h>
+#include <cyg/hal/hal_arch.h> 
+#include <cyg/cpuload/cpuload.h>
+
+/* Here we run the idle thread as a high priority thread for 0.1
+   second.  We see how much the counter in the idle loop is
+   incremented. This will only work if there are no other threads
+   running at priority 1 and 2 */
+
+static cyg_thread thread;
+externC cyg_uint32 idle_thread_loops;
+char idle_stack[CYGNUM_HAL_STACK_SIZE_MINIMUM];
+
+extern void idle_thread_main( CYG_ADDRESS data );
+
+// -------------------------------------------------------------------------
+/* We are playing ping-pong with the cpuload_calibrate function and
+   the idle thread. First cpuload_calibrate runs. Next the idle
+   thread, then this alarm function and then back to the
+   cpuload_calibrate function. */
+
+void static 
+alarm_func(cyg_handle_t alarm,cyg_addrword_t data) { 
+  cyg_handle_t idleH = (cyg_handle_t) data;
+  cyg_thread_suspend(idleH); 
+}
+
+
+/* Calibrate the cpuload measurements.*/
+externC void 
+cyg_cpuload_calibrate(cyg_uint32  *calibration) {
+  cyg_handle_t counter;
+  cyg_alarm alarm_s;
+  cyg_handle_t alarmH;
+  cyg_uint32 idle_loops_start;  
+  cyg_handle_t idleH;
+  cyg_priority_t old_priority;
+  
+  cyg_thread_create(1,
+		    idle_thread_main,
+		    0,
+		    "Calibration idle thread",
+		    idle_stack,
+		    sizeof(idle_stack),
+		    &idleH,
+		    &thread);
+  
+  cyg_clock_to_counter(cyg_real_time_clock(),&counter);
+  cyg_alarm_create(counter,alarm_func,(cyg_addrword_t)idleH,&alarmH,&alarm_s);
+  
+  cyg_alarm_initialize(alarmH,cyg_current_time()+10,0);
+  cyg_alarm_enable(alarmH);
+  
+  idle_loops_start = idle_thread_loops;
+  
+  /* Dont be decieved, remember this is a multithreaded system ! */
+  old_priority = cyg_thread_get_priority(cyg_thread_self());
+  cyg_thread_set_priority(cyg_thread_self(),2);
+  cyg_thread_resume(idleH);
+  cyg_thread_set_priority(cyg_thread_self(),old_priority);
+  
+  *calibration = idle_thread_loops - idle_loops_start;
+  cyg_alarm_delete(alarmH);
+  cyg_thread_kill(idleH);
+  cyg_thread_delete(idleH);
+}
+
+static void 
+cpuload_alarm_func(cyg_handle_t alarm,cyg_addrword_t data) { 
+  cyg_cpuload_t * cpuload = (cyg_cpuload_t *)data;
+  cyg_uint32 idle_loops_now = idle_thread_loops;
+  cyg_uint32 idle_loops;
+  cyg_uint32 load;
+  
+  if (idle_loops_now >= cpuload->last_idle_loops) {
+    idle_loops = idle_loops_now - cpuload->last_idle_loops;
+  } else {
+    idle_loops = ~0 - (cpuload->last_idle_loops - idle_loops_now);
+  }
+  
+  /* We need 64 bit arithmatic to prevent wrap around */ 
+  load = (cyg_uint32) (((cyg_uint64) idle_loops * (cyg_uint64)100) / 
+		       (cyg_uint64)cpuload->calibration);
+  if (load > 100) {
+    load = 100;
+  }
+  load = 100 - load;
+  
+  cpuload->average_point1s = load;
+  cpuload->average_1s = load + ((cpuload->average_1s * 90)/100);
+  cpuload->average_10s = load + ((cpuload->average_10s * 99)/100);
+  cpuload->last_idle_loops = idle_loops_now;
+}
+
+/* Create a CPU load measurements object and start the
+   measurements. */
+externC void 
+cyg_cpuload_create(cyg_cpuload_t *cpuload,
+                   cyg_uint32 calibration, 
+                   cyg_handle_t *handle) 
+{
+  cyg_handle_t counter;
+  
+  cpuload->average_point1s = 0;
+  cpuload->average_1s = 0;
+  cpuload->average_10s = 0;
+  cpuload->calibration = calibration;
+  cpuload->last_idle_loops = idle_thread_loops;
+
+  cyg_clock_to_counter(cyg_real_time_clock(),&counter);
+  cyg_alarm_create(counter,
+		   cpuload_alarm_func,
+		   (cyg_addrword_t)cpuload,
+		   &cpuload->alarmH,
+		   &cpuload->alarm_s);
+
+  cyg_alarm_initialize(cpuload->alarmH,cyg_current_time()+10,10);
+  cyg_alarm_enable(cpuload->alarmH);
+  
+  *handle = (cyg_handle_t) cpuload;
+}
+
+/* Stop measurements of the cpuload. The cyg_cpuload_t object can then
+   be freed. */
+externC void 
+cyg_cpuload_delete(cyg_handle_t handle) {
+  cyg_cpuload_t * cpuload = (cyg_cpuload_t *) handle;
+  
+  cyg_alarm_delete(cpuload->alarmH);
+}  
+
+/* Return the cpuload for the last 100ms, 1seconds and 10 second */
+externC void
+cyg_cpuload_get(cyg_handle_t handle,
+                cyg_uint32 *average_point1s, 	    
+                cyg_uint32 *average_1s, 	    
+                cyg_uint32 *average_10s) {
+
+  cyg_cpuload_t * cpuload = (cyg_cpuload_t *) handle;
+  *average_point1s = cpuload->average_point1s;
+  *average_1s = cpuload->average_1s/10;
+  *average_10s = cpuload->average_10s/100;
+}
+
+
+
+
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/services/cpuload/current/tests/cpuload.c ./packages/services/cpuload/current/tests/cpuload.c
--- ../ecos-clean/ecos/packages/services/cpuload/current/tests/cpuload.c	Thu Jan  1 01:00:00 1970
+++ ./packages/services/cpuload/current/tests/cpuload.c	Thu Aug 15 20:03:10 2002
@@ -0,0 +1,132 @@
+//=================================================================
+//
+//        cpuload.c
+//
+//        test case for the cpuload code.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2002 Andrew Lunn
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license/
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     asl
+// Contributors:  asl
+// Date:          2002-08-06
+// Description:   Tests the calculation code
+//####DESCRIPTIONEND####
+
+#include <cyg/hal/hal_arch.h>
+#include <cyg/kernel/kapi.h>
+#include <cyg/infra/testcase.h>
+#include <cyg/infra/diag.h>
+#include <cyg/cpuload/cpuload.h>
+
+void
+do_test(cyg_addrword_t data) {
+  cyg_uint32 calibration;
+  cyg_cpuload_t cpuload;
+  cyg_handle_t handle;
+  cyg_uint32 average_point1s;
+  cyg_uint32 average_1s;
+  cyg_uint32 average_10s;
+  cyg_uint32 i,j;
+  
+  CYG_TEST_INFO("About to calibrate cpuload");
+  
+  cyg_cpuload_calibrate(&calibration);
+  
+  CYG_TEST_INFO("Performing 100% load test");
+  
+  cyg_cpuload_create(&cpuload,calibration,&handle);
+  
+  /* Busy loop doing useless work. This will cause the cpu load to be
+     100%. After all these iterations, check the measured load really
+     is 100%. */
+
+  for (i=250; i--; ) {
+    for (j=calibration*10; j-- ; ) 
+      ;
+    cyg_cpuload_get(handle,&average_point1s,&average_1s,&average_10s);
+    /* diag_printf("%d %d %d\n",average_point1s,average_1s,average_10s);*/
+  }
+
+  /* Rounding errors mean it will probably never reach 100% */
+  if ((average_point1s == 100) &&
+      (average_1s >= 99) && (average_1s <=100) &&
+      (average_10s >= 98) && (average_10s <= 100))
+    CYG_TEST_PASS("100% load o.k.");
+  else {
+    CYG_TEST_FAIL("100% load");
+  }
+  
+  /* Sleeping doing nothing. This will cause the cpuload to be
+     0%. After all these iterations, check the measured load really is
+     0%. */
+  CYG_TEST_INFO("Performing 0% load test");
+  for (i=350; i-- ; ) {
+    cyg_thread_delay(10);
+    cyg_cpuload_get(handle,&average_point1s,&average_1s,&average_10s);
+    /* diag_printf("%d %d %d\n",average_point1s,average_1s,average_10s);*/
+  }
+  
+  if ((average_point1s == 0) &&
+      (average_1s == 0) &&
+      (average_10s >= 0) && (average_10s <= 2))
+    CYG_TEST_PASS_FINISH("0% load o.k.");
+  else {
+    CYG_TEST_FAIL_FINISH("0% load");
+  }
+}
+
+
+externC void
+cyg_start(void) {
+
+#ifdef CYGPKG_HAL_SYNTH
+
+  CYG_TEST_NA("Not applicable to Synth target");
+#else
+  static char stack[CYGNUM_HAL_STACK_SIZE_MINIMUM];
+  static cyg_handle_t handle;
+  static cyg_thread thread;
+  
+  CYG_TEST_INIT();
+  
+  cyg_thread_create(4,do_test,0,"cpuload",
+                    stack,sizeof(stack),&handle,&thread);
+  cyg_thread_resume(handle);
+  
+  cyg_scheduler_start();
+#endif
+}
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/templates/all/ChangeLog ./packages/templates/all/ChangeLog
--- ../ecos-clean/ecos/packages/templates/all/ChangeLog	Mon Aug 12 09:55:38 2002
+++ ./packages/templates/all/ChangeLog	Thu Aug 15 12:20:52 2002
@@ -1,3 +1,7 @@
+2002-08-15  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* current.ect: Added the cpuload package.
+
 2002-08-09  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* current.ect: Added CYGPKG_CRC
diff -u -N -r -x CVS -x tools ../ecos-clean/ecos/packages/templates/all/current.ect ./packages/templates/all/current.ect
--- ../ecos-clean/ecos/packages/templates/all/current.ect	Mon Aug 12 09:55:38 2002
+++ ./packages/templates/all/current.ect	Thu Aug 15 12:19:40 2002
@@ -37,6 +37,7 @@
     package     CYGPKG_NS_DNS current ;
     package     CYGPKG_IO_ETH_DRIVERS current ;
     package     CYGPKG_CRC current ;
+    package     CYGPKG_CPULOAD current ;
 };
 
 cdl_option CYGBLD_ISO_CTYPE_HEADER {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]