Exception.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: Exception.c $             
  6.  *
  7.  * Description: Exception mechanism.
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 4 $
  14.  * Last Modified by $Author: Nirm $ at $Modtime: 24/05/02 14:39 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I49/H49V/Playcore/Exception/Exception.c $
  19.  * 
  20.  * 4     24/05/02 16:54 Nirm
  21.  * - Alternative Critical-Section implementation, to allow usage from
  22.  * within Interrupt-context.
  23.  * 
  24.  * 3     23/04/02 9:29 Nirm
  25.  * - Added dependency in "Config.h".
  26.  * 
  27.  * 2     7/03/02 16:52 Nirm
  28.  * Integrated Exceptioning mechanism.
  29.  * 
  30.  * 1     7/03/02 9:09 Nirm
  31.  ****************************************************************************************/
  32. #include "Config.h" // Global Configuration - do not remove!
  33. #ifdef _DEBUG
  34. #undef IFTRACE
  35. #define IFTRACE if (gTraceCore)
  36. #include "DebugDbgMain.h"
  37. #endif //_DEBUG
  38. #include "KerneluITRONRTOS.h"
  39. #include "PlaycoreExceptionException.h"
  40. /////////////////////////////////////////////////////////////////////////////
  41. // Globals and Singletons
  42. struct ExceptionInfo_TAG {
  43. excThrown;
  44. excIgnored;
  45. } g_ExceptionInfo= { EXCEPTION_NONE, EXCEPTION_NONE };
  46. /////////////////////////////////////////////////////////////////////////////
  47. // Public Services
  48. /////////////////////////////////////////////////////////////////////////////
  49. // Exception_throw()
  50. //
  51. // Description: Throws an Exception.
  52. //
  53. // Input: excThrow - The Exception to throw.
  54. // Output: None
  55. // In/Out: None
  56. //
  57. // Return: None
  58. //
  59. // Remarks: None
  60. void Exception_throw(EXCEPTION excThrow)
  61. {
  62. // Begin Critical-Section
  63. STATUS_REG srValue= InterruptDisable();
  64. // Throw the Exception, unless it is being ignored
  65. g_ExceptionInfo.excThrown |= (excThrow & ~g_ExceptionInfo.excIgnored);
  66. // End Critical-Section
  67. set_SR(srValue);
  68. return;
  69. }
  70. /////////////////////////////////////////////////////////////////////////////
  71. // Exception_catch()
  72. //
  73. // Description: Catches an Exception, and clears it.
  74. //
  75. // Input: excCatch - The Exception to catch.
  76. // Output: None
  77. // In/Out: None
  78. //
  79. // Return: TRUE if an Exception was caught; FALSE otherwise.
  80. //
  81. // Remarks:
  82. // If the requested Exception was raised, then it is caught and cleared.
  83. EXCEPTION Exception_catch(EXCEPTION excCatch)
  84. {
  85. EXCEPTION excCaught;
  86. // Begin Critical-Section
  87. STATUS_REG srValue= InterruptDisable();
  88. // Test whether or not the Exception was caught
  89. excCaught= (g_ExceptionInfo.excThrown & excCatch);
  90. // Catch and clear the Exception
  91. g_ExceptionInfo.excThrown &= ~excCatch;
  92. // End Critical-Section
  93. set_SR(srValue);
  94. return excCaught;
  95. }
  96. /////////////////////////////////////////////////////////////////////////////
  97. // Exception_catchAndRethrow()
  98. //
  99. // Description: Catches an Exception, without clearing it.
  100. //
  101. // Input: excCatch - The Exception to catch.
  102. // Output: None
  103. // In/Out: None
  104. //
  105. // Return: TRUE if an Exception was caught; FALSE otherwise.
  106. //
  107. // Remarks:
  108. // If the requested Exception was raised, then it is caught but not cleared.
  109. // Hence, a raised Exception remains raised, and is effectively re-thrown.
  110. EXCEPTION Exception_catchAndRethrow(EXCEPTION excCatch)
  111. {
  112. EXCEPTION excCaught;
  113. // Begin Critical-Section
  114. STATUS_REG srValue= InterruptDisable();
  115. // Test whether or not the Exception was caught, and leave it in place
  116. excCaught= (g_ExceptionInfo.excThrown & excCatch);
  117. // End Critical-Section
  118. set_SR(srValue);
  119. return excCaught;
  120. }
  121. /////////////////////////////////////////////////////////////////////////////
  122. // Exception_ignore()
  123. //
  124. // Description: Controls whether or not a certain Exception is ignored.
  125. //
  126. // Input: excIgnore - The Exception to start/stop ignoring;
  127. // bEnaqble - Determines whether to enable or disable ignoring.
  128. // Output: None
  129. // In/Out: None
  130. //
  131. // Return: None
  132. //
  133. // Remarks:
  134. // An Exception can be inserted into the list of Ignred Exceptions, which
  135. // allows the Exception to be thrown without supplying a handler for that
  136. // Exception.
  137. // An Ignored Exception remains in that state, until it is explicitely
  138. // removed from the list of Ignored Exceptions.
  139. void Exception_ignore(EXCEPTION excIgnore, BOOL bEnable)
  140. {
  141. // Begin Critical-Section
  142. STATUS_REG srValue= InterruptDisable();
  143. // Enable or Disable the requested Exception
  144. if (bEnable)
  145. g_ExceptionInfo.excIgnored |= excIgnore;
  146. else
  147. g_ExceptionInfo.excIgnored &= ~excIgnore;
  148. // End Critical-Section
  149. set_SR(srValue);
  150. return;
  151. }