Timing.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:5k
源码类别:

DVD

开发平台:

Others

  1. /* **************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: Timing.c $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * core timing services
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 8 $
  14.  * Last Modified by $Author: Nirm $ at $Modtime: 1/05/02 9:28 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I49/H49V/Playcore/Timing/Timing.c $
  19.  * 
  20.  * 8     7/05/02 15:59 Nirm
  21.  * Code cleanup.
  22.  * 
  23.  * 7     23/04/02 9:36 Nirm
  24.  * - Added dependency in "Config.h".
  25.  * 
  26.  * 6     18/02/02 11:01 Atai
  27.  * make global to static
  28.  * 
  29.  * 5     16/01/02 16:00 Atai
  30.  * Change debug printing
  31.  * 
  32.  * 4     13/01/02 16:34 Atai
  33.  * Remove old Defines
  34.  * 
  35.  * 3     9/01/02 16:55 Nirm
  36.  * Corrected Include-Paths.
  37.  * 
  38.  * 2     30/12/01 13:13 Atai
  39.  * Remove unnecessary variable
  40.  **************************************************************************************** */
  41. #include "Config.h" // Global Configuration - do not remove!
  42. #ifdef _DEBUG
  43. #undef IFTRACE
  44. #define IFTRACE if (gTraceCore) 
  45. #include "DebugDbgMain.h"
  46. #endif
  47. #include <stdio.h>
  48. #include "Includesysdefs.h"
  49. #include "CPUtimefunc.h"
  50. #include "PlaycoreTimingtiming.h"
  51. #define MAX_DOUBLE_WORD 0xFFFFFFFFL
  52. #ifdef EVENT_LOG_ENABLED
  53. typedef struct Time_Field 
  54. {
  55. char *str;
  56. unsigned long TimeRecord;
  57. } Time_Field;
  58. #define MAX_TIME_RECORDS  1 /* don't use any memory now */
  59. Time_Field TimeRecordAr[MAX_TIME_RECORDS];
  60. unsigned Record_idx = 0;
  61. static unsigned Total_Records = 0;
  62. static unsigned wrap_around = 0;
  63. void timing_init(void)
  64. {
  65. // Initialize local vairables
  66. timing_reset();
  67. gen_timer(); // Start the timer and interrupt services.
  68. }
  69. void timing_reset( void )
  70. {
  71.   // Resets the Timing Module array & vars
  72.   Record_idx = 0;
  73.   Total_Records = 0;
  74.   wrap_around = 0;
  75. }
  76. void timing_record( char *str )
  77. {
  78.   // Records the current timerX reading in a cyclic readings array
  79.   // Records the time + the ID to enable tarceing
  80.   TimeRecordAr[ Record_idx ].str = str;
  81.   TimeRecordAr[ Record_idx ].TimeRecord = gen_timer();
  82.   Record_idx++;
  83.   if (wrap_around == 0)
  84.   {
  85. Total_Records++;
  86.   }
  87.   if (Record_idx == MAX_TIME_RECORDS) 
  88.   {
  89.   Record_idx = 0; // Cyclic buffer
  90.   wrap_around = 1;
  91.   }
  92. }
  93. void timing_print(void)
  94. {
  95. // Prints the timing array in mSec resolution and resets the array
  96. unsigned i, j;
  97. unsigned long last;
  98. dbg_printf((" ***************** TIMING RECORDS ******************** n"));
  99. if (wrap_around) 
  100. {
  101. j = Record_idx;
  102. }
  103. else
  104. {
  105. j = 0;
  106. }
  107.  
  108. last = TimeRecordAr [j].TimeRecord;
  109. for (i=0; (i < Total_Records) ; i++) 
  110. {
  111. dbg_printf(("#%02d: time=%08lx[us] , delta=%08lu[us], '%s'n",
  112. j,
  113. TimeRecordAr[j].TimeRecord,
  114. TimeRecordAr[j].TimeRecord - last,
  115. TimeRecordAr[j].str));
  116. last = TimeRecordAr [j].TimeRecord;
  117.  j++;
  118. if (j == MAX_TIME_RECORDS) 
  119. {
  120. j = 0; // Cyclic buffer
  121. }
  122. }
  123. dbg_printf((" **************** TIMING RECORDS END ***************** n"));
  124. }
  125. #endif // EVENT_LOG_ENABLED
  126. /////////////////////////////////////////////////////////////////////////////
  127. // Function name : delay_us
  128. // Purpose : 
  129. // Input Parameters : 
  130. // Return type : none.
  131. // Output Parameters: none.
  132. /////////////////////////////////////////////////////////////////////////////
  133. void delay_us(ULONG period_us)
  134. {
  135. volatile ULONG count1, count2, diff;
  136. count1 = gen_timer();
  137. diff = 0;
  138. while (diff < period_us) {
  139. count2 = gen_timer();
  140. if ( count2 < count1 ) 
  141. diff = ((MAX_DOUBLE_WORD - count1) + count2 + 1);
  142. else
  143. diff = (count2 - count1);
  144. }
  145. }
  146. /////////////////////////////////////////////////////////////////////////////
  147. // Function name : timing_get_clock
  148. // Purpose : Get a time stamp (in micro seconds).
  149. // Input Parameters : The time stamp.
  150. // Return type : none.
  151. // Output Parameters: none.
  152. /////////////////////////////////////////////////////////////////////////////
  153. ULONG timing_get_clock(void) 
  154. {
  155. return gen_timer();
  156. }
  157. /////////////////////////////////////////////////////////////////////////////
  158. // Function name : timing_get_diff
  159. // Purpose : Calculate the difference between 2 time stamps.
  160. // Input Parameters : start - The start timestamp.
  161. //   end - the end timestamp.
  162. // Return type : the difference between the timestamps.
  163. // Output Parameters: none.
  164. /////////////////////////////////////////////////////////////////////////////
  165. ULONG timing_get_diff(ULONG start, ULONG end)
  166. {
  167. if (end < start) 
  168. {
  169. return (MAX_DOUBLE_WORD - start) + end + 1;
  170. }
  171. else
  172. {
  173. return end - start;
  174. }
  175. }
  176. /////////////////////////////////////////////////////////////////////////////
  177. // Function name : timing_is_timeout
  178. // Purpose : 
  179. // Input Parameters :
  180. // Return type : 
  181. // Output Parameters: none.
  182. /////////////////////////////////////////////////////////////////////////////
  183. BOOL timing_is_timeout(ULONG start_time, ULONG timeout)
  184. {
  185. ULONG cur_time = gen_timer();
  186. return (timing_get_diff(start_time, cur_time) >= timeout) ? TRUE : FALSE;
  187. }