mdprof.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:3k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*++
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. Module Name:  mdprof.c
  17. Abstract:
  18.  This file implements the platform specific profiler support
  19. Functions:
  20. Notes:
  21. --*/
  22. #include <windows.h>
  23. #include <nkintr.h>
  24. #include <s2440.h>
  25. // local data
  26. volatile unsigned int ReschedCount;
  27. volatile unsigned int ReschedCountMax;
  28. BOOL bProfileEnabled=FALSE;             // platform profiler enabled flag
  29. // external data
  30. extern int (*PProfileInterrupt)(void);  // pointer to profiler ISR
  31. extern DWORD dwReschedIncrement;
  32. // external routines
  33. extern void ProfilerHit(DWORD); // exported by the kernel
  34. extern DWORD GetEPC (); // exported by the kernel
  35. extern DWORD SetSysTimerInterval(DWORD); // supplied by the OAL
  36. int ProfileInterrupt(void)
  37. {
  38. int nInt = SYSINTR_RESCHED;
  39. if (bProfileEnabled) {
  40. // every ReschedCountMax'th tick is a real reschedule
  41. ReschedCount++;
  42. ProfilerHit(GetEPC());
  43. if (ReschedCount >= ReschedCountMax) {
  44. // return SYSINTR_RESCHED and reset our tick counter
  45. ReschedCount = 0;
  46. } else {
  47. // not a reschedule interrupt
  48. nInt = SYSINTR_NOP;
  49. }
  50. }
  51. return nInt;
  52. }
  53. // When profiling is turned on, we halve the interrupt period so that
  54. // we can use one interrupt for the profile and one for the timing
  55. void OEMProfileTimerEnable(DWORD dwUSec)
  56. {
  57.     DWORD dwProfileIncrement;
  58.     // calculate the number of ticks taking place in the profiling ISR before we call the
  59.     // "real" ISR to update the millisecond count.
  60.     dwProfileIncrement = (RESCHED_INCREMENT * dwUSec) / 1000;
  61.     if(dwProfileIncrement != 0) {
  62. ReschedCountMax = RESCHED_INCREMENT / dwProfileIncrement;
  63. if(ReschedCountMax > 0) {
  64. ReschedCountMax -= 1;
  65. }
  66.     } else {
  67. dwProfileIncrement = dwReschedIncrement;
  68. ReschedCountMax = 0;
  69.     }
  70.     DEBUGMSG(TRUE, (_T("OEMProfileTimerEnable: usec %u, profinc %u, max %urn"), dwUSec, dwProfileIncrement, ReschedCountMax));
  71.     ReschedCount = 0;
  72.     dwReschedIncrement = dwProfileIncrement;
  73.     PProfileInterrupt = ProfileInterrupt;
  74.     SetSysTimerInterval(dwProfileIncrement);
  75.     bProfileEnabled = TRUE;
  76. }
  77. void OEMProfileTimerDisable(void)
  78. {
  79. bProfileEnabled=FALSE;
  80. PProfileInterrupt = NULL;
  81. dwReschedIncrement = RESCHED_INCREMENT;
  82. ReschedCountMax = 0;
  83. SetSysTimerInterval(dwReschedIncrement) ;
  84. }
  85. /* EOF mdprof.c */