WO2009146612A1 - 嵌入式c语言环境下异常处理方法及装置 - Google Patents

嵌入式c语言环境下异常处理方法及装置 Download PDF

Info

Publication number
WO2009146612A1
WO2009146612A1 PCT/CN2009/070492 CN2009070492W WO2009146612A1 WO 2009146612 A1 WO2009146612 A1 WO 2009146612A1 CN 2009070492 W CN2009070492 W CN 2009070492W WO 2009146612 A1 WO2009146612 A1 WO 2009146612A1
Authority
WO
WIPO (PCT)
Prior art keywords
exception
thread
abnormality
handler
unit
Prior art date
Application number
PCT/CN2009/070492
Other languages
English (en)
French (fr)
Inventor
余加强
郑伟
Original Assignee
华为技术有限公司
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 华为技术有限公司 filed Critical 华为技术有限公司
Publication of WO2009146612A1 publication Critical patent/WO2009146612A1/zh

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms

Definitions

  • the invention relates to an exception processing method and device in an embedded c language environment.
  • the application claims the priority of the Chinese patent application filed on June 3, 2008, the application number is 200810100060.5, and the invention name is "the abnormal processing method and device in the embedded C language environment". The entire contents of which are incorporated herein by reference.
  • the invention relates to C language technology, in particular to an exception processing technology in an embedded C language environment. Background technique
  • An exception is an anomalous situation that occurs when a hardware or software program is running.
  • the traditional exception handling method is to restart the system when an abnormality is found. Taking a program exception as an example, you can check whether the program runs abnormally by the CPU's exception recognition capability. Once the CPU finds that the program is running abnormally, it calls the exception handler and will include the exceptions including the register, the current stack, and the call stack. The information is saved and then processed in a uniform manner. g ⁇ , for the exception that occurs in the task, the task is suspended under the debug version, and the embedded system is restarted in the official version. For the exceptions that occur in the interrupt, the embedded system is restarted.
  • the embodiment of the invention provides an exception processing method, device and embedded system in an embedded C language environment, which is used to shorten the system interruption time or not to interrupt when an abnormality occurs.
  • An exception handling method in an embedded C language environment comprising: monitoring a running program code fragment that needs to be protected, and throwing the exception if the program code fragment is abnormal, the exception includes a software exception, hardware At least one of the exceptions; determining, according to the obtained exception, a corresponding exception handler, the exception being processed by the exception handler, wherein the exception handler is independent of the program code fragment.
  • An exception processing device in an embedded C language environment comprising: a monitoring unit, configured to monitor a running program code segment that needs to be protected; and an exception throwing unit, configured to find that the program code segment is abnormal in the monitoring unit After the exception is thrown, the exception includes at least one of a software exception and a hardware exception.
  • the matching unit is configured to determine, according to the obtained exception, a corresponding exception handler, where the exception handler is used to process The exception is thrown by the exception throwing unit, wherein the exception handler is independent of the program code fragment.
  • a method for exiting a thread or a process in an embedded C language environment which is applied to a scenario in which a thread actively exits, including: obtaining information that a thread or a process needs to exit; checking whether an exception thrown by a thread or a process that needs to exit still occupies resources ; if yes, release the occupied resources; exit the thread or process.
  • An apparatus for exiting a thread or a process in an embedded C language environment comprising: an information obtaining unit, configured to obtain information that a thread or a process needs to exit; a resource checking unit, configured to obtain, in the information obtaining unit, a thread or a process to exit After the information, check whether the exception thrown by the thread or process that needs to exit still occupies the resource; the resource release unit is configured to check that the exception thrown by the thread or process that needs to exit still consumes resources, Release the occupied resource; and the exit unit is configured to exit the thread or process after the resource release unit releases the occupied resource.
  • a method for deleting a thread or a process in an embedded C language environment which is applied to a scenario in which a current thread or a process is deleted by another thread or a process, and includes: determining a thread or a process to be deleted; checking a thread or a process to be deleted Whether the exception still consumes resources; if so, releases the occupied resources; deletes the thread or process.
  • An apparatus for deleting a thread or a process in an embedded C language environment comprising: a determining unit, configured to determine a thread or a process that needs to be deleted; and a resource checking unit, configured to: after the determining unit determines a thread or a process that needs to be deleted, Check whether the exception that is thrown by the thread or process that needs to be deleted still occupies the resource; the resource release unit is configured to check, in the resource checking unit, that the abnormality thrown by the thread or process that needs to be deleted still occupies resources, and releases the occupation a thread or a process deletion unit, configured to delete the thread or process after the resource release unit releases the occupied resource.
  • An embedded system includes the above exception handling device.
  • an abnormality occurs in the program code segment, it is not simply re-running the program code segment, but is caused by an exception independent of the program code segment.
  • the handler handles the exception so that when the program is running, it will not be interrupted due to an exception, satisfying the need for the product to not interrupt when the system is running.
  • the resource occupied by the processing thread or the exception thrown by the process may be released, so that when When other threads or processes need to use these resources, they will not be used by other threads or processes because the exceptions thrown by the deleted or exiting threads or processes still consume resources.
  • threads that need to be deleted can be deleted by other threads, so that exception handling when threads are deleted across threads can be implemented.
  • FIG. 1 is a flowchart of an exception processing method in an embedded C language environment according to an embodiment of the present invention
  • FIG. 2 is a schematic structural diagram of an exception processing apparatus in an embedded C language environment according to an embodiment of the present invention
  • FIG. 3 is a schematic diagram of different exception handling procedures corresponding to different exception types according to an embodiment of the present invention
  • FIG. 4 is a flowchart of a specific embodiment of an exception handling method in an embedded C language environment according to the present invention
  • FIG. 5 is a schematic diagram of a storage layout of heap space storage exception related information according to an embodiment of the present invention
  • FIG. 6 is a flowchart of implementing a try block according to an embodiment of the present invention
  • FIG. 7 is a flowchart of implementing an EXT block according to an embodiment of the present invention.
  • FIG. 8 is a flowchart of an implementation of capturing a specific abnormality according to an embodiment of the present invention.
  • FIG. 9 is a flowchart of an implementation of a capture processing specified exception according to an embodiment of the present invention.
  • FIG. 10 is a flowchart of an implementation process of capturing and processing an abnormality in an abnormal interval according to an embodiment of the present invention.
  • FIG. 11 is a flowchart of implementing a throw block according to an embodiment of the present invention.
  • FIG. 12 is a flowchart of a fine management method of exception processing according to an embodiment of the present invention.
  • FIG. 13 is a flowchart of a method for exiting a thread or a process according to an embodiment of the present invention
  • FIG. 14 is a schematic structural diagram of an apparatus for exiting a thread or a process according to an embodiment of the present invention
  • FIG. 15 is a flowchart of a method for deleting a thread or a process according to an embodiment of the present invention
  • FIG. 16 is a schematic structural diagram of an apparatus for deleting a thread or a process according to an embodiment of the present invention. detailed description
  • a targeted exception handler can be written according to different scenarios, local exception handling is performed, and recovery is attempted, without having to restart the system for all exceptions. Execution continues after the exception is processed, which improves the efficiency of the code under normal processes and simplifies programming.
  • the implementation of the exception handling framework (which can be referred to as an exception handling device) in an embedded system in a C-language environment does not depend on the compiler, and provides a way for the user to fine-tune the exception handling framework.
  • Figure 1 An exception handling method in a plurality of embedded C language environments is provided, One of the methods is shown in Figure 1, which includes:
  • Step S101 Monitor a running program code fragment that needs to be protected
  • Step S102 If the program code fragment is abnormal, the abnormality is thrown, and the abnormality includes at least one of a software exception and a hardware abnormality;
  • the solution of the embodiment of the present invention is applicable not only to software exceptions but also to hardware abnormalities; when a hardware exception occurs, an attempt may be made to restore the abnormality to avoid restarting the system;
  • Step S103 Determine, according to the obtained exception, a corresponding exception handling program, wherein the exception is processed by the exception handler, wherein the exception handler is independent of the program code fragment.
  • the step of monitoring the running program code fragment to be protected is specifically: the monitoring is running according to the granularity of the set processing exception. Program code fragment that needs to be protected;
  • the granularity of the processing exception of the setting includes at least one of a function level, a module level, and a component level, wherein the module is composed of a plurality of functions, and the component is composed of a plurality of modules.
  • the user sets the granularity of processing exceptions at the function level during the debugging phase.
  • the code is stable, the user sets the granularity of handling exceptions to the module level, and the code only recognizes module-level exceptions when throwing exceptions.
  • the method further includes: applying a storage space for recording information related to the abnormality; and after the abnormality occurs in the program code segment, before the abnormality is thrown, recording and Abnormally related information. It should be understood that: Information related to the exception is recorded in the storage space of the application.
  • the step of throwing the abnormality is, in one implementation, specifically:
  • the information related to the abnormality is packaged and delivered.
  • the information related to the abnormality includes at least an abnormal type identifier, and the following should be stated:
  • the abnormal type identifier is a type indicating an abnormality of the current program code segment.
  • Information in the form of numbers, or characters, or a combination of numbers and characters, for example: Different strings are used to represent different types of exceptions.
  • the embodiments of the present invention are applicable to different types of abnormalities.
  • different specific types of abnormalities may be assigned different identifiers in advance, for example, the abnormalities are uniformly divided into b, c, d, e, f. (small class), and at the same time use another identifier to distinguish which are software exceptions and which are hardware exceptions (large classes), for example: 1 means software exception; 0 means hardware exception; need to be explained: This is only an example, not To limit the solution of the embodiments of the present invention.
  • the corresponding exception handling program is determined according to the obtained abnormality, and the abnormality processing program processes the abnormality step.
  • the method may include: obtaining the transmitted abnormality and the abnormality Related information, the information related to the abnormality includes an abnormal type identifier;
  • An exception handler matching the exception type corresponding to the exception type identifier is determined, and the exception is processed by the exception handler. Therefore, the embodiment of the present invention performs different processing for different types of abnormalities, and avoids the problem that the prior art restarts the system when an abnormality is encountered, resulting in a long system interruption time.
  • Determining an exception handler matched by the exception type corresponding to the exception type identifier, and the step of processing the exception by the exception handler includes:
  • An exception type can be a type specified by an array, or a type within an exception interval;
  • an exception handler matching the exception type corresponding to the exception type identifier may be determined by a macro, and the macro is in the form of EXCEPT, and the macro may have an exception type parameter, or Without exception type parameters;
  • the specific matching process may include: obtaining thread exception information (ie, information related to the exception); determining whether the exception type identifier in the thread exception information matches one of the exception type parameters ; If it matches, the corresponding exception handler is executed; if it does not match, the exception information is re-delivered (thrown).
  • thread exception information ie, information related to the exception
  • any type of exception will be handled by the corresponding exception handler.
  • the EXCEPT macro gets an exception, it is passed to an exception that is closest to the location of the program code fragment.
  • the handler handles exceptions and acts as a catch for all types of exceptions.
  • the exception information including the exception type identifier is passed to the except block macro for processing, and the user-written exception handler can perform unified processing without distinction.
  • the method of the embodiment of the present invention further includes: if the exception handler matching the exception type does not currently exist, the obtained exception-related information is re-transmitted, or when none of the matching is successful, the default handler is started.
  • the default handler is to restart the system.
  • a corresponding exception processing program is determined, and the abnormality processing program processes the abnormality step, in another In one implementation, it may include:
  • the information related to the exception is obtained, and the information related to the abnormality includes the identifier of the exception type and the identifier of the specified processing mode.
  • the different specified processing manners may be identified by different specified processing manners, for example: 1 indicates the processing method of fault tolerance; 0 indicates the processing method of error checking.
  • the processing method can be fault tolerance or error checking.
  • the abnormality processing program of the fault-tolerant manner processes the abnormality
  • the processing mode is the error-checking processing mode
  • the abnormality processing program of the error-checking manner processes the abnormality, where The exception handler is independent of the program code fragment.
  • the default handler is started. The default handler is to restart the system.
  • the embodiment of the present invention can not only perform different processing for different types of abnormalities, but also process the abnormalities in different processing manners according to the manner set by the user.
  • the main method for processing the abnormalities is Capturing exception handling errors and outputting errors
  • the main method of exception handling is to provide fault-tolerant recovery when the product is released for development.
  • the exception handler in the embodiment of the present invention is also capable of matching and processing multiple types of exceptions.
  • determining that the exception handler matching the exception type identifier corresponds to: determining an exception type corresponding to the exception type identifier An exception handler that matches and is closest to the location of the program code snippet.
  • the method further includes: returning the result of the normal running of the program code segment step by step, or running the exception handler Program code fragments that are adjacent and behind; thus improving the efficiency of code running under normal processes.
  • the exception is matched and caught by a macro that matches and catches the exception function; the running program code fragment that needs to be protected is monitored by a macro with monitoring function; the macro is thrown by a macro with a function that throws an exception Said abnormal.
  • the program code segment may refer to a function, or may be a module composed of multiple functions, or may be a component composed of multiple modules.
  • the program code segment may also be a program segment of other levels, where No longer list them one by one.
  • the monitoring function monitors the program code fragment, for example, a macro that can be encapsulated by the C language setjmp() function.
  • exceptions can be thrown by macros that throw exceptions, such as macros that encapsulate the longjmp() function of the C language.
  • At least one exception handler can be created for the piece of program code that needs to be protected.
  • Each exception handler can match and handle one type of exception, as well as match and handle multiple types of exceptions. Different exception handlers can handle the same type of exception.
  • an exception handler can be selected to handle this type of exception. For example, you can select an exception that is closest to the program code fragment.
  • the handler processes the exception. Specifically, suppose that a program code fragment has an exception handler that can handle the same exception, such as program A, program B, and program C. When the program code fragment throws an exception, if there is no special setting, the program is generally used by the program. A (after the program code fragment, the position is relative to the program code fragment in all exception handlers capable of handling the exception) to handle the exception.
  • the exception handler and the program code fragment are independent of each other, so that there are at least two advantages: the first advantage is that if the program code fragment does not have an exception during the running, the exception handler will not be executed. Therefore, it does not affect the normal operation of the program code segment, and objectively improves the running efficiency of the program code segment; the second advantage is that the user can be provided whether the exception handler handles the exception or which exception handler handles it. Abnormal choice.
  • the program code fragment may be abnormal during the called process.
  • the program code fragment may be returned after the normal operation of the program code fragment. result.
  • function A calls function B
  • function B calls function C
  • function C if function C has an exception at runtime, and there is an exception handler that matches the type of the exception, then the exception handler can handle the exception
  • the function C can Normal operation
  • the result of its normal operation can be returned to function B
  • function B returns the result of function B to function A. It can be seen that even if function B calls function C, function C runs abnormally, but for function A and function B, this or these exceptions are not found. Function A and function B get function B respectively.
  • the program code fragment after the exception handler may also be executed. Still taking the above example as an example, even if the exception handler handles the exception, it does not return the execution function C, but executes the subsequent program code fragment.
  • the subsequent program code fragment may refer to the exception handler and is adjacent to it.
  • the program code fragment after the location may also be any program code fragment after the exception handler.
  • exceptions can be matched and caught by macros with matching and catching exception functions implemented in C language, for example, can be returned by a setjmp() function encapsulating C language and returning a non-zero value. Branch macro.
  • FIG. 1 One of the exception handling devices in the embedded C language environment (also known as the exception handling framework) is shown in Figure 2, including:
  • the monitoring unit 201 is configured to monitor a running program code segment that needs to be protected.
  • the exception throwing unit 202 is configured to: after the monitoring unit 201 finds that the program code segment is abnormal, throw the abnormality, where the abnormality includes software. At least one of an exception and a hardware exception; the matching unit 203 is configured to determine, according to the obtained exception, a corresponding exception handler, where the exception handler is configured to process an exception thrown by the exception throwing unit, where The exception handler is independent of the program code fragment.
  • the macro with monitoring function is modular, that is, the monitoring unit, for example, a macro that encapsulates the C language setjmp ( ) function.
  • the above device may further include:
  • the information recording unit 204 is configured to record information related to an abnormality of the program code segment found by the monitoring unit 201, and output the information to the abnormality throwing unit 202.
  • the exception is thrown Unit 202 may throw information related to the exception when an exception is thrown.
  • the information related to the abnormality may include software abnormality information as well as hardware abnormality information.
  • a macro having a function of throwing an exception is modularized, that is, an exception throwing unit 202, which may be, for example, a macro that encapsulates the long jmp ( ) function of the C language.
  • the exception throwing unit 202 is a first exception throwing unit, configured to: after the monitoring unit 201 finds that the program code fragment is abnormal, the information related to the abnormality is packaged and transmitted, and the information related to the abnormality is at least An exception type identifier is included, the exception type identifier being used to indicate the type of exception in which the current program code fragment appears.
  • the matching unit 203 is a first matching unit, configured to obtain the information related to the abnormality that is transmitted, the information related to the abnormality includes an abnormal type identifier, and determines an abnormality that matches the abnormal type corresponding to the abnormal type identifier.
  • a handler that processes the exception by the exception handler.
  • the matching unit 203 is configured to obtain the information related to the abnormality, and the information related to the abnormality includes the abnormal type identifier, the specified processing mode identifier, and the abnormality corresponding to the abnormal type identifier.
  • the exception handler that matches the type and the processing mode corresponding to the specified processing mode identifier is processed by the exception handler. For example, you can set a function-level exception handler, you can also set a module-level exception handler, and you can set a component-level exception handler, assuming that the three levels of exception handlers can handle the same type of exception. But the treatment is different. The user can choose to handle the level of the exception. If the user selects the module level, the corresponding exception handler is handled in a fault-tolerant manner. When the program code fragment to be protected is abnormal during the running, the module is processed at the module level.
  • the exception handler, gp handles exceptions in a fault-tolerant manner.
  • the processing method can include various methods such as fault tolerance and error checking.
  • the exception can be handled according to the set processing manner. For example, if the processing method set is fault-tolerant, you can use the fault-tolerant exception handler to handle exceptions. For another example, if The processing method is the error detection processing method, and the exception processing program can be used to handle the exception, wherein the exception processing program and the program code fragment are independent of each other.
  • the matching unit 203 is a third matching unit, configured to determine, according to the obtained exception, a type that matches the type of the exception, and An exception handler that is closest to the location of the program code fragment, and the exception is handled by the exception handler.
  • the monitoring unit 201 is a first monitoring unit for monitoring the running program code fragment to be protected according to the granularity of the set processing exception. For example: When the granularity of the set processing exception is the module level, and the running program code fragment that needs to be protected is the function level, then there is no need to monitor the running program code fragment that needs to be protected; When the granularity of processing an exception is a function level, and the running program code fragment to be protected is a module level, the running program code fragment to be protected is monitored; for the program code fragment to be protected, at least An exception handler. Each exception handler can match and handle one type of exception, as well as match and handle multiple types of exceptions.
  • Different exception handlers can handle the same type of exception.
  • the matching unit 203 can select an exception handler to handle this type of exception. For example, one can choose one and the other.
  • the exception handler for the most recent program code fragment handles the exception.
  • the program code fragment may be abnormal during the called process, and the matching unit 203 determines an exception handler that matches the type of the exception. After the exception handler processes the exception, the program code fragment You can return to the results after normal operation step by step.
  • the macro modularization matching unit 203 which is implemented by the C language and has the function of matching and capturing exceptions, may be, for example, the setjmp ( ) function of the packaged C language is called to return a non-zero value of the else branch. Macro.
  • the present invention also provides an embedded system that includes the exception handling apparatus described above (i.e., an exception handling framework).
  • exception handling apparatus described above
  • an exception handling framework For details, please refer to the description of the exception handling framework above, which will not be described here.
  • the present invention also provides an alternative method embodiment. Specifically, as shown in Figure 4, it includes:
  • Step S401 executing the program code
  • Step S402 determining whether an abnormality is triggered, if yes, proceeding to step S403; otherwise, transferring to step S401;
  • Step S403 Determine a try block corresponding to the granularity according to the granularity of the processing exception (for the convenience of description, the try block is used to represent the macro with monitoring function);
  • Step S404 determining whether the try block has a except block (for convenience of description, the except block is used to represent a macro having a function of capturing and matching an exception), and if so, the process proceeds to S406, otherwise, the process proceeds to S405;
  • Step S405 determining a try block corresponding to a higher level of granularity, and executing step S404;
  • Step S406 determining whether the except block can handle the exception, if yes, proceed to step S407, otherwise, proceed to step S405;
  • Step S407 Execute the code of the except block, and then go to step S401.
  • the embodiment of the present invention first establishes abnormal record information in an embedded C language environment, establishes a storage and transfer model of abnormal related information, and finally implements an abnormal association mechanism and a user interface. 1.About abnormal record information
  • Table 1 is a representation of the abnormal record information.
  • VOS UINT32 ulSehErrOrlntCode; //Error code information in case of software abnormality, whether the flag is abnormal in the case of hardware abnormality
  • VOS_ UINT32 ulSehFlag VOS_ UINT32 ulSehFlag; / / whether the exception can continue to identify
  • VOS_ UINT32 ulSehAddr //The address of the instruction where the exception occurred
  • VOS_ UINT32 a_SehInfo[EXC_MAX_PARA_NUM]; ⁇ Exception additional parameter information
  • the exception related information includes: (1) each try block holds the env information (info) of its running context; (2) the abnormal record information after the occurrence of the abnormality (ie, the previously defined VOS-SEH-REC); Exceptional state control table for threads.
  • the information from the macro with the exception throwing function to the macro with the matching and catching exception function is stored and passed by the thread-wide stack, where the required storage space of the env information needs to satisfy the depth of the maximum nesting level of the try block, and the exception
  • the record information storage space needs to satisfy the maximum depth of a nest. Therefore, it can be considered that in the thread unit, after the thread is created, the thread heap space is allocated to store the abnormality related information, and the storage layout can be referred to FIG. 5.
  • the env information is highly dynamic information during the normal operation of each thread, and one copy is reserved for each thread.
  • the exc information (mfo) appears only when the thread is running abnormally, and can be shared between threads.
  • the env information concatenates all traceable environment records to form an exception range table.
  • a matching except block in the throw block for convenience of description, here a throw block is used to represent a macro with a function that throws an exception
  • Table 2 The information to be recorded in the storage unit of this table is shown in Table 2:
  • VOS - BOOL bllntFlag / / whether to set the flag in the interrupt background #ifdef SEH— DEBUG //Exception debugging
  • VOS - CHAR *pSehSetFile VOS - CHAR *pSehSetFile
  • VOS_UINT32 ulSehSetLine / / set the line number of the exception
  • the exc information records the abnormal record information, and when the throw block (corresponding to the exception throwing unit in the above device) operates, the structure is passed as an information parameter to the matched except block (corresponding to the matching unit in the above device) ) to process, if there is abnormal nesting, the information is concatenated.
  • the information to be recorded is shown in Table 3: Information Valid Flags Abnormal Record Information
  • the SHE EXC INFO buffer allocation control information table shared between threads is as shown in Table 4.
  • Typedef struct SEH— INFO— BUF— CTRL ⁇ Buffer Allocation Control Information Table
  • VOS_UINT32 ulMaxScopeLayer; //thread try block maximum nesting level
  • VOS UINT32 ulMaxExcNestNum; //Thread exception maximum nesting level
  • ulSehStatusFlag flag has six states, namely: SEH- STAT- NON (the initial value must be 0 in the absence of abnormal conditions), SEH STAT U HANDLE (unprocessed exception), SEH STAT HANDLED (processed), SEH STAT CONTINUE SEARCH (continued backtracking exception handling block), SEH—STAT—CONTINUE—REDO (re-execution from exception) and SEH—STAT—RESTART ( restart process or board).
  • the thread exception range table is organized in a singly linked list manner, and is operated in a stack order.
  • the embodiment of the present invention provides an interface function of the following functions: VOS— UINT32 SEH ScopeTablePush (SEH— SCOPE— UINT
  • the application release of the thread exception information buffer table provides the following interface function functions:
  • the se jmpG and longjmpG functions provided in the standard C library provide a mechanism for non-local local jumps.
  • the compiler does not rely on the compiler to implement the exception association mechanism.
  • the setjmp encapsulation can be used to implement the try block. After identifying the exception, longjmp is called to provide the throw block. The except block is a non-zero value after the setjmp call. Else branch.
  • the task is successfully created, the application system heap space saving SEH- TH- CTRL, the use taskVarAdd pointer pointing SEH- TH- CTRL g _pSehThCtrl task is saved in a variable, in the try block can be accessed via a local variable g _pSehThCtrl, whose value is switched by VxWorks, and the heap space is recorded in the system task resource summary table.
  • pthread_key create to create a key handle and save it in the key handle.
  • pointer g _pThKey after the thread is successfully created, apply the system heap space to save SEH_TH_CTRL, call pthread-setspecific to complete the pointer to the SEH_TH-CTRL pointer g_pSehThCtrl content, save the pthread-getspecific through the local variable in the try block. return value (g _pSehThCtrl content of this thread) to operate an abnormal state of this thread control table, while the overall system heap thread resources recorded in the table.
  • Step S601 Start executing a try block macro
  • Step S602 determining whether the granularity corresponding to the try block is smaller than the granularity of the set processing exception, if yes, proceed to step S608, otherwise, proceed to step S603;
  • Step S603 Obtain an address of the current thread abnormal state control table, and proceed to step S604;
  • Step S604 Applying a Unit block from the idle range block list of the thread abnormal state control table, and then executing step S605;
  • Step S605 Initializing the bilntFlag of the Unit block, pressing the Unit block into the thread exception range linked list, and initializing the related items of the abnormal state control table, and proceeding to step S606;
  • Step S606 Calling the setjmpO function, and then step S607;
  • Step S607 determining whether to return 0, if yes, proceeding to step S608, otherwise, proceeding to step S609;
  • Step S608 normal processing, transfer step S610;
  • Step S609 abnormal processing, transfer step S610;
  • Step S610 End execution of the try block macro, and then step S611;
  • Step S611 determining whether backtracking is required, if yes, proceeding to step S612, otherwise, proceeding to step S613; Step S612: Rethrowing the exception;
  • Step S613 determining whether a reset is required, if yes, proceeding to step S614, otherwise, proceeding to step S615;
  • Step S615 determining whether to resume execution, if yes, proceed to step S616, otherwise, transfer
  • Step S616 Perform an abnormal recovery operation according to the characteristics of the CPU
  • Step S617 The try block ends processing.
  • steps S608 and S609 are user processing codes, SP, processes that the user needs to perform, such as normal program codes such as program code segments to be protected.
  • the try block can dynamically request a record unit from the free range block list of the thread exception state control table, and if the thread try block maximum nest level ulMaxScopeLayer is exceeded, the system default exception handling is triggered. Under normal circumstances, after a small number of initialization operations, push it into the thread exception scope list, and then call setjmp in the if statement to monitor the normal processing flow code of the application, in the monitored code fragment. When a hardware or software exception is thrown, the program can be restored to the execution point saved by this setjmp.
  • Step S701 Start executing an except block macro
  • Step S702 Close the scope of the normal processing branch or the scope of the previous exception processing mode
  • Step S703 determining whether it is the current abnormal processing mode, if yes, proceed to step S704, no BET
  • Step S704 The Unit block is popped up by the thread exception range table
  • Step S705 releasing the Umt block to the idle range block list of the thread abnormal state control table; Step S706: setting the state of the abnormal processed state;
  • Step S707 Execute the exception handler code, where the exception handler code is the exception handling code
  • Step S708 Transfer the exception block of the exception handling mode or end the exception processing.
  • the package code is as follows:
  • Step S801 Start executing an except block macro
  • Step S802 Close the scope of the normal processing branch or the scope of the previous exception handling mode
  • Step S803 determining whether it is the current abnormal processing mode, if yes, proceed to step S804, otherwise, proceed to step S810;
  • Step S804 popping the Unit block into a thread exception range table
  • Step S805 determining whether the abnormal type is matched, if yes, proceed to step S807, otherwise, proceed to step S806;
  • Step S806 Rethrowing the exception
  • Step S807 releasing the Umt block to the idle range block list of the thread abnormal state control table; Step S808: setting the state of the abnormal processed state;
  • Step S809 executing an exception handler code
  • Step S810 Transfer the exception block of the exception handling mode or end the exception processing.
  • the implementation code is as follows:
  • Step S901 Start executing an except block macro
  • Step S902 Closing the scope of the normal processing branch or the scope of the previous exception processing mode
  • Step S903 determining whether it is the current abnormal processing mode, if yes, proceed to step S904, no ij, step S910;
  • Step S904 popping the Unit block into a thread exception range table
  • Step S905 determining whether the type of the exception specified by the array is matched, if yes, proceed to step S907, otherwise, proceed to step S906;
  • Step S906 Rethrowing the exception
  • Step S907 releasing the Umt block to the idle range block list of the thread abnormal state control table; Step S908: setting the state of the abnormal processed state;
  • Step S909 executing an exception handler code
  • Step S910 Transfer the exception block of the exception handling mode or end the exception processing.
  • the implementation code is as follows:
  • Step S1001 Start executing the except block macro
  • Step S1002 Turn off the scope of the normal processing branch or the scope of the previous exception handling mode
  • Step S1003 determining whether it is the current abnormal processing mode, if yes, proceed to step S1004, otherwise, proceed to step S1010;
  • Step S1004 The Unit block is popped up by the thread exception range table
  • Step S1005 determining whether the abnormal type in the abnormal interval is matched, if yes, proceed to step S1007, otherwise, proceed to step S1006;
  • Step S1006 Rethrowing the exception
  • Step S1007 Release the Umt block to the idle range block list of the thread abnormal state control table; Step S1008: Set the state of the abnormal processed state;
  • Step S1009 executing an exception handler code
  • Step S1010 Transfer the exception block of the exception handling mode or end the exception handling.
  • the implementation code is as follows:
  • the mt block is released back to the thread idle range block list in the thread exception state control table.
  • the embodiment of the present invention further provides an operation macro interface for further processing to the application layer in the except block as follows:
  • gP uniform throw operation
  • Step S1101 executing a Throwlnner ( ) function
  • Step S1102 determining whether the parameter is legal, if yes, proceed to step S1103, otherwise, proceed to step S1112;
  • Step S1103 Obtain an address of a current thread abnormal state control table
  • Step S1104 Obtaining a top storage unit of a thread exception range linked list
  • Step S1105 determining whether there is a matching try block and an except block, if yes, proceed to step S1106, otherwise, proceed to step S1112;
  • Step S1106 determining whether there is a shared exception information cache or whether the thrown abnormal record is an abnormal live record, if yes, proceed to step S1107, otherwise, proceed to step S1111;
  • Step S1107 Allocating a shared exception information cache
  • Step S1108 determining whether there is a cache, if yes, proceeding to step S1109, otherwise, proceeding to step S1112;
  • Step S1109 Initializing the cache, setting an unhandled exception flag
  • Step S 1110 Execution of the except block code
  • Step S1111 setting an exception handling flag
  • Step S1112 Perform default exception handling.
  • the implementation code is as follows:
  • VOS UINT32 ulSehStatusFlag
  • plnfoBuf SEH ExcInfoBufAllocO
  • plnfoBuf -> seh-rec.ulSehType pSehRec->ulSehType;
  • the second parameter is used to return the exception handling status information to
  • the simplified macro-encapsulation interface first initializes the thrown exception record information, and then calls the SEH-Thrownner function, which implements the following:
  • pSehThCtrl->ulSehStatusFlag is set to require a backtracking status
  • SEH—HANDLE—LEVEL the user can configure the macro to preserve the granularity of the desired exception handling framework.
  • the value of this macro defaults to FUNC_LEVEL (function level).
  • the user can configure the value of this macro as MODULE_LEVEL or COMPONENT_LEVEL as needed.
  • the user can also specify the configuration level of the try block.
  • SEH—Level> SEH—HANDLE—LEVEL
  • SEH—HANDLE—LEVEL you can control the fineness of the exception handling framework. For example, the user sets SEH—HANDLE—LEVEL to FUNC—LEVEL (function level) during the debugging phase, and all try blocks can be recognized. When the code is stable, the user sets SEH—HANDLE—LEVEL to FUNC—LEVEL to MODULE—LEVEL, The code only recognizes module-level exceptions when an exception is thrown.
  • the main method of handling exceptions is to catch exception handling errors and output errors.
  • the main method of exception handling is fault-tolerant recovery. Therefore, the fine management of exception handling provides the user with a framework, so that when users write exception handling code at different stages, they do not need to overwrite the previous code but simply specify the processing method, and write different exception handling codes for different processing methods.
  • EXCEPTION - CHECK EXCEPTION - TOLARENT and other user-defined methods
  • EXCEPTION - HANDLE_ METHOD can handle the exception of the corresponding try block. Users can use the exception handling framework as follows:
  • SEH TRY END support implementation and flow of fine-grained exception handling methods in the design part of the except block and Description has been made in FIG.
  • Step S1201 executing a try block of the protection program code
  • Step S1202 determining whether the current level is not less than the level configured by the user, if yes, proceed to step S1203, otherwise, proceed to step S1209;
  • Step S1203 Execute a program code that needs to be protected
  • Step S1204 determining whether the program code to be protected throws an exception, if yes, proceed to step S1205, otherwise, proceed to step S1203;
  • Step S1205 determining a corresponding except block
  • Step S1206 determining whether the abnormal processing mode set by the user is met, if yes, proceed to step S1207, otherwise, proceed to step S1208;
  • Step S1207 executing an exception handler code
  • Step S1208 Transfer the next exception processing mode, and then step S1206;
  • Step S1209 Ignore the current try block protection, and then go to step S1203.
  • the user can configure the exception handling level and exception handling means. For example, when a try block is encountered, it is first determined whether the current try block level is not less than the user-configured exception handling level. If so, the code is protected. Otherwise, the try block protection mechanism is ignored. For the code of the try block protection, if an exception is thrown, the corresponding except block is searched. If the processing method of the found except block is consistent with the processing method configured by the user, the corresponding exception processing is performed, otherwise, the corresponding next processing is sought. The means block of the means.
  • the embodiments of the present invention provide two types of external interfaces: one is an interface for constructing an exception framework, and includes interfaces SEH-TRY-BEG and SEH-TRY-END for identifying the try block of the code segment for matching with the code segment.
  • the interface of the exception handler except block SEH_EXCEPT (match all exceptions), SEH-EXCEPT- ONE (match a certain type of exception), SEH-EXCEPT-VAR ( With an exception type variable) and SEH_EXCEPT-IN (an exception that matches a specific type number interval), and an SEH-THROW interface for the throw block that throws the exception; the other is in the exception handling framework, for convenience
  • the program further handles exceptions, or more flexibly controls the processing interfaces used by the exception handling process, including SEH-GET-RECORD (get exception record information), SEH-GET-TYPE (get exception type), and SEH-SET- STATUS (Set Exception Handling Status), the above interfaces are provided in macro mode and used inside the exception handling
  • SEH TRY BEG SEH level
  • SEH SET— STATUS (/* can be set to continue backtracking exceptions, resume execution from exception instructions, reset process
  • the present invention also provides a method for exiting a thread or a process and a method for deleting a thread or a process in an embedded C language environment.
  • the implementation flow of the method for exiting a thread or a process is as shown in FIG. 13 , and is applied to a scenario in which a thread actively exits, including:
  • Step S1301 Obtain the information that the thread or process needs to exit.
  • Step S1302 Check whether the exception thrown by the thread or process that needs to exit still occupies the resource, if yes, proceed to step S1303, otherwise, proceed to step S1304;
  • Step S1303 Release the occupied resources
  • Step S1304 Exit the thread or process.
  • Checking whether the exception thrown by the thread or process that needs to exit still consumes resources can include: Check if the thread or process that needs to exit has thrown an exception; if so, check if the thrown exception still consumes resources.
  • the user can be provided with a thread exiting interface operation VOS_ExitThread, and the interface function first checks whether the current thread has abnormally processed resources has not been released before exiting the thread, and if so, it occupies the throwing exception in the try block. Resources are checked and released, then executed The operation of the thread.
  • An apparatus for exiting a thread or a process in an embedded C language environment includes: an information obtaining unit 1401, configured to obtain information that a thread or a process needs to exit; and a resource checking unit 1402, configured to: After obtaining the information that the thread or the process needs to exit, the obtaining unit 1401 checks whether the abnormality thrown by the thread or the process that needs to be exited still occupies the resource; the resource releasing unit 1403 is configured to check, in the resource checking unit 1402, the thread or process that needs to be exited. If the thrown exception still occupies resources, the occupied resource is released; the thread or process exit unit 1404 is configured to exit the thread or process after the resource release unit 1403 releases the occupied resource.
  • the implementation flow of the method for deleting a thread or a process is as shown in FIG. 15 and is applied to a scene in which the current thread or process is deleted by another thread or process, including:
  • Step S1501 Determine the thread or process that needs to be deleted.
  • Step S1502 Check whether the exception thrown by the thread or process that needs to be deleted still occupies the resource. If yes, go to step S1503, otherwise, go to step S1504;
  • Step S1503 releasing the occupied resources
  • Step S1504 Delete the thread or process.
  • Checking whether the exception thrown by the thread or process that needs to be deleted still consumes resources can include: Check whether the thread or process that needs to be deleted has thrown an exception; if it is, check whether the thrown exception still consumes resources.
  • the thread 2 needs to perform the delete operation on the thread 1.
  • the thread 2 processes the resource occupied by the exception thrown in the thread 1 Then delete thread 1.
  • thread 2 deletes thread 1 by sending a signal to thread 1, so the thrown exception can be processed in the handler handler of the registration signal in thread 1.
  • exception handling for cross-process deletion can be handled in the same way.
  • the delete task's function taskDelete allows passing functions taskDeleteHookAddO registers the hook function, so the registration hook function can handle the exception of the task to be deleted before deleting the task.
  • the embodiments of the present invention provide a unified processing means.
  • the VOS-SellExHandleO function is provided, and the handler for registering the signal for deleting the thread (process) under the Linux system is registered as an exit hook under vxWorks.
  • VOS—The KillExHandleO function obtains the current exception to be processed by obtaining the information in the exception state control table of the deleted thread, and then processes the exception and its occupied resources accordingly.
  • a device for deleting a thread or a process in a C language environment is as shown in FIG. 16, and includes: a determining unit 1601, configured to determine a thread or a process that needs to be deleted;
  • the resource checking unit 1602 is configured to check, after the determining unit 1601 determines the thread or process that needs to be deleted, whether the abnormality thrown by the thread or process that needs to be deleted still occupies resources;
  • the resource release unit 1603 is configured to: after the resource checking unit 1602 detects that the abnormality thrown by the thread or process that needs to be deleted still occupies resources, release the occupied resource;
  • the thread or process deleting unit 1604 is configured to delete the thread or process after the resource releasing unit 1603 releases the occupied resource.
  • the embodiment of the present invention implements a finely manageable exception handling method that does not rely on a compiler in an embedded C language environment.
  • the user interface provided by the embodiment of the present invention can separate the coding and exception processing of the user, so that when the user develops the program using the embedded C language environment, the program design based on the exception processing can be realized by using a simple macro interface, thereby further Pay attention to the development of the normal branch of the code.
  • the fine-grained design of the exception framework allows the user to adjust the level of exception handling as needed. For example, in the debugging phase, the exception handling can be set at the function level to capture the exception of the program, and after the code is stable, the product is online. At runtime, the exception handling level is set to the component level, and the exception handling at the function level is ignored, and only the exceptions that occur in the module are uniformly processed.
  • the embodiment of the present invention implements dynamic configuration of exception handling in the above-mentioned compiler-independent exception handling method and exception handling framework, in view of the situation in the prior art that the user cannot control the granularity and manner of exception processing according to his own needs.
  • the user's fine management of the exception handling framework and processing methods includes two aspects:
  • users can dynamically configure exception handling to different levels of functions, modules, components, etc. as needed to achieve fine-grained management of exception handling frameworks.
  • the user in order to try to find the error that causes the exception, the user can configure the exception handling level to the function level.
  • the exception thrown by the function will be captured and processed by the function exception handling mechanism;
  • the code is relatively stable.
  • the user can configure the exception handling level to be module-level or even component-level.
  • the mechanism of exception handling works within the scope of the module or component. The thrown exception will be The exception handling mechanism of the module or component is captured and processed uniformly.
  • the user can handle different exception handling for the same protected code, and can configure exception handling methods in the exception handling framework to make different exception handling methods work in different situations.
  • the user's exception handling can have at least two methods of error detection and fault tolerance.
  • error detection method uses the error detection method to try to find the error that caused the exception, and use the fault-tolerant mode to the exception when the product is released.
  • Perform recovery processing Users can configure exception handling in the exception handling framework for error checking or fault tolerance.
  • the exception handler handles the exception so that when the program is running, it will not be interrupted due to an exception, satisfying the need for the product to not interrupt when the system is running.
  • the exception handling mechanism in the prior art does not support exception processing when deleting across threads and across processes
  • the embodiment of the present invention provides an exception handling method and an exception handling framework that are not dependent on the compiler in the embedded C environment.
  • the method of thread voluntarily exiting and cross-threading (process) deletion.
  • process cross-threading
  • the exceptions that are still consuming resources cause other threads or processes to be unable to use them.
  • threads that need to be deleted can be deleted by other threads, so that exception handling when threads are deleted across threads can be implemented.
  • the storage medium may be, for example, a ROM/RAM, a magnetic disk, an optical disk, or the like.

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Description

嵌入式 c语言环境下异常处理方法及装置 本申请要求了 2008年 6月 3日递交的申请号为 200810100060.5, 发明名称为"嵌入式 C语言环境下异常处理方法及装置"的中国专利申 请的优先权, 其全部内容通过引用结合在本申请中。 技术领域
本发明涉及 C语言技术, 尤其涉及嵌入式 C语言环境下异常处理技术。 背景技术
异常是指硬件或软件程序在运行时出现的反常情形。 在嵌入式 c语言 环境下, 传统的异常处理方法是, 当发现异常时, 重启系统。 以程序异常为 例, 可以通过 CPU的异常识别能力, 检查程序运行时是否出现异常, 一旦 CPU发现程序运行时出现异常, 则调用异常处理程序, 将包含寄存器、 当 前堆栈、调用栈在内的异常信息保存下来,然后按统一的方式完成处理。 g卩, 对于发生在任务中的异常, 调试版本下挂起该任务,在正式版本中重启嵌入 式系统,对于发生在中断中的异常,则均以重启嵌入式系统的方式进行处理。
发明人经过仔细研究现有技术后发现, 随着软件复杂度的日益增加, 系 统重启需要更长的时间,而产品对系统的中断时间要求越来越短, 甚至不希 望系统运行时发生中断, 而在嵌入式 C语言环境下, 传统的异常处理方法 无法满足这样的需求。 发明内容
本发明实施例在于提供一种嵌入式 C语言环境下异常处理方法、 装置 及嵌入式系统, 用以实现当异常发生时, 缩短系统的中断时间, 或者不发生 中断。 一种嵌入式 c语言环境下的异常处理方法, 包括: 监控正在运行的需 要保护的程序代码片段,如果所述程序代码片段出现异常,则抛出所述异常, 所述异常包括软件异常、硬件异常中的至少一种; 根据获得的所述异常, 确 定相应的异常处理程序, 由所述异常处理程序处理所述异常, 其中, 所述异 常处理程序与所述程序代码片段相互独立。
一种嵌入式 C语言环境下异常处理装置, 包括: 监控单元, 用于监控 正在运行的需要保护的程序代码片段; 异常抛出单元,用于在所述监控单元 发现所述程序代码片段出现异常后,抛出所述异常,所述异常包括软件异常、 硬件异常中的至少一种; 匹配单元, 用于根据获得的所述异常, 确定对应的 异常处理程序, 所述异常处理程序用于处理所述异常抛出单元抛出的异常, 其中, 所述异常处理程序与所述程序代码片段相互独立。
一种嵌入式 c语言环境下退出线程或进程的方法, 应用于线程主动退 出的场景, 包括: 获得线程或进程需要退出的信息; 检查需要退出的线程或 进程所抛出的异常是否仍然占用资源; 如果是, 则释放所述占用的资源; 退 出所述线程或进程。
一种嵌入式 C语言环境下退出线程或进程的装置, 包括: 信息获得单 元, 用于获得线程或进程需要退出的信息; 资源检查单元, 用于在所述信息 获得单元获得线程或进程需要退出的信息后,检查需要退出的线程或进程所 抛出的异常是否仍然占用资源; 资源释放单元,用于在所述资源检查单元检 查出需要退出的线程或进程所抛出的异常仍然占用资源,释放所述占用的资 源; 退出单元, 用于在所述资源释放单元释放所述占用的资源后, 退出所述 线程或进程。
一种嵌入式 C语言环境下删除线程或进程的方法, 应用于当前线程或 进程被其他线程或进程删除的场景, 包括: 确定需要删除的线程或进程; 检 查需要删除的线程或进程所抛出的异常是否仍然占用资源; 如果是, 则释放 所述占用的资源; 删除所述线程或进程。 一种嵌入式 c语言环境下删除线程或进程的装置, 包括: 确定单元, 用于确定需要删除的线程或进程; 资源检查单元,用于在所述确定单元确定 需要删除的线程或进程后,检查需要删除的线程或进程所抛出的异常是否仍 然占用资源; 资源释放单元,用于在所述资源检查单元检查出需要删除的线 程或进程所抛出的异常仍然占用资源,释放所述占用的资源; 线程或进程删 除单元,用于在所述资源释放单元释放所述占用的资源后,删除所述线程或 进程。
一种嵌入式系统, 包括上述异常处理装置。
在本发明实施例的嵌入式 C语言环境下异常处理方法、 装置及嵌入式 系统中,如果程序代码片段出现异常,则不是简单的重新运行程序代码片段, 而是由独立于程序代码片段的异常处理程序来处理异常,这样,程序在运行 时,就不会因为异常而中断运行,满足了产品不希望系统运行时发生中断的 需求。
在本发明实施例的嵌入式 c语言环境下退出或删除线程或进程的方法 中,无论是退出或者删除线程或进程, 都可以释放处理线程或进程抛出的异 常所占用的资源, 这样, 当其他线程或进程需要使用这些资源时, 不会因为 删除或退出的线程或进程所抛出的异常仍然占用资源而导致其他线程或进 程无法使用这些资源。 另外, 还可以由其他线程删除所需要删除的线程, 从 而可以实现跨线程删除线程时的异常处理。 附图说明
图 1为本发明实施例的嵌入式 c语言环境下异常处理方法的流程图; 图 2为本发明实施例的嵌入式 C语言环境下异常处理装置的结构示意 图;
图 3为本发明实施例的不同的异常处理程序对应不同的异常类型的示 意图; 图 4为本发明的嵌入式 C语言环境下异常处理方法一具体实施例的流 程图;
图 5为本发明实施例的堆空间存储异常相关信息的存储布局示意图; 图 6为本发明实施例的 try块的实现流程图;
图 7为本发明实施例的 except块的实现流程图;
图 8为本发明实施例的捕捉某种特定异常的实现流程图;
图 9为本发明实施例的捕捉处理指定异常的实现流程图;
图 10为本发明实施例的捕捉和处理某一异常区间内的异常的实现流程 图;
图 11为本发明实施例的 throw块的实现流程图;
图 12为本发明实施例的异常处理的精细管理方法的流程图;
图 13为本发明实施例的退出线程或进程的方法的流程图;
图 14为本发明实施例的退出线程或进程的装置的结构示意图; 图 15为本发明实施例的删除线程或进程的方法的流程图;
图 16为本发明实施例的删除线程或进程的装置的结构示意图。 具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白, 以下参照附图并举 实施例, 对本发明作进一歩详细说明。
在本发明实施例中,对于 C语言环境下嵌入式系统中的异常可以根据不 同场景编写具有针对性的异常处理程序, 进行局部异常处理并尝试恢复,而 不必对所有异常都作重启系统处理,在异常处理完毕后继续执行, 从而提高 正常流程下的代码运行效率, 也简化了编程。 在 C语言环境下嵌入式系统 中异常处理框架(方便理解,可称为异常处理装置)的实现不依赖于编译器, 并且提供给用户对异常处理框架进行精细管理的方法。
本发明实施例中, 提供了多种嵌入式 C语言环境下的异常处理方法, 其中的一种方法如图 1所示, 包括:
歩骤 S101 : 监控正在运行的需要保护的程序代码片段;
歩骤 S102: 如果所述程序代码片段出现异常, 则抛出所述异常, 所述 异常包括软件异常、 硬件异常中的至少一种;
需要说明的是:本发明实施例的方案不仅适用于软件异常, 还适用于硬 件异常; 当发生硬件异常后, 可以尝试恢复异常, 避免重启系统;
歩骤 S103 : 根据获得的所述异常, 确定相应的异常处理程序, 由所述 异常处理程序处理所述异常,其中,所述异常处理程序与所述程序代码片段 相互独立。为了提供对异常抛出时异常处理级别的精细管理,在本发明实施 例中,所述监控正在运行的需要保护的程序代码片段的歩骤具体为:根据设 置的处理异常的粒度, 监控正在运行的需要保护的程序代码片段;
当一程序执行触发异常时,在一种实现下, 当正在运行的需要保护的程 序代码片段大于或等于设置的处理异常的粒度时,则监控所述正在运行的需 要保护的程序代码片段;
当正在运行的需要保护的程序代码片段小于设置的处理异常的粒度时, 则不监控所述正在运行的需要保护的程序代码片段, 也就是说, 就不需要执 行后续的歩骤; 这里的, 所述设置的处理异常的粒度包括函数级别、模块级 另 |J、 部件级别中的至少一种, 其中, 所述模块由多个函数组成, 所述部件由 多个模块组成。例如, 用户在调试阶段设置处理异常的粒度为函数级别; 当 代码稳定后,用户设置处理异常的粒度为模块级别, 则代码在抛出异常时只 识别模块级的异常。
在本发明实施例中,所述方法进一歩包括: 申请用于记录与异常相关的 信息的存储空间; 贝 I」, 在所述程序代码片段出现异常之后, 抛出所述异常之 前, 记录与异常相关的信息。应当理解的是: 将与异常相关的信息记录在申 请的存储空间中。
在本发明实施例中,所述抛出所述异常的歩骤,在一种实现下,具体为: 将所述与异常相关的信息打包后传递出去,这里,所述与异常相关的信息至 少包括异常类型标识,应当说明的是: 异常类型标识是用于表示当前程序代 码片段出现的异常的类型的信息, 形式上可以采用数字, 或者字符, 或者数 字和字符的组合, 例如: 采用不同的字符串表示不同异常类型。
应当理解的是: 本发明实施例适用不同类型的异常, 在一种实现下, 预 先可以给不同的具体异常类型分配不同的标识, 例如: 将异常统一分成 、 b、 c、 d、 e、 f (小类), 并且同时用另一个标识区分哪些是软件异常, 哪些 是硬件异常(大类), 例如: 1表示软件异常; 0表示硬件异常; 需要说明的 是: 这仅是一个例子, 不用于限制本发明实施例方案。
在本发明实施例中, 根据获得的所述异常, 确定相应的异常处理程序, 由所述异常处理程序处理所述异常的歩骤, 在一种实现下, 可以包括: 获得传递过来的与异常相关的信息,所述与异常相关的信息中包含异常 类型标识;
确定与所述异常类型标识对应的异常类型所匹配的异常处理程序,由所 述异常处理程序处理所述异常。因此, 本发明实施例针对不同类型的异常进 行不同处理, 避免现有技术在遇到异常时, 重启系统, 导致系统中断时间长 的问题。
确定与所述异常类型标识对应的异常类型所匹配的异常处理程序,由所 述异常处理程序处理所述异常的歩骤包括:
当所述异常类型标识对应的异常类型与能处理的一种特殊的异常类型 匹配时, 由与该异常类型匹配的异常处理程序处理该异常;
或,当所述异常类型标识对应的异常类型与能处理的至少一种异常类型 中的一种异常类型匹配时, 由与该异常类型匹配的异常处理程序处理该异 常, 其中, 能处理的至少一种异常类型可以是数组指定的类型, 或者是异常 区间内的类型;
或, 当存在能处理任何类型异常的异常处理程序时, 确定由该匹配任意 类型异常的异常处理程序处理所述异常。
需要理解的是:在一种实现下, 可以由宏确定与所述异常类型标识对应 的异常类型所匹配的异常处理程序,这个宏的形式为 EXCEPT, 该宏可以带 有异常类型参数, 也可以不带有异常类型参数;
在该宏带有异常类型参数的情况下, 具体匹配过程可以包括:获得线程 异常信息 (即与异常相关的信息); 判断线程异常信息中的异常类型标识是 否与异常类型参数中的一种匹配; 如果匹配, 则执行相应的异常处理程序; 如果不匹配, 则重新传递 (抛出) 异常信息。
在该宏不带有异常类型参数的情况下, 任何类型的异常都将被相应异常处 理程序处理, 换句话说, EXCEPT宏一旦获得异常, 就交由与所述程序代码 片段位置最近的一个异常处理程序去处理异常,也就起到了捕捉所有类型异 常的作用。该宏不带有异常类型参数时,包括异常类型标识的异常信息还是 传递到 except块宏作处理,用户编写的异常处理程序可以不加区分的进行统 一处理。
本发明实施例的方法进一歩包括:如果当前不存在与该异常类型匹配的 异常处理程序时, 将获得的与异常相关的信息重新传递出去, 或者, 当都匹 配不上时, 启动默认处理程序, 所述默认处理程序为重启系统。
为了进一歩的提供对异常处理方式的精细管理,在本发明实施例中,根 据获得的所述异常, 确定相应的异常处理程序, 由所述异常处理程序处理所 述异常的歩骤, 在另一种实现下, 可以包括:
获得传递过来的与异常相关的信息,所述与异常相关的信息中包含异常 类型标识、指定处理方式标识; 需要说明的是: 可以通过不同的指定处理方 式标识表示不同的指定处理方式, 例如: 1表示容错的处理方式; 0表示查 错的处理方式。
确定与所述异常类型标识对应的异常类型所匹配,且与所述的指定处理 方式标识对应的处理方式所匹配的异常处理程序,由所述异常处理程序处理 所述异常。 其中, 处理方式可以为容错或查错。
当所述处理方式是容错处理方式,由容错方式的异常处理程序处理所述 异常; 当所述处理方式是查错处理方式, 由查错方式的异常处理程序处理所 述异常, 其中, 所述异常处理程序与所述程序代码片段相互独立。
如果当前不存在与该异常类型匹配,且与指定的处理方式匹配的异常处 理程序时, 将获得的与异常相关的信息重新传递出去, 或者, 当都匹配不上 时, 启动默认处理程序, 所述默认处理程序为重启系统。
因此, 本发明实施例不仅可以实现针对不同类型的异常进行不同的处 理,而且还能根据用户设置的方式对异常以不同的处理方式进行处理,例如, 在开发阶段,对异常的处理主要方法是捕获异常处理错误并输出错误,而在 开发完成产品发布时,异常处理的主要方法是容错恢复。本发明实施例中的 异常处理程序还能够匹配和处理多种类型的异常。
如果有多个与所述异常类型相匹配的异常处理程序,则确定与所述异常 类型标识对应的异常类型所匹配的异常处理程序的歩骤为:确定与所述异常 类型标识对应的异常类型所匹配的,且与所述程序代码片段位置最近的一个 异常处理程序。
如果所述程序代码片段被调用时出现异常,则由所述异常处理程序处理 所述异常之后, 还包括: 逐级返回所述程序代码片段正常运行后的结果, 或 者运行与所述异常处理程序相邻且在其之后的程序代码片段;从而进一歩提 高正常流程下的代码运行效率。
在一种实现下, 由匹配和捕捉异常功能的宏来匹配和捕捉异常; 由具有 监控功能的宏来监控正在运行的需要保护的程序代码片段;由具有抛出异常 功能的宏来抛出所述异常。
具体的,程序代码片段可以是指函数, 也可以是指由多个函数组成的模 块, 还可以是指由多个模块组成的部件, 当然, 程序代码片段还可以是其他 级别的程序段, 这里不再一一列举。 在嵌入式 C语言环境下, 可以由具有 监控功能的宏来监控程序代码片段, 例如可以由封装 C语言的 setjmp ( )函 数的宏。
当程序代码片段在运行过程中出现异常时, 需要抛出异常,而在抛出异 常之前, 可以记录与异常相关的信息, 这样, 抛出异常时, 可以抛出与异常 相关的信息。与异常相关的信息既可以包括软件异常信息, 也可以包括硬件 异常信息。 在嵌入式 C语言环境下, 可以由具有抛出异常功能的宏来抛出 异常, 例如可以由封装 C语言的 longjmp ( ) 函数的宏。
针对需要保护的程序代码片段,可以建立至少一个异常处理程序。每个 异常处理程序可以匹配和处理一种类型的异常,也可以匹配和处理多种类型 的异常。不同的异常处理程序可以处理同一种类型的异常,当异常被抛出时, 可以从中选择一个异常处理程序来处理这种类型的异常,例如, 可以选择一 个与所述程序代码片段最近的一个异常处理程序处理所述异常。具体的,假 设某个程序代码片段之后分别有程序 A、 程序 B和程序 C等能够处理同一 个异常的异常处理程序, 当程序代码片段抛出异常时, 如果没有特殊设置, 则一般都由程序 A (在程序代码片段之后,在所有的能够处理所述异常的异 常处理程序中位置相对于该程序代码片段最靠前) 来处理所述异常。
需要说明的是,异常处理程序与程序代码片段是相互独立的,这样至少 有两个优点:第一个优点是,程序代码片段在运行过程中如果没有出现异常, 则异常处理程序不会被执行,从而不影响程序代码片段的正常运行,客观上 也提高了程序代码片段的运行效率;第二个优点是, 可以给用户提供是否由 异常处理程序来处理异常或者由哪种异常处理程序来处理异常的选择。
在实际应用中,程序代码片段可能是在被调用过程中出现异常, 由与所 述异常的类型相匹配的异常处理程序处理所述异常之后,可以逐级返回的是 程序代码片段正常运行后的结果。 例如, 函数 A调用函数 B, 函数 B调用 函数 C,如果函数 C在运行时发生异常,并且存在与异常的类型相匹配的异 常处理程序, 则可以由异常处理程序处理异常, 处理异常后, 函数 C可以 正常运行, 其正常运行的结果可以返回给函数 B, 函数 B再将函数 B的运 行结果返回给函数 A。 由此可见, 即使函数 B调用函数 C时, 函数 C运行 出现异常, 但对于函数 A和函数 B来说, 这个或这些异常都是不被发现的, 函数 A和函数 B得到的分别是函数 B正常运行的结果和函数 C正常运行的 结果。另外,由与所述异常的类型相匹配的异常处理程序处理所述异常之后, 也可以运行所述异常处理程序之后的程序代码片段。 还是以上面的例子为 例, 即使由异常处理程序处理异常, 但不再返回执行函数 C, 而是执行后续 的程序代码片段,后续的程序代码片段可以是指与异常处理程序相邻且在其 位置之后的程序代码片段,也可以是指异常处理程序之后的任意一个程序代 码片段。
在嵌入式 C语言环境下, 可以由由用 C语言实现的具有匹配和捕捉异 常功能的宏来匹配和捕捉异常, 例如可以由封装 C语言的 setjmp ( )函数被 调用后返回非 0值的 else分支的宏。
其中的一种嵌入式 C语言环境下异常处理装置 (也可以称为异常处理 框架) 如图 2所示, 包括:
监控单元 201, 用于监控正在运行的需要保护的程序代码片段; 异常抛出单元 202, 用于在监控单元 201发现所述程序代码片段出现异 常后, 抛出所述异常, 所述异常包括软件异常、 硬件异常中的至少一种; 匹配单元 203, 用于根据获得的所述异常, 确定对应的异常处理程序, 所述异常处理程序用于处理所述异常抛出单元抛出的异常, 其中,所述异常 处理程序与所述程序代码片段相互独立。
在嵌入式 C语言环境下, 将具有监控功能的宏模块化即监控单元, 例 如可以是封装 C语言的 setjmp ( ) 函数的宏。
另外, 上述装置还可以包括:
信息记录单元 204, 用于记录与监控单元 201发现的所述程序代码片段 出现的异常相关的信息, 并输出给所述异常抛出单元 202。 这样, 异常抛出 单元 202在抛出异常时, 可以抛出与异常相关的信息。与异常相关的信息既 可以包括软件异常信息, 也可以包括硬件异常信息。 在 C语言环境下, 将 具有抛出异常功能的宏模块化即异常抛出单元 202,例如可以是封装 C语言 的 longjmp ( ) 函数的宏。
异常抛出单元 202为第一异常抛出单元,用于在监控单元 201发现所述 程序代码片段出现异常后,将所述与异常相关的信息打包后传递出去,所述 与异常相关的信息至少包括异常类型标识,所述异常类型标识用于表示当前 程序代码片段出现的异常的类型。
匹配单元 203为第一匹配单元, 用于获得传递过来的与异常相关的信 息,所述与异常相关的信息中包含异常类型标识, 并确定与所述异常类型标 识对应的异常类型所匹配的异常处理程序,由所述异常处理程序处理所述异 常。
匹配单元 203为第二匹配单元, 用于获得传递过来的与异常相关的信 息, 所述与异常相关的信息中包含异常类型标识、指定处理方式标识, 并确 定与所述异常类型标识对应的异常类型所匹配,且与所述的指定处理方式标 识对应的处理方式所匹配的异常处理程序,由所述异常处理程序处理所述异 常。例如, 可以设置函数级别的异常处理程序, 也可以设置模块级别的异常 处理程序,还可以设置部件级别的异常处理程序,假设对应这三个级别的异 常处理程序都能够处理同一个类型的异常,但处理方式各不相同。用户可以 选择处理异常的级别,假设用户选择了模块级别,其对应的异常处理程序的 处理方式是容错处理, 当需要保护的程序代码片段在运行过程中出现异常, 则处理异常的就是模块级别对应的异常处理程序, gp,对异常采取容错方式 处理。
处理方式可以包括容错和查错等多种方式, 当程序代码片段出现异常 时, 可以根据设置的处理方式处理异常。例如, 如果设置的处理方式是容错 处理方式, 则可以使用容错方式的异常处理程序处理异常。再例如, 如果设 置处理方式是查错处理方式, 则可以使用查错方式的异常处理程序处理异 常, 其中, 异常处理程序与程序代码片段相互独立。
如果有多个与所述异常的类型相匹配的异常处理程序, 匹配单元 203 为第三匹配单元,用于根据获得的所述异常, 确定与所述异常的类型所匹配 的, 且与所述程序代码片段位置最近的一个异常处理程序, 由所述异常处理 程序处理所述异常。
在一程序执行触发异常时, 监控单元 201为第一监控单元, 用于根据设 置的处理异常的粒度监控所述正在运行的需要保护的程序代码片段。 例如: 当设置的处理异常的粒度为模块级别时,而所述正在运行的需要保护的程序 代码片段是函数级别,则就不需要监控所述正在运行的需要保护的程序代码 片段; 当设置的处理异常的粒度为函数级别时,而所述正在运行的需要保护 的程序代码片段是模块级别,则监控所述正在运行的需要保护的程序代码片 段; 针对需要保护的程序代码片段, 可以建立至少一个异常处理程序。每个 异常处理程序可以匹配和处理一种类型的异常,也可以匹配和处理多种类型 的异常。
不同的异常处理程序可以处理同一种类型的异常, 当异常抛出单元 202 抛出异常时,可以由匹配单元 203从中选择一个异常处理程序来处理这种类 型的异常,例如, 可以选择一个与所述程序代码片段最近的一个异常处理程 序处理所述异常。
在实际应用中,程序代码片段可能是在被调用过程中出现异常,在匹配 单元 203确定与所述异常的类型相匹配的异常处理程序,由该异常处理程序 处理所述异常之后,程序代码片段可以逐级返回正常运行后的结果。在嵌入 式 C语言环境下, 将由 C语言实现的具有匹配和捕捉异常功能的宏模块化 即匹配单元 203, 例如可以是封装 C语言的 setjmp ( ) 函数被调用后返回非 0值的 else分支的宏。
需要说明的是, 由于不同的异常处理程序可以适用于不同的异常, 为方 便识别异常类型, 可以给不同的异常类型分配不同的标识, 例如: 将异常统 一分成 a、 b、 c、 d、 e、 f (小类), 并且同时用另一个标识区分哪些是软件 异常, 哪些是硬件异常 (大类), 例如: 1表示软件异常; 0表示硬件异常。 具体的,如图 3所示,首先获得传递过来的与异常相关信息(简称异常信息), 该异常信息中包含异常类型标识, 经过宏的匹配,确定与该异常类型标识对 应的异常类型匹配的异常处理程序,由相应的异常处理程序处理相应的异常 类型的异常。
除上述方法实施例和异常处理框架实施例外,本发明还提供了嵌入式系 统, 所述系统包括上述异常处理装置 (即异常处理框架)。 具体请参见上述 对异常处理框架的描述, 这里不再赘述。
除上述方法实施例外, 本发明还提供了另外一个方法实施例。 具体的, 如图 4所示, 包括:
歩骤 S401 : 执行程序代码;
歩骤 S402: 判断是否触发异常, 如果是, 则转歩骤 S403 , 否则, 转歩 骤 S401 ;
歩骤 S403 : 根据处理异常的粒度, 确定与粒度对应的 try块(为描述方 便, 这里用 try块表示具有监控功能的宏);
歩骤 S404: 判断 try块是否有 except块 (为描述方便, 这里用 except 块表示具有捕捉和匹配异常功能的宏), 如果是, 转歩骤 S406, 否则, 转歩 骤 S405;
歩骤 S405: 确定更高一级粒度对应的 try块, 转歩骤 S404;
歩骤 S406: 判断 except块是否能够处理异常, 如果是, 转歩骤 S407 , 否则, 转歩骤 S405 ;
歩骤 S407: 执行 except块的代码, 转歩骤 S401。
本发明实施例首先在嵌入式 C语言环境下建立异常记录信息, 建立异 常相关信息的存储和传递模型, 最终实现异常关联的机制和用户接口。 1.关于异常记录信息
表 1为异常记录信息的一种表现形式。
Figure imgf000016_0001
表 1
在嵌入式 C语言环境下, 为了实现异常处理, 需要定义异常记录结构, 将异常信息保存在该结构中, 传递给 except块, except块可以根据异常记录 信息来决定处理的方式。 异常记录信息如下列代码中的注释所示:
typedef struct _VOS_SEH_REC //异常记录信息
VOS— UINT32 ulSehType; //定义的硬件或软件异常类型
VOS— UINT32 ulSehErrOrlntCode; //软件异常情况下为错误码信息, 硬 件异常情况下标识是否在中断中异常
VOS— UINT32 ulSehFlag; //异常是否可继续的标识
struct _VOS_SEH_REC *pSehNextRec; //记录异常处理过程中嵌套的 异常
VOS—EXC— REG— INFO *pExcRegs; //ulSehType为硬件异常时其指向 CPU寄存器信息记录,软件异常时为空
VOS— UINT32 ulSehAddr; //发生异常的指令地址
VOS— UINT32 ulSehParaNums; //异常附加参数数目
VOS— UINT32 a_SehInfo[EXC_MAX_PARA_NUM];〃异常附加参数信 息
VOS_CHAR scSehMsg[32]; //异常描述字符串 } VOS_SEH_REC;
2: 关于异常相关信息的存储和传递模型
在嵌入式 C语言环境下, 为支持异常嵌套处理和对多线程异常的处理, 需要存储异常相关信息,并根据其生命周期的特点选择适当的存储和传递模 型。 异常相关信息包括: (1 ) 每个 try块保存其运行上下文环境的 env信息 (info); (2)发生异常后的异常记录信息(即前面定义的 VOS— SEH— REC); (3 ) 各线程的异常状态控制表。
从具有抛出异常功能的宏到具有匹配和捕捉异常功能的宏的信息采用 线程范围的栈来存储和传递, 其中, env信息所需存储空间需要满足 try块 最大嵌套层次的深度,而异常记录信息存储空间则需要满足一次嵌套的最大 深度, 因此, 可以考虑以线程为单位, 在线程创建后, 分配线程堆空间来存 储异常相关信息, 存储布局示意可以参照图 5。
env信息是各线程正常运行期间高度动态的信息,每个线程都保留一份。 exc信息 (mfo) 则只在线程运行异常情况下才出现, 各线程间可以共享使 用。
env信息把所有可回溯的环境记录串联起来形成异常范围表, 在 throw 块(为描述方便, 这里用 throw块表示具有抛出异常功能的宏)操作时通过 访问该表来获得相匹配的 except块,该表存储单元需记录的信息如表 2所示:
Figure imgf000017_0001
表 2
具体的数据结构如下:
typedef struct—SEH— SCOPE— UNIT〃异常范围表
VOS— BOOL bllntFlag; //是否在中断背景下设置标志 #ifdef SEH— DEBUG //异常调试
VOS— CHAR *pSehSetFile; //设置异常的文件
VOS_UINT32 ulSehSetLine;//设置异常的行号
#endif
struct—SEH— SCOPE— UNIT *seh— next; //记录链表
} SEH— SCOPE— UNIT;
exc信息把异常记录信息记录下来, 在 throw块 (相当于上述装置中的 异常抛出单元)操作时,将该结构做为信息参数传递给相匹配的 except块 (相 当于上述装置中的匹配单元)来处理, 如果其中发生异常嵌套, 则将信息进 行串联。 需记录的信息如表 3所示: 信息有效标志 异常记录信息
表 3 具体数据结构如下:
typedef struct—SEH— EXC— INFO
VOS— UINT32 ulMagic; //信息有效标志
VOS— SEH— REC seh rec; //异常记录
} SEH— EXC— INFO;
各线程间共享的 SHE EXC INFO缓冲区分配控制信息表如表 4所
Figure imgf000018_0001
表 4 具体数据结构如下:
typedef struct—SEH— INFO— BUF— CTRL〃缓冲区分配控制信息表
VOS— UINT32 ulMaxExcInfoNum; //异常最大信息块数
VOS UINT32 ulUsedExcInfoNum; //已分配信息块数 SEH— EXC— INFO *pExcInfoBufFreeLink; //空闲异常信息块链表
} SEH— INFO— BUF— CTRL;
在线程创建成功后,分配的异常状态控制表(exc Ctrl)信息如表 5所
Figure imgf000019_0001
具体数据结构如下:
typedef struct— SEH— TH— CTRL
/*控制信息 */
VOS_UINT32 ulMaxScopeLayer; //线程 try块最大嵌套层数
VOS— UINT32 ulMaxExcNestNum; //线程异常最大嵌套层数
SEH SCOPE U IT *pScopeUnitFreeLink; //空闲范围块链表
/*状态信息 */
VOS— UINT32 ulExceptNestCnt; //线程异常嵌套记数
VOS— UINT32 ulSehStatusFlag; //线程异常当前状态
SEH_EXC_INFO *pSehExdnfo; //异常现场信息地址
SEH SCOPE UINT *PScopeTableHead; //异常范围链表头
} SEH TH CTRL;
其中, ulSehStatusFlag标志有六种状态, 分别是: SEH— STAT— NON (无 异常情况下的初始值必须为 0), SEH STAT U HANDLE (未处理异常), SEH STAT HANDLED (已处理), SEH STAT CONTINUE SEARCH (继 续回溯异常处理块), SEH— STAT— CONTINUE— REDO (从异常处重新执行) 和 SEH— STAT— RESTART (重启进程或单板)。
对线程异常范围表以单向链表方式组织,按栈序操作,本发明实施例提 供如下功能的接口函数: VOS— UINT32 SEH ScopeTablePush (SEH— SCOPE— UINT
*pScopeTableHead, SEH SCOPE UINT *pSehScopeUnit); //异常范围表压栈
SEH— SCOPE— UINT * SEH_ScopeTablePop(SEH_SCOPE_UINT
*pScopeTableHead); //异常范围
//出栈
VOS— BOOL SEH— ScopeTableIsEmpty(SEH— SCOPE— UINT
*pScopeTableHead); //判断异常范围表
//是否为空
对线程异常信息缓冲表的申请释放可提供如下接口功能函数:
SEH_EXC_INFO * SHE_ExcInfoBufAlloc(); //申请线程异常信息缓冲表
VOS UINT32 SEH_ExcInfoBufFree(SEH_EXC_INFO *pSehExcInfo); II 释放线程异常信息缓冲表
3.关于异常处理流程的实现和用户接口设计
标准 C库中提供的 se jmpG、 longjmpG函数可以提供非本地局部跳转的 机制。 在嵌入式 C语言环境下, 不依赖编译器实现异常关联机制, 可以采 用 setjmp的封装来实现 try块, 并在识别异常后调用 longjmp来提供 throw 块, except块则是 setjmp调用后返回非 0值的 else分支。
一、 线程异常状态控制表的构造
为实现上述接口, 首先需要构造线程异常状态控制表。各线程共享异常 信息控制块在系统初始化阶段从系统堆空间申请, 保存在指向结构
SEH— INFO— BUF— CTRL的指针 g_pSehInfoBufCtrl中。
在 VxWorks下,任务创建成功后,申请系统堆空间保存 SEH— TH— CTRL, 使用 taskVarAdd将指向 SEH— TH— CTRL的指针 g_pSehThCtrl内容保存在任 务变量中, 在 try块中可通过局部变量访问 g_pSehThCtrl, 其值由 VxWorks 切换, 同时将该堆空间记录在系统任务资源总表中。
在 Linux下, 使用 pthread— key— create创建 key句柄, 并保存在 key句柄 指针 g_pThKey中,线程创建成功后, 申请系统堆空间保存 SEH— TH— CTRL, 调用 pthread— setspecific完成指向 SEH— TH— CTRL的指针 g_pSehThCtrl内容 保存, 在 try块中通过局部变量保存 pthread— getspecific的返回值(该线程的 g_pSehThCtrl内容)来操作本线程的异常状态控制表, 同时将该堆空间记录 在系统线程资源总表中。
当本任务或线程自动退出时, 对 g_pSehThCtrl指向的系统堆空间进行 释放; 当删除其他任务或线程时,对记录在系统资源总表中的其他任务或线 程资源进行释放。
二、 try块的设计
try块的实现流程如图 6所示, 包括:
歩骤 S601 : 开始执行 try块宏;
歩骤 S602:判断所述 try块对应的粒度是否小于设置的处理异常的粒度, 如果是, 转歩骤 S608, 否则, 转歩骤 S603;
歩骤 S603: 获得当前线程异常状态控制表的地址, 转歩骤 S604;
歩骤 S604: 从线程异常状态控制表的空闲范围块链表中申请一个 Unit 块, 转歩骤 S605;
歩骤 S605: 初始化 Unit块的 bilntFlag, 将 Unit块压入线程异常范围链 表, 初始化异常状态控制表的相关项, 转歩骤 S606;
歩骤 S606: 调用 setjmpO函数, 转歩骤 S607;
歩骤 S607: 判断是否返回 0, 如果是, 则转歩骤 S608, 否则, 转歩骤 S609;
歩骤 S608: 正常处理, 转歩骤 S610;
歩骤 S609: 异常处理, 转歩骤 S610;
歩骤 S610: 结束执行 try块宏, 转歩骤 S611 ;
歩骤 S611 : 判断是否需要回溯, 如果是, 则转歩骤 S612, 否则, 转歩 骤 S613; 歩骤 S612: 重新抛出异常;
歩骤 S613: 判断是否需要复位, 如果是, 则转歩骤 S614, 否则, 转歩 骤 S615;
歩骤 S614: 重新启动进程或单板处理;
歩骤 S615: 判断是否恢复执行, 如果是, 转歩骤 S616, 否则, 转歩骤
S617;
歩骤 S616: 根据 CPU特点执行异常恢复操作;
歩骤 S617: try块结束处理。
需要说明的是,歩骤 S608和 S609 (即图中虚线部分)为用户处理代码, SP ,用户需要进行的流程,例如需要保护的程序代码片段等正常的程序代码。
具体的, try块从线程异常状态控制表的空闲范围块链表中可以动态申 请一个记录单元, 如果超过线程 try块最大嵌套层数 ulMaxScopeLayer, 则 触发系统默认异常处理。 正常情况下, 经过少量初始化操作后, 将其压入 (push)到线程异常范围链表中, 然后在 if语句中调用 setjmp, 对应用程序 的正常处理流程代码形成监控,当被监控的代码片段中有硬件或软件异常抛 出时, 该程序能够恢复到由此 setjmp保存的执行点。 为区分 setjmp的返回 值是第一次调用 (0值), 还是 longjmp调用的返回 (非 0值), 用线程异常 状态控制表中的 ulSehStatusFlag记录, 当返回非 0时, 表示当前异常处理状 态, 其含义为, 匹配该 try块的 except块是否被找到, 或者需要进一歩回溯, 或者从异常处重新执行, 或者需要复位进程或复位单板。 此外, try块的实 现还需要考虑对异常处理级别的精细管理进行支持。
try块的流程可以通过如下方式实现:
#define SEH— TRY— BEG(SEH— level) \ VOS_INT32 ulSehStatusFlag = 0;\
if(SEH_Level>=SEH_HANDLE_LEVEL)\ 异常框架的精细控 制
SEH— SCOPE— UINT *_try_pSehScopeUnit; \
SEH— TH— CTRL *_try__pSehThCtrl; \
_try_pSehThCtrl =当前线程状态控制表地址 \
_try_pSehScopeUnit =从线程空闲范围块链表申请一个 Unit块 \ 根据当前是否在中断中初始化 Unit块 bllntFlag标志 \
调用 SEH— ScopeTablePush将 Unit压入线程异常范围表 \
初始化异常状态控制表状态信息为无异常状态 SEH— STAT— NON \ _try__pSehThCtrl->pSehExcInfo = VOS NULL PTR;
ulSehStatusFlag=一 try _ SehThCtrl->ulSehStatusFlag=setjmp( _ try _ Se h-ScopeUnit->seh_env); if (0 = = ulSehStatusFlag) \
{ —这个正向大括号是对 try块中正常流程代码作用域的引导 try块的实现需要做到不依赖于编译器, 无法通过编译器的文法识别来 找到 try块的结束点并自动添加结束代码, 因此, 需要设计一个由应用程序 调用的 SEH— TRY— END, 来完成 try块的结束处理, 完成对异常状态的清除 处理。
#define SEH— TRY— END \
if(SEH— STAT— CONTINUE— SEARCH/*需要进一歩回溯 */ \
= = _try__pSehThCtrl->ulSehStatusFlag) \
SEH RETHROW0; \
} \
else \ SEH_ExcInfoBufFree( _ try _ SehThCtrl->pSehExcInfo); if (SEH— STAT— RESTART/*需要复位进程或单板 */ = =
_try__pSehThCtrl->ulSehStatusFlag) \ 重启进程或单板处理 \
} \
else if (SEH— STAT— CONTINUE— REDO/*需要从异常指令处恢复执行 */ = = _try_pSehThCtrl->ulSehStatusFlag) \ 根据 CPU体系特点执行异常恢复操作 \
} \
} \
}\—这个反向大括号是对 except块中异常处理方式精细管理的作用 域的关闭
} \—这个反向大括号是对 except块作用域的关闭
/*没有执行到任何 except块, 表明无异常发生 */ \
if (0 = = _try__pSehThCtrl->ulSehStatusFlag) \ 调用 SEH— ScopeTablePop将 Unit弹出线程异常范围表 \
将 Umt块释放回线程异常状态控制表中的线程空闲范围块链表 \
} \
} \
}——这个反向大括号是对整个 try块异常框架作用域的关闭
三、 except块的设计
在 try块之后,需要提供 except块的机制,它实际上就是 SEH— TRY— BEG 封装的 if语句配对的 else分支, 可以对 throw块抛出的异常类型进行处理, 同时支持异常处理方式的精细处理。 具体实现流程如图 7所示, 包括: 歩骤 S701: 开始执行 except块宏;
歩骤 S702: 关闭正常处理分支的作用域或前一个异常处理方式的作用 域;
歩骤 S703: 判断是否是当前异常处理方式, 如果是, 转歩骤 S704, 否 贝 |J, 转歩骤 S708;
歩骤 S704: 将 Unit块弹出线程异常范围表;
歩骤 S705: 将 Umt块释放到线程异常状态控制表的空闲范围块链表; 歩骤 S706: 设置异常已处理的状态;
歩骤 S707: 执行异常处理程序代码, 这里的, 异常处理程序代码即异 常处理代码;
歩骤 S708: 转下一个异常处理方式的 except块或者结束异常处理。 封装代码如下:
#define SEH EXCEPT(method) \
} \—这个反向大括号是对 try块中正常流程代码作用域或前一异常 处理方式作用域的关闭
else \ if(method = = EXCEPTION HANDLE METHOD) { \——异常处理方 式的精细控制
调用 SEH— ScopeTablePop将 Unit弹出线程异常范围表 \
将 Umt块释放回线程异常状态控制表中的线程空闲范围块链表 \ _try_pSehThCtrl->ulSehStatusFlag = SEH— STAT— HANDLED; \ SEH— EXCEPT可以实现对任意类型异常的捕捉, 为支持对异常类型的 过滤, 即捕获特定类型的异常, 本发明实施例进一歩提供三种格式的封装。
( 1 ) 捕捉某种特定异常 实现流程如图 8所示, 包括:
歩骤 S801: 开始执行 except块宏;
歩骤 S802: 关闭正常处理分支的作用域或前一个异常处理方式的作用 域;
歩骤 S803: 判断是否是当前异常处理方式, 如果是, 转歩骤 S804, 否 则, 转歩骤 S810;
歩骤 S804: 将 Unit块弹出线程异常范围表;
歩骤 S805: 判断是否匹配异常类型, 如果是, 转歩骤 S807, 否则, 转 歩骤 S806;
歩骤 S806: 重新抛出异常;
歩骤 S807: 将 Umt块释放到线程异常状态控制表的空闲范围块链表; 歩骤 S808: 设置异常已处理的状态;
歩骤 S809: 执行异常处理程序代码;
歩骤 S810: 转下一个异常处理方式的 except块或者结束异常处理。
实现代码如下:
#define SEH— EXCEPT— ONE(seh— type, method) \
} \
else \ if(method = = EXCEPTION— HANDLE— METHOD) { \
调用 SEH— ScopeTablePop将 Unit弹出线程异常范围表 \
将 Umt块释放回线程异常状态控制表中的线程空闲范围块链表 \ if (seh type = = _ try _ SehThCtrl->pSehExcInfo->seh_rec.ulSehType) \
_try_pSehThCtrl->ulSehStatusFlag = SEH— STAT— HANDLED; \
} \
else \ SEH RETHROW0; /*重抛异常 *八
} \
(2) 捕捉处理指定异常
实现流程如图 9所示, 包括:
歩骤 S901: 开始执行 except块宏;
歩骤 S902: 关闭正常处理分支的作用域或前一个异常处理方式的作用 域;
歩骤 S903: 判断是否是当前异常处理方式, 如果是, 转歩骤 S904, 否 贝 ij, 转歩骤 S910;
歩骤 S904: 将 Unit块弹出线程异常范围表;
歩骤 S905: 判断是否匹配数组指定的异常类型, 如果是, 转歩骤 S907, 否则, 转歩骤 S906;
歩骤 S906: 重新抛出异常;
歩骤 S907: 将 Umt块释放到线程异常状态控制表的空闲范围块链表; 歩骤 S908: 设置异常已处理的状态;
歩骤 S909: 执行异常处理程序代码;
歩骤 S910: 转下一个异常处理方式的 except块或者结束异常处理。
实现代码如下:
#define SEH— EXCEPT— VAR(seh— type— num, seh_type_array,method) \ else \ if(method = = EXCEPTION— HANDLE— METHOD) {\
调用 SEH_ScopeTablePop将 Unit弹出线程异常范围表 \
将 Umt块释放回线程异常状态控制表中的线程空闲范围块链表 \ if (异常现场信息中 ulSehType与 seh— type— array中的类型匹配) \
{\
_try_pSehThCtrl->ulSehStatusFlag = SEH— STAT— HANDLED; \
} \
else \
SEH RETHROWO; \
(3 ) 捕捉和处理某一异常区间内的异常
实现流程如图 10所示, 包括:
歩骤 S1001: 开始执行 except块宏;
歩骤 S1002:关闭正常处理分支的作用域或前一个异常处理方式的作用 域;
歩骤 S1003 : 判断是否是当前异常处理方式, 如果是, 转歩骤 S1004, 否则, 转歩骤 S1010;
歩骤 S1004: 将 Unit块弹出线程异常范围表;
歩骤 S1005: 判断是否匹配异常区间内的异常类型, 如果是, 转歩骤 S1007, 否则, 转歩骤 S1006;
歩骤 S1006: 重新抛出异常;
歩骤 S1007: 将 Umt块释放到线程异常状态控制表的空闲范围块链表; 歩骤 S1008: 设置异常已处理的状态;
歩骤 S1009: 执行异常处理程序代码;
歩骤 S1010: 转下一个异常处理方式的 except块或者结束异常处理。 实现代码如下:
#define SEH— EXCEPT— IN(seh— type— min, seh_type_max,method) \ else \ if(method = = EXCEPTION— HANDLE— METHOD) {\
调用 SEH— ScopeTablePop将 Unit弹出线程异常范围表 \
mt块释放回线程异常状态控制表中的线程空闲范围块链表 \
if异常现场信息中 ulSehType与 seh— type— min/max区间的类型匹配) \
{\
_try_pSehThCtrl->ulSehStatusFlag = SEH— STAT— HANDLED; \
} \
else \
SEH_RETHROW();\
} \
此外,本发明实施例还在 except块中提供给应用层做进一歩处理的相关 操作宏接口如下:
( 1 ) 获得异常记录信息
#define SEH GET RECORD(pSehRec) \
((pSehRec) = &( _ try _ SehThCtrl->pSehExcInfo.seh_rec))
(2) 获得异常类型
#define SEH— GET— TYPE(SehType) \
((SehType) = _ try _ SehThCtrl->pSehExcInfo.seh_rec.ulSehType)
(3 ) 设置异常嵌套层数
#define SEH— GET— NEST— COU T(NestCount) \
(NestCount) = _try__p SehThCtrl->ulExceptNestCnt
(4) 设置异常处理状态
#define SEH— SET— STATUS(SehStatus) \
_try_pSehThCtrl->ulSehStatusFlag = (SehStatus) 四、 throw块的设计
调用 throw的地方有两处, 一处是在系统捕获硬件异常时, 调用 throw 块, 将异常通知到 except块, 另一处则是 try中的函数主动调用 throw抛出 软件异常。对这两种情况, 这里提供统一的抛出操作, gP, 获得线程异常范 围表中位于栈顶的存储单元 (但不弹出), 对单元内容进行赋值, 可通过函 数 SEH— Throwlnner实现。
实现流程如图 11所示, 包括:
歩骤 S1101 : 执行 Throwlnner ( ) 函数;
歩骤 S1102: 判断参数是否合法, 如果是, 则转歩骤 S1103 , 否则, 转 歩骤 S1112;
歩骤 S1103 : 获取当前线程异常状态控制表的地址;
歩骤 S1104: 获得线程异常范围链表的栈顶存储单元;
歩骤 S1105: 判断是否有匹配的 try块和 except块, 如果是, 则转歩骤 S1106, 否则, 转歩骤 S1112;
歩骤 S1106: 判断是否有共享异常信息缓存或者抛出的异常记录是否是 异常现场记录, 如果是, 转歩骤 S1107 , 否则, 转歩骤 S1111 ;
歩骤 S1107: 分配共享异常信息缓存;
歩骤 S1108: 判断是否有缓存, 如果是, 则转歩骤 S1109, 否则, 转歩 骤 S1112;
歩骤 S1109: 初始化缓存, 设置未处理异常标志;
歩骤 S 1110: 执行 except块代码;
歩骤 S1111 : 设置异常处理标志;
歩骤 S1112: 进行默认的异常处理。
实现代码如下:
void SEH_ThrowInner(VOS_SEH_REC *pSehRec) SEH— SCOPE— UINT *pTempUnit;
SEH— EXC— INFO *pInfoBuf;
SEH— TH— CTRL *pSehThCtrl;
VOS— UINT32 ulSehStatusFlag;
if (VOS— NULL— PTR == pSehRec) 参数非法, 按系统默认异常处理 pSehThCtrl =当前线程状态控制表地址
pTempUnit = SEH_ScopeTableTop(pSehThCtrl->pScopeTableHead); if (VOS_NULL_PTR == pTempUnit) 表明没有 try-except块, 按系统默认异常处理 if ( (VOS— NULL— PTR == pSehThCtrl->pSehExdnfo)
II (pSehRec! = & (pSehThCtrl->pSehExcInfo->seh— rec》 plnfoBuf = SEH ExcInfoBufAllocO;
if (VOS— NULL— PTR == plnfoBuf)
{
表明无共享异常信息缓存, 按系统默认异常处理 pSehThCtrl->ulExceptNestCnt = 1;
pSehThCtrl->pSehExcInfo = plnfoBuf;
对 *pInfoBuf内容进行初始化
plnfoBuf -〉 seh—rec.ulSehType = pSehRec->ulSehType;
plnfoBuf的其他赋值操作 ...
ulSehStatusFlag = SEH STAT U HANDLE; else ulSehStatusFlag = pSehThCtrl->ulSehStatusFlag;
}
/* longjmp第二个参数用于将异常处理状态信息回传给
pSehThCtrl->ulSehStatusFlag */
longjmp(pTempUnit->seh_env, ulSehStatusFlag); 对程序抛出的软件异常情况,大多数硬件异常信息可以屏蔽。简化后的 宏封装接口首先初始化抛出的异常记录信息, 然后调用 SEH— Throwlnner函 数, 实现如下:
#define SEH_THROW(SehType, SehErrCode, SehMsg) \ VOS— SEH— REC tmpSehRec; memset(&tmpSehRec, 0, sizeof(tmpSehRec));
tmpSehRec. ulSehType = SehType;
tmpSehRec. ulSehErrOrlntCode = SehErrCode;
strncpy(tmpSehRec.stSehMsg, SehMsg, 31);
tmpSehRec.stSehMsg[31] = 0;
SEH_ThrowInner(&tmpSehRec);
对于当前 excpet块无法处理的情况, 前面已在 SEH— EXCEPT— ONE、
SEH— EXCEPT— VAR和 SEH— EXCEPT— IN的情况下描述, 将
pSehThCtrl->ulSehStatusFlag设置为需要进一歩回溯状态
SEH— STAT— CONTINUE— SEARCH后执行 rethrow,重新抛出接口实现如下: #define SEH_RETHROW() \
SEH_ThrowInner( & (pSehThCtrl->pSehExcInfo->seh_rec) )
五、 框架精细管理的实现
对框架的精细管理有两个方面。一方面提供对异常抛出时处理模块级别 的精细管理, 另一方面提供对异常处理方式的精细管理。
( 1 ) 异常抛出时处理模块级别的精细管理
代码抛出异常时, 可以根据精细程度查找 try块, 为此定义宏
SEH— HANDLE— LEVEL, 用户通过配置该宏可以保存期望的异常处理框架 的精细度。该宏的值默认为 FUNC— LEVEL (函数级)。用户可以根据需要将 该宏的值配置为 MODULE— LEVEL或者 COMPONENT— LEVEL。
用户在设置 try块保护代码时, 同时可以指定 try块的配置级别
SEH LeveL 在 try块的设计中, 可以看到, 当
SEH—Level>=SEH— HANDLE— LEVEL时, 框架中代码抛出异常时相应的 try 块才被识别。 因此, 在开发的不同阶段, 用户只需要配置
SEH— HANDLE— LEVEL, 就可以对异常处理框架的精细度进行控制。 例如, 用户在调试阶段设置 SEH— HANDLE— LEVEL为 FUNC— LEVEL (函数级别), 所有 try块均可被识别; 当代码稳定后, 用户设置 SEH— HANDLE— LEVEL 为 FUNC— LEVEL为 MODULE— LEVEL,则代码在抛出异常时只识别模块级 的异常。
框架对配置的异常处理级别的判断和支持在 try块中实现, 其实现和流 程在 try块的设计和图 8中已做了说明。
(2 ) 异常处理方式的精细管理
用户在嵌入式 C语言环境下开发的不同阶段, 对异常的处理会有不同 的处理方式。例如, 在开发阶段, 对异常的处理主要方法是捕获异常处理错 误并输出错误,而在开发完成产品发布时,异常处理的主要方法是容错恢复。 因此, 异常处理的精细管理为用户提供框架, 使得用户在不同阶段编写异常 处理代码时, 不需要覆盖以前的代码而只是简单的指定处理方式, 针对不同 的处理方式编写不同的异常处理代码。
为此, 可以设置宏 EXCEPTION— HANDLE— METHOD保存用户当前的 处理方式, 在 except块捕获异常时, 指定处理方式 method
(EXCEPTION— CHECK、 EXCEPTION— TOLARENT以及其他用户定义的方 式) method与当前的处理方式 EXCEPTION— HANDLE— METHOD相同的 except块才能处理对应 try块的异常。 用户可按照如下方式使用异常处理框 架:
SEH TRY BEG ( SEH level)
SEH THROW }
SEH— EXCEPT (methodl ) 处理方式 methodl对应的异常处理代码 SEH— EXCEPT (method2) 处理方式 method2对应的异常处理代码
SEH TRY END 对异常处理方法精细管理的支持实现和流程在 except块的设计部分和 图 9中已进行了描述。
(3 ) 异常处理框架的精细管理方法
实现流程如图 12所示, 包括:
歩骤 S1201: 执行保护程序代码的 try块;
歩骤 S1202: 判断当前级别是否不小于用户配置的级别, 如果是, 转歩 骤 S1203 , 否则, 转歩骤 S1209;
歩骤 S1203 : 执行需要保护的程序代码;
歩骤 S1204: 判断需要保护的程序代码是否抛出异常, 如果是, 转歩骤 S1205 , 否则, 转歩骤 S1203 ;
歩骤 S1205 : 确定对应的 except块;
歩骤 S1206: 判断是否符合用户设置的异常处理方式, 如果是, 转歩骤 S1207 , 否则, 转歩骤 S1208;
歩骤 S1207 : 执行异常处理程序代码;
歩骤 S1208: 转下一个异常处理方式, 转歩骤 S1206;
歩骤 S1209: 忽略当前 try块保护, 转歩骤 S1203。
具体的, 用户可以配置异常处理级别和异常处理手段。 例如, 遇到 try 块时, 首先判断当前 try块的级别是否不小于用户配置的异常处理级别, 如 果是, 则对代码进行保护, 否则, 忽略该 try块的保护机制。 对于 try块保 护的代码, 如果抛出异常, 则寻找对应的 except块, 如果找到的 except块 的处理手段与用户配置的处理手段相符, 则进行相应的异常处理, 否则, 寻 找相应的下一处理手段的 except块。
六、 用户接口及使用方法
本发明实施例提供了两类外部接口:一类是搭建异常框架的接口,包括 用于识别代码片段的 try块的接口 SEH— TRY— BEG和 SEH— TRY— END,用于 与代码片段匹配的异常处理程序 except块的接口 SEH— EXCEPT (匹配所有 异常)、 SEH— EXCEPT— ONE (匹配某一类异常)、 SEH— EXCEPT— VAR (匹 配异常类型可变) 和 SEH— EXCEPT— IN (匹配特定类型号区间的异常), 以 及用于抛出异常的 throw块的 SEH— THROW接口; 另一类是在异常处理框 架中, 为方便应用程序进一歩处理异常,或者根据需要更灵活的控制异常处 理流程所使用的处理接口,包括 SEH— GET— RECORD (获取异常记录信息)、 SEH— GET— TYPE (获取异常类型)和 SEH— SET— STATUS (设置异常处理状 态), 上述接口均以宏方式提供, 并在异常处理框架内部使用。 用户可在代 码中通过如下方式使用该异常处理框架:
SEH TRY BEG ( SEH level) //用户想要监控保护的代码
SEH_THROW(SehType, SehErrCode, SehMsg) //如果发生异常, 则将 其抛出
SEH EXCEPT (异常类型, mothodl )
SEH_GET_RECORD(/*获取异常记录 */);
if (硬件异常)
/*进一歩加工、 转储异常信息 */
app_exc_handle();
if (软件异常) /*进行全面的错误检查及错误信息上报 */
app_err_handle();
SEH— SET— STATUS (/*可设置为继续回溯异常、 从异常指令处恢复执 行、 复位进程
SEH EXCEPT (异常类型, mothod2)
... ... //其他异常处理方式定义的异常处理方法
SEH TRY END
本发明除提供上述异常处理方法外, 还提供了嵌入式 C语言环境下退 出线程或进程的方法和删除线程或进程的方法。
退出线程或进程的方法的实现流程如图 13所示, 应用于线程主动退出 的场景, 包括:
歩骤 S1301 : 获得线程或进程需要退出的信息。
歩骤 S1302:检查需要退出的线程或进程所抛出的异常是否仍然占用资 源, 如果是, 转歩骤 S1303 , 否则, 转歩骤 S1304;
歩骤 S1303 : 释放所述占用的资源;
歩骤 S1304: 退出所述线程或进程。
检查需要退出的线程或进程所抛出的异常是否仍然占用资源具体可以 包括: 检查需要退出的线程或进程是否已抛出异常; 如果是, 则检查已抛出 的异常是否仍然占用资源。
具体的, 可以为用户提供线程退出的接口操作 VOS— ExitThread, 该接 口函数在退出线程前, 首先检查当前线程是否有异常处理的资源尚未释放, 如果有, 则对 try块中抛出异常所占用的资源进行检查和释放, 之后执行退 出线程的操作。
其中的一种嵌入式 C语言环境下退出线程或进程的装置可以如图 14所 示, 包括: 信息获得单元 1401, 用于获得线程或进程需要退出的信息; 资 源检查单元 1402, 用于在信息获得单元 1401获得线程或进程需要退出的信 息后,检查需要退出的线程或进程所抛出的异常是否仍然占用资源; 资源释 放单元 1403, 用于在资源检查单元 1402检查出需要退出的线程或进程所抛 出的异常仍然占用资源, 则释放所述占用的资源; 线程或进程退出单元 1404, 用于在资源释放单元 1403释放所述占用的资源后, 退出所述线程或 进程。
删除线程或进程的方法的实现流程如图 15所示, 应用于当前线程或进 程被其他线程或进程删除的场景, 包括:
歩骤 S1501 : 确定需要删除的线程或进程。
歩骤 S1502:检查需要删除的线程或进程所抛出的异常是否仍然占用资 源, 如果是, 转歩骤 S1503 , 否则, 转歩骤 S1504;
歩骤 S1503 : 释放所述占用的资源;
歩骤 S1504: 删除所述线程或进程。
检查需要删除的线程或进程所抛出的异常是否仍然占用资源具体可以 包括: 检查需要删除的线程或进程是否已抛出异常; 如果是, 则检查已抛出 的异常是否仍然占用资源。
具体的, 若线程 1抛出异常后切换到线程 2, 线程 2需要执行对线程 1 的删除操作, 在本发明实施例中, 线程 2对线程 1中抛出的异常所占用的资 源进行处理后再删除线程 1。
在 Lmux下,线程 2删除线程 1是通过给线程 1发送信号实现的,因此, 可以在线程 1中注册信号的处理函数 handler中对已抛出的异常进行处理。 在 Lmux下, 对于跨进程删除时的异常处理可以采用同样的方法进行处理。
在 VxWorks下, 删除任务的函数 taskDelete允许通过函数 taskDeleteHookAddO注册钩子函数, 因此, 可在删除任务之前, 注册钩子函 数对要删除的任务的异常进行处理。
对于以上两种操作系统, 本发明实施例提供统一的处理手段。 具体的, 提供 VOS— KillExHandleO函数, 在 Linux系统下注册为删除线程(进程) 的 信号的 handler,在 vxWorks下注册为退出钩子。 VOS— KillExHandleO函数通 过获得被删除线程的异常状态控制表中的信息获得当前要处理的异常,然后 对异常及其占用的资源进行相应的处理。
其中的一种 C语言环境下删除线程或进程的装置如图 16所示, 包括: 确定单元 1601, 用于确定需要删除的线程或进程;
资源检查单元 1602, 用于在确定单元 1601确定需要删除的线程或进程 后, 检查需要删除的线程或进程所抛出的异常是否仍然占用资源;
资源释放单元 1603, 用于在资源检查单元 1602检查出需要删除的线程 或进程所抛出的异常仍然占用资源, 则释放所述占用的资源;
线程或进程删除单元 1604, 用于在资源释放单元 1603释放所述占用的 资源后, 删除所述线程或进程。
综上所述, 本发明实施例实现了在嵌入式 C语言环境下不依赖于编译 器的可精细管理的异常处理方法。本发明实施例提供的用户接口可以将用户 的编码和异常处理分离, 使得用户在使用嵌入式 C语言环境进行程序开发 时,通过使用简单的宏接口即可实现基于异常处理的程序设计,从而更关注 代码正常分支的开发。对异常框架的可精细管理的设计使得用户可以根据需 要调整异常处理的级别, 例如, 在调试阶段可以将异常处理定在函数级, 以 尽量抓取程序的异常,而在代码稳定后,产品上网运行时将异常处理级别定 为部件级, 忽略函数级的异常处理, 只针对模块出现的异常进行统一处理。
针对现有技术中用户无法根据自己的需要对异常处理的粒度和方式进 行控制的状况,本发明实施例在上述不依赖于编译器的异常处理方法和异常 处理框架中实现将异常处理动态配置到函数、模块或者组件的机制, 以及配 置异常处理的机制, 从而实现对异常处理方法和异常处理框架的精细管理。 使得用户可以根据自己的需要对异常处理框架和处理方法进行精细管理。用 户对异常处理框架和处理方法的精细管理包括两个方面:
一方面,在开发的不同阶段,用户可以根据需要将异常处理动态配置到 函数、模块、组件等不同级别,从而达到对异常处理框架的精细管理。例如, 在产品开发阶段,用户为了尽量找到引发异常的错误,可以将异常处理级别 配置为函数级别,在异常处理保护的代码中, 函数抛出的异常都会被函数的 异常处理机制捕获并处理; 当产品开发结束发布时, 代码已经较为稳定, 为 了提高性能,用户可以将异常处理级别配置为模块级甚至部件级, 异常处理 的机制在模块或部件范围内起作用,抛出的异常会被本模块或部件的异常处 理机制捕获并统一处理。
另一方面,用户对同一段保护的代码可以做不同的异常处理, 并可以在 异常处理框架中配置异常处理方法,在不同的情况下使不同的异常处理方法 生效。例如, 对同一段保护的代码, 用户的异常处理可以有查错和容错至少 两种处理方式,在代码开发时使用查错方式尽量找到引发异常的错误,而在 产品发布时使用容错方式对异常进行恢复处理。用户可以在异常处理框架中 配置异常处理方式为查错或者容错。
以及, 在本发明实施例的嵌入式 C语言环境下异常处理方法、 装置及 嵌入式系统中,如果程序代码片段出现异常, 则不是简单的重新运行程序代 码片段, 而是使用独立于程序代码片段的异常处理程序来处理异常, 这样, 程序在运行时,就不会因为异常而中断运行, 满足了产品不希望系统运行时 发生中断的需求。
以及,针对现有技术中的异常处理机制不支持跨线程和跨进程删除时的 异常处理, 本发明实施例在嵌入式 C环境下不依赖于编译器的异常处理方 法和异常处理框架中提供了线程主动退出和跨线程 (进程) 删除时的方法。 在本发明实施例的嵌入式 C语言环境下退出或删除线程或进程的方法中, 无论是退出或者删除线程或进程,都可以释放处理线程或进程抛出的异常所 占用的资源, 这样, 当其他线程或进程需要使用这些资源时, 不会因为删除 或退出的线程或进程所抛出的异常仍然占用资源而导致其他线程或进程无 法使用这些资源。另外, 还可以由其他线程删除所需要删除的线程, 从而可 以实现跨线程删除线程时的异常处理。
本领域普通技术人员可以理解实现上述实施例的嵌入式 C语言环境下 异常处理的过程可以通过程序指令相关的硬件来完成,所述的程序可以存储 于可读取存储介质中, 该程序在执行时执行上述方法中的对应歩骤。所述的 存储介质可以如: ROM/RAM、 磁碟、 光盘等。
最后需要说明的是, 本发明所有的实施例都可以应用于嵌入式 C语言 环境下、 非嵌入式 C语言环境下。
以上所述仅是本发明的优选实施方式, 应当指出,对于本技术领域的普 通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润 饰, 这些改进和润饰也应视为本发明的保护范围。

Claims

权 利 要 求 书
1.一种嵌入式 C语言环境下的异常处理方法, 其特征在于, 包括: 监控正在运行的需要保护的程序代码片段,如果所述程序代码片段出现 异常, 则抛出所述异常, 所述异常包括软件异常、 硬件异常中的至少一种; 根据获得的所述异常,确定相应的异常处理程序, 由所述异常处理程序 处理所述异常, 其中, 所述异常处理程序与所述程序代码片段相互独立。
2.如权利要求 1所述的方法, 其特征在于, 所述监控正在运行的需要保 护的程序代码片段的歩骤为:根据设置的处理异常的粒度,监控所述正在运 行的需要保护的程序代码片段。
3.如权利要求 1所述的方法, 其特征在于, 所述方法进一歩包括: 申请 用于记录与异常相关的信息的存储空间;
贝 |J, 在所述程序代码片段出现异常之后, 抛出所述异常之前, 记录与异 常相关的信息。
4.如权利要求 1或 3所述的方法, 其特征在于, 所述抛出所述异常为: 将所述与异常相关的信息打包后传递出去,所述与异常相关的信息至少包括 异常类型标识,所述异常类型标识用于表示当前程序代码片段出现的异常的 类型。
5.如权利要求 4所述的方法, 其特征在于, 所述根据获得的所述异常, 确定相应的异常处理程序, 由所述异常处理程序处理所述异常的歩骤包括: 获得传递过来的与异常相关的信息,所述与异常相关的信息中包含异常 类型标识;
确定与所述异常类型标识对应的异常类型所匹配的异常处理程序,由所 述异常处理程序处理所述异常。
6.如权利要求 5所述的方法, 其特征在于, 所述确定与所述异常类型标 识对应的异常类型所匹配的异常处理程序,由所述异常处理程序处理所述异 常的歩骤包括:
当所述异常类型标识对应的异常类型与能处理的一种特殊的异常类型 匹配时, 由与该异常类型匹配的异常处理程序处理该异常;
或,当所述异常类型标识对应的异常类型与能处理的至少一种异常类型 中的一种异常类型匹配时, 由与该异常类型匹配的异常处理程序处理该异 常;
或, 当存在能处理任何类型异常的异常处理程序时, 确定由该匹配任意 类型异常的异常处理程序处理所述异常。
7.如权利要求 6所述的方法, 其特征在于, 所述方法进一歩包括: 如果 当前不存在与该异常类型匹配的异常处理程序时,将获得的与异常相关的信 息重新传递出去, 或者, 当均匹配不上时, 启动默认处理程序, 所述默认处 理程序为重启系统。
8.如权利要求 4所述的方法, 其特征在于, 所述根据获得的所述异常, 确定相应的异常处理程序, 由所述异常处理程序处理所述异常的歩骤包括: 获得传递过来的与异常相关的信息,所述与异常相关的信息包含异常类 型标识和指定处理方式标识;
确定与所述异常类型标识对应的异常类型所匹配,且与所述的指定处理 方式标识对应的处理方式所匹配的异常处理程序,由所述匹配的异常处理程 序处理所述异常。
9.如权利要求 5所述的方法, 其特征在于, 所述异常处理程序还能够匹 配和处理多种类型的异常。
10.如权利要求 5所述的方法, 其特征在于, 如果有多个与所述异常类 型相匹配的异常处理程序,则确定与所述异常类型标识对应的异常类型所匹 配的异常处理程序的歩骤为:
确定与所述异常类型标识对应的异常类型所匹配的,且与所述程序代码 片段位置最近的一个异常处理程序。
11.如权利要求 1所述的方法, 其特征在于, 如果所述程序代码片段被 调用时出现异常, 则由所述异常处理程序处理所述异常之后,所述方法进一 歩包括:逐级返回所述程序代码片段正常运行后的结果,或者运行与所述异 常处理程序相邻且在其之后的程序代码片段。
12.如权利要求 2所述的方法, 其特征在于, 所述设置的处理异常的粒 度包括函数级别、 模块级别、 部件级别中的至少一种, 其中, 所述模块由多 个函数组成, 所述部件由多个模块组成。
13.如权利要求 8所述的方法, 其特征在于, 当所述处理方式是容错处 理方式, 由容错方式的异常处理程序处理所述异常;
当所述处理方式是查错处理方式,由查错方式的异常处理程序处理所述 异常, 其中, 所述异常处理程序与所述程序代码片段相互独立。
14.如权利要求 1所述的方法, 其特征在于, 由具有匹配和捕捉异常功 能的宏来匹配和捕捉异常;由具有监控功能的宏来监控正在运行的需要保护 的程序代码片段; 由具有抛出异常功能的宏来抛出所述异常。
15.—种嵌入式 C语言环境下异常处理装置, 其特征在于, 包括: 监控单元, 用于监控正在运行的需要保护的程序代码片段;
异常抛出单元, 用于在所述监控单元发现所述程序代码片段出现异常 后, 抛出所述异常, 所述异常包括软件异常、 硬件异常中的至少一种; 匹配单元, 用于根据获得的所述异常, 确定对应的异常处理程序, 所述 异常处理程序用于处理所述异常抛出单元抛出的异常,其中,所述异常处理 程序与所述程序代码片段相互独立。
16.如权利要求 15所述的异常处理装置, 其特征在于, 还包括: 信息记 录单元,用于记录与所述监控单元发现的所述程序代码片段出现的异常相关 的信息, 并输出给所述异常抛出单元。
17.如权利要求 16所述的异常处理装置, 其特征在于, 所述异常抛出单 元为第一异常抛出单元,用于在所述监控单元发现所述程序代码片段出现异 常后,将所述与异常相关的信息打包后传递出去,所述与异常相关的信息至 少包括异常类型标识,所述异常类型标识用于表示当前程序代码片段出现的 异常的类型。
18.如权利要求 17所述的异常处理装置, 其特征在于, 所述匹配单元为 第一匹配单元,用于获得传递过来的与异常相关的信息,所述与异常相关的 信息中包含异常类型标识,并确定与所述异常类型标识对应的异常类型所匹 配的异常处理程序, 由所述异常处理程序处理所述异常。
19.如权利要求 17所述的异常处理装置, 其特征在于, 所述匹配单元为 第二匹配单元,用于获得传递过来的与异常相关的信息,所述与异常相关的 信息包含异常类型标识和指定处理方式标识,并确定与所述异常类型标识对 应的异常类型所匹配,且与所述的指定处理方式标识对应的处理方式所匹配 的异常处理程序, 由所述异常处理程序处理所述异常。
20.如权利要求 15所述的异常处理装置, 其特征在于, 如果有多个与所 述异常的类型相匹配的异常处理程序,所述匹配单元为第三匹配单元,用于 根据获得的所述异常,确定与所述异常的类型所匹配的, 且与所述程序代码 片段位置最近的一个异常处理程序, 由所述异常处理程序处理所述异常。
21.如权利要求 15所述的异常处理装置, 其特征在于, 所述监控单元为 第一监控单元,用于在一程序执行触发异常时,根据设置的处理异常的粒度 监控所述正在运行的需要保护的程序代码片段。
22.—种嵌入式 C语言环境下退出线程或进程的方法, 其特征在于, 应 用于线程主动退出的场景, 包括:
获得线程或进程需要退出的信息;
检查需要退出的线程或进程所抛出的异常是否仍然占用资源; 如果是, 则释放所述占用的资源;
退出所述线程或进程。
23.如权利要求 22所述的方法, 其特征在于, 检查需要退出的线程或进 程所抛出的异常是否仍然占用资源具体包括:
检查需要退出的线程或进程是否已抛出异常;
如果是, 则检查已抛出的异常是否仍然占用资源。
24.—种嵌入式 C语言环境下退出线程或进程的装置, 其特征在于, 包 括:
信息获得单元, 用于获得线程或进程需要退出的信息;
资源检查单元,用于在所述信息获得单元获得线程或进程需要退出的信 息后, 检查需要退出的线程或进程所抛出的异常是否仍然占用资源;
资源释放单元,用于在所述资源检查单元检查出需要退出的线程或进程 所抛出的异常仍然占用资源, 释放所述占用的资源;
退出单元,用于在所述资源释放单元释放所述占用的资源后,退出所述 线程或进程。
25.—种嵌入式 C语言环境下删除线程或进程的方法, 其特征在于, 应 用于当前线程或进程被其他线程或进程删除的场景, 包括:
确定需要删除的线程或进程;
检查需要删除的线程或进程所抛出的异常是否仍然占用资源; 如果是, 则释放所述占用的资源;
删除所述线程或进程。
26.如权利要求 25所述的方法, 其特征在于, 检查需要删除的线程或进 程所抛出的异常是否仍然占用资源具体包括:
检查需要删除的线程或进程是否已抛出异常;
如果是, 则检查已抛出的异常是否仍然占用资源。
27.—种嵌入式 C语言环境下删除线程或进程的装置, 其特征在于, 包 括:
确定单元, 用于确定需要删除的线程或进程;
资源检查单元,用于在所述确定单元确定需要删除的线程或进程后,检 查需要删除的线程或进程所抛出的异常是否仍然占用资源;
资源释放单元,用于在所述资源检查单元检查出需要删除的线程或进程 所抛出的异常仍然占用资源, 释放所述占用的资源;
线程或进程删除单元, 用于在所述资源释放单元释放所述占用的资源 后, 删除所述线程或进程。
28.—种嵌入式系统,其特征在于,所述系统包括如权利要求 15-21任意 一项所述的异常处理装置。
PCT/CN2009/070492 2008-06-03 2009-02-20 嵌入式c语言环境下异常处理方法及装置 WO2009146612A1 (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN200810100060.5 2008-06-03
CN2008101000605A CN101599039B (zh) 2008-06-03 2008-06-03 嵌入式c语言环境下异常处理方法及装置

Publications (1)

Publication Number Publication Date
WO2009146612A1 true WO2009146612A1 (zh) 2009-12-10

Family

ID=41397719

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/CN2009/070492 WO2009146612A1 (zh) 2008-06-03 2009-02-20 嵌入式c语言环境下异常处理方法及装置

Country Status (2)

Country Link
CN (1) CN101599039B (zh)
WO (1) WO2009146612A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2018227822A1 (zh) * 2017-06-12 2018-12-20 平安科技(深圳)有限公司 异常堆栈信息获取方法、装置及计算机可读存储介质

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101853189B (zh) * 2010-05-26 2012-07-11 北京航空航天大学 一种基于Java的异常处理装置及其异常处理方法
CN101937372B (zh) * 2010-08-30 2012-10-10 北京数码大方科技有限公司 异常处理的方法及装置
CN102385508A (zh) * 2010-09-03 2012-03-21 金蝶软件(中国)有限公司 一种异常处理的方法、装置和软件系统
CN102004694B (zh) * 2010-11-26 2013-04-24 北京握奇数据系统有限公司 一种基于Java的异常处理方法和异常处理装置
CN102833120B (zh) * 2011-06-14 2017-06-13 中兴通讯股份有限公司 一种快速自动化测试中处理网管服务器异常的方法及系统
CN103731729A (zh) * 2013-11-26 2014-04-16 乐视致新电子科技(天津)有限公司 智能电视媒体播放器及其异常处理方法、智能电视
CN104239208B (zh) * 2014-09-19 2017-02-15 福建星海通信科技有限公司 一种自动化执行期间异常恢复方法
CN104503770B (zh) * 2015-01-12 2018-07-13 北京国双科技有限公司 异常信息的处理方法及装置
CN104503918B (zh) * 2015-01-12 2017-12-19 北京国双科技有限公司 异常信息的处理方法及装置
CN105354105B (zh) * 2015-10-28 2018-04-06 上海斐讯数据通信技术有限公司 软件异常处理系统及方法
CN105718374A (zh) * 2016-01-26 2016-06-29 国家信息技术安全研究中心 一种热点模块指令跟踪的方法及系统
CN105843675B (zh) * 2016-04-01 2020-06-26 腾讯科技(深圳)有限公司 线程退出方法和装置
CN107451046B (zh) * 2016-05-30 2020-11-17 腾讯科技(深圳)有限公司 一种检测线程的方法及终端
CN106227672B (zh) * 2016-08-10 2019-07-09 中车株洲电力机车研究所有限公司 一种嵌入式应用程序故障捕捉及处理方法
CN106372505B (zh) * 2016-08-23 2018-12-28 北京航空航天大学 一种针对嵌入式系统代码攻击的快速恢复方法
CN106528316A (zh) * 2016-11-10 2017-03-22 霍尔果斯霹雳互动网络科技有限公司 一种网络游戏服务器防崩溃方法和系统
CN106951337B (zh) * 2017-03-28 2020-09-11 北京奇虎科技有限公司 一种基于异常处理实现应用的跨系统运行的方法及设备
CN109117253B (zh) * 2017-06-26 2022-05-24 阿里巴巴集团控股有限公司 一种微内核调度的方法和装置
CN108345542B (zh) * 2018-02-28 2021-01-29 腾讯科技(深圳)有限公司 一种应用程序中异常处理方法及装置
CN108958850A (zh) * 2018-06-29 2018-12-07 郑州云海信息技术有限公司 一种日志优化方法、装置、设备及计算机可读存储介质
CN111190707B (zh) * 2019-08-02 2023-04-28 腾讯科技(深圳)有限公司 一种数据处理方法及装置
CN111124726B (zh) * 2019-12-09 2024-01-26 上海移远通信技术股份有限公司 打开modem端口异常检测方法及装置
CN112000577B (zh) * 2020-08-25 2023-12-26 得到(天津)文化传播有限公司 一种代码检查方法、装置、电子设备和存储介质
CN112445642B (zh) * 2020-11-09 2023-05-16 浙江吉利控股集团有限公司 异常处理方法、远程泊车辅助系统及计算机存储介质
CN113220495B (zh) * 2021-05-24 2024-04-16 浙江大华技术股份有限公司 一种进程异常事件处理方法、装置、电子设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6247169B1 (en) * 1996-11-04 2001-06-12 Sun Microsystems, Inc. Structured exception-handling methods, apparatus, and computer program products
CN1761949A (zh) * 2003-06-30 2006-04-19 松下电器产业株式会社 垃圾收集系统
CN1952880A (zh) * 2006-10-26 2007-04-25 康佳集团股份有限公司 一种使用c语言的非本地跳转工具模拟异常机制的方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6247169B1 (en) * 1996-11-04 2001-06-12 Sun Microsystems, Inc. Structured exception-handling methods, apparatus, and computer program products
CN1761949A (zh) * 2003-06-30 2006-04-19 松下电器产业株式会社 垃圾收集系统
CN1952880A (zh) * 2006-10-26 2007-04-25 康佳集团股份有限公司 一种使用c语言的非本地跳转工具模拟异常机制的方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
WANG S.: "Design an architecture of exception handling for C language programming", THE WAY TO SYSTEM ANALYST, June 2006 (2006-06-01), pages 278 - 299 *
ZHANG J.: "Structured Exception handling for Windows", JOURNAL OF CHANGZHI UNIVERSITV, vol. 23, no. 5, October 2006 (2006-10-01), pages 42 - 44 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2018227822A1 (zh) * 2017-06-12 2018-12-20 平安科技(深圳)有限公司 异常堆栈信息获取方法、装置及计算机可读存储介质
US11010227B2 (en) 2017-06-12 2021-05-18 Ping An Technology (Shenzhen) Co., Ltd. Exception stack information acquisition method and device and computer-readable storage medium

Also Published As

Publication number Publication date
CN101599039B (zh) 2011-11-02
CN101599039A (zh) 2009-12-09

Similar Documents

Publication Publication Date Title
WO2009146612A1 (zh) 嵌入式c语言环境下异常处理方法及装置
US10671468B2 (en) Enhanced dump data collection from hardware fail modes
JP5520219B2 (ja) エラーハンドリングをもつトランザクションのグラフ型計算
Pyarali et al. Design and Performance of an Object-Oriented Framework for High-Performance Electronic Medical Imaging.
US6832367B1 (en) Method and system for recording and replaying the execution of distributed java programs
US8127289B2 (en) Enabling a third party application to participate in migration of a virtualized application instance
US7870443B2 (en) Method to isolate crash of an embedded multi-threaded application to a shared library call without core dump files or debugger
US6633876B1 (en) Analyzing post-mortem information on a remote computer system using a downloadable code module
US8930761B2 (en) Test case result processing
CN107066241A (zh) 用于动态加载基于图的计算的系统和方法
CN105308578B (zh) 状态转变的诊断
CN110413432B (zh) 一种信息处理方法、电子设备及存储介质
US11321078B2 (en) Continuous in-place software updates with fault isolation and resiliency
US7861072B2 (en) Throwing one selected representative exception among aggregated multiple exceptions of same root cause received from concurrent tasks and discarding the rest
Eriksen Your server as a function
US20190391809A1 (en) Programs with serializable state
US8751872B2 (en) Separation of error information from error propagation information
US8484616B1 (en) Universal module model
US20080320275A1 (en) Concurrent exception handling
US11951999B2 (en) Control unit for vehicle and error management method thereof
CN108270832B (zh) 一种故障重放方法和装置
US8205218B1 (en) Data storage system having common software environment
US9672083B2 (en) Operating a program code object in conjunction with an application context
CN102163174A (zh) 嵌入式c语言环境下退出和删除线程或进程的方法、装置
WO2009010982A2 (en) Software for a real-time infrastructure

Legal Events

Date Code Title Description
121 Ep: the epo has been informed by wipo that ep was designated in this application

Ref document number: 09757046

Country of ref document: EP

Kind code of ref document: A1

NENP Non-entry into the national phase

Ref country code: DE

122 Ep: pct application non-entry in european phase

Ref document number: 09757046

Country of ref document: EP

Kind code of ref document: A1