00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1993 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ CHRONO.C 00007 Nombre paquete............... - 00008 Lenguaje fuente.............. C (BC31/GCC) 00009 Estado....................... Utilizable 00010 Dependencia Hard/OS.......... SI 00011 Codigo condicional........... SI 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Comentario 00016 ------- -------- -------- ---------- 00017 1.0.1 20/03/97 Borja funcionar en unix 00018 1.0.0 17/09/92 Borja Codificacion inicial. 00019 00020 ======================== Contenido ======================== 00021 <DOC> 00022 Implementacion de un cronometro 00023 00024 La estructura chrono implementa un cronometro, con 'botones' 00025 de start/stop/reset. 00026 * start : pone en marcha el crono. 00027 * stop : detiene en crono. 00028 * reset : pone a 0 la cuenta del crono. 00029 00030 El metodo chrono_on() [devuelve] un valor distinto de cero si el 00031 crono esta en marcha. 00032 El metodo chrono_ms() [devuelve] el valor actual del crono en milisegundos, 00033 tanto si esta en marcha como si esta detenido. 00034 00035 Nota de compilacion de chrono.c: 00036 Si se define el simbolo SYNC_CHRONO, al arrancar el reloj 00037 se espera a que se produzca una transicion en el reloj del 00038 sistema. Esto hace que las medidas de tiempo sean mas 00039 precisas, pues asi se evita contabilizar por igual ciclos a 00040 medio terminar y recien comenzados. El inconveniente es 00041 que se utiliza codigo no expandible inline 00042 </DOC> 00043 =========================================================== 00044 */ 00045 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00046 /**********************************************************/ 00047 00048 #include "chrono.h" 00049 #include "arch.h" 00050 #include "tdef.h" 00051 00052 /**********************************************************/ 00053 00054 #define SYNC_CHRONO 00055 00056 /**********************************************************/ 00057 00058 #if defined(__OS_MSDOS__) || defined(__OS_WIN31__) 00059 #else 00060 #include <stdlib.h> 00061 #include <time.h> 00062 #endif 00063 00064 PRIVATE unsigned long get_system_ms( void ) 00065 { 00066 #if defined(__OS_MSDOS__) || defined(__OS_WIN31__) 00067 static unsigned long i=0; 00068 i = (*((unsigned long far *)((void _seg *)0x0000+(void near *)0x046C)))*55; 00069 return i; 00070 #else 00071 return time(NULL)*1000; 00072 #endif 00073 } 00074 00075 /**********************************************************/ 00076 /*<DOC>*/ 00077 void chrono_initialize( chrono * c ) 00078 /*</DOC>*/ 00079 { 00080 c->_on = 0; 00081 c->_ms = 0; 00082 } 00083 00084 /**********************************************************/ 00085 /*<DOC>*/ 00086 void chrono_reset( chrono * c ) 00087 /*</DOC>*/ 00088 { 00089 if (c->_on) 00090 c->_ms = get_system_ms(); 00091 else 00092 c->_ms = 0; 00093 } 00094 00095 /**********************************************************/ 00096 /*<DOC>*/ 00097 void chrono_start( chrono * c ) 00098 /*</DOC>*/ 00099 { 00100 if (!c->_on) { 00101 #ifdef SYNC_CHRONO 00102 unsigned long ot = get_system_ms(); 00103 while (ot==get_system_ms()) ; // espera una transicion 00104 #endif 00105 c->_ms = get_system_ms() - c->_ms; 00106 c->_on = 1; 00107 } 00108 } 00109 00110 /**********************************************************/ 00111 /*<DOC>*/ 00112 void chrono_stop( chrono * c ) 00113 /*</DOC>*/ 00114 { 00115 if (c->_on) { 00116 c->_ms = get_system_ms() - c->_ms; 00117 c->_on = 0; 00118 } 00119 } 00120 00121 /**********************************************************/ 00122 /*<DOC>*/ 00123 void chrono_restart( chrono * c ) 00124 /*</DOC>*/ 00125 { 00126 chrono_stop(c); 00127 chrono_reset(c); 00128 chrono_start(c); 00129 } 00130 00131 /**********************************************************/ 00132 /*<DOC>*/ 00133 void chrono_restop( chrono * c ) 00134 /*</DOC>*/ 00135 { 00136 chrono_stop(c); 00137 chrono_reset(c); 00138 } 00139 00140 /**********************************************************/ 00141 /*<DOC>*/ 00142 int chrono_on( chrono * c ) 00143 /*</DOC>*/ 00144 { 00145 return c->_on; 00146 } 00147 00148 /**********************************************************/ 00149 /*<DOC>*/ 00150 unsigned long chrono_ms( chrono * c ) 00151 /*</DOC>*/ 00152 { 00153 return ( (c->_on) ? get_system_ms() - c->_ms : c->_ms); 00154 } 00155 00156 /**********************************************************/