sw.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:2k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* These routines, plus the assembler hooks in stopwatch.asm, implement a
  2.  * general purpose "stopwatch" facility useful for timing the execution of
  3.  * code segments. The PC's "timer 2" channel (the one ordinarily
  4.  * used to drive the speaker) is used. It is driven with a 838 ns
  5.  * clock. The timer is 16 bits wide, so it "wraps around" in only 55 ms.
  6.  *
  7.  * There is an array of "stopwatch" structures used for recording the number
  8.  * of uses and the min/max times for each. Since only one hardware timer is
  9.  * available, only one stopwatch can actually be running at any one time.
  10.  *
  11.  * This facility is useful mainly for timing routines that must execute with
  12.  * interrupts disabled. An interrupt that occurs while the timer is running
  13.  * will not stop it, so it would show an errneously large value.
  14.  *
  15.  * To start a timer, call swstart(). To stop it and record its value,
  16.  * call swstop(n), where n is the number of the stopwatch structure.
  17.  * The stopwatch structures can be displayed with the "watch" command.
  18.  *
  19.  * Copyright 1991 Phil Karn, KA9Q
  20.  */
  21. #include <stdio.h>
  22. #include "global.h"
  23. #include "nospc.h"
  24. struct stopwatch Sw[NSW];
  25. /* Stop a stopwatch and record its value.
  26.  * Uses stopval() routine in stopwatch.asm
  27.  */
  28. void
  29. swstop(n)
  30. int n;
  31. {
  32. register struct stopwatch *sw;
  33. int32 ticks;
  34. ticks = 65536 - stopval();
  35. sw = &Sw[n];
  36. if(sw->calls++ == 0){
  37. sw->maxval = ticks;
  38. sw->minval = ticks;
  39. } else if(ticks > sw->maxval){
  40. sw->maxval = ticks;
  41. } else if(ticks < sw->minval){
  42. sw->minval = ticks;
  43. }
  44. sw->totval += ticks;
  45. }
  46. int
  47. doswatch(argc,argv,p)
  48. int argc;
  49. char *argv[];
  50. void *p;
  51. {
  52. register struct stopwatch *sw;
  53. long maxval,minval,avgval;
  54. int i;
  55. if(argc > 1){
  56. /* Clear timers */
  57. for(i=0,sw=Sw;i < NSW;i++,sw++){
  58. sw->calls = 0;
  59. sw->totval = 0;
  60. }
  61. }
  62. for(i=0,sw=Sw;sw < &Sw[NSW];i++,sw++){
  63. if(sw->calls == 0)
  64. continue;
  65. minval = sw->minval * 838L/1000;
  66. maxval = sw->maxval * 838L/1000;
  67. avgval = sw->totval / sw->calls * 838L / 1000L;
  68. printf("%u: calls %lu min %lu max %lu avg %lu tot %lun",
  69.  i,sw->calls,minval,maxval,avgval,sw->totval);
  70. }
  71. return 0;
  72. }