RTEMS:异常处理
21.1: 介绍
%A
%A 在RTEMS中,通常将异常称为致命错误(fatal error),为了方便,我还是把fatal error称为异常。由异常管理器处理所有的无法恢复的错误。异常管理器提供的函数是:
%A
%A rtems_fatal_error_occurred- 唤醒异常处理例程
%A 21.2: 背景
%A
%A 当RTEMS或应用软件发现了不可恢复的错误就会调用异常管理器。下面的代码可能发现异常:
%A
%A • RTEMS本身
%A
%A • 用户系统代码(驱动等)
%A
%A • 用户应用代码
%A
%A 如果是RTEMS发现异常时,RTEMS将自动唤醒异常管理器。同样,如果是用户发现异常,那么用户应当唤醒异常管理器。
%A
%A 每种状态码或动态的用户扩展集都可能包括一个异常处理句柄(函数)。静态扩展集发现异常时可以和宿主机上的调试器通信。如果用户定义了异常处理函数,那么出现异常时异常管理器将会唤醒这些异常。如果用户没有定义异常处理函数或者用户的异常处理函数中将控制权回传给RTEMS异常处理器,那么将会调用缺省的异常处理函数,此时系统状态将会是failed。
%A
%A 虽然缺省的异常处理句柄的流程和处理器有关,但是大体上,他的流程包括屏蔽CPU中断,将错误码放到处理器中,然后停止处理器。
%A 21.3: 操作
%A 21.3.1 : 发布异常
%A
%A 发现异常的时候,需要使用 rtems_fatal_error_occurred 函数来发布异常,这类似与C++中的异常抛出。在启动用户提供的异常操作句柄或RTEMS的异常处理前, rtems_fatal_error_occurred 函数将有用信息储存到结构体变量_Internal_errors_What_happened中。 该结构中包含下面的信息:
%A
%A 异常来源 (API或内核);
%A
%A 异常是否来自于内核;
%A
%A 代表错误的错误码
%A
%A 差错类型指示器依赖于差错的来源以及是否是内核异常。如果异常是API产生的,那么异常误差码将会是API 差错或状态返回码。RTEMS API 的状态返回码在 cpukit/rtems/include/ rtem/rtem/status.h 中有详细定义。那些POSIX API,错误码在 <errno.h> 中定义。
%A
%A rtems_fatal_error_occurred 函数负责启动用户提供的异常处理函数或者是RTEMS的异常处理程序。所有的异常处理函数都使用错误码作为其参数。
%A
%A 有时候,应用需要比较复杂的异常处理机制,例如将异常传递给调试器。在这种情况下,用户提供异常处理在 RTEMS 配置表格中被指定。用户扩展表中的异常处理表项中包含了当 rtems_fatal_error_occurred 函数调用时,会调用的用户扩展程序。如果字段被设定成空值或用户提供的扩展直接返回给RTEMS,那么由 RTEMS 内部提供的异常处理程式将被调用。 RTEMS提供的缺省异常处理函数将停止所有的用户应用程序。
%A 21.4: 异常处理函数
%A 21.4.1 : FATAL_ERROR_OCCURRED- 启动异常处理函数
%A
%A 函数原型 :
%A
%A void volatile rtems_fatal_error_occurred(
%A
%A rtems_unsigned32 the_error
%A
%A );
%A
%A 描述 :
%A
%A 该函数处理系统和应用异常。如果在配置表格中定义了异常扩展,那么将调用用户定义的异常扩展。否则将调用RTEMS 缺省的异常处理函数。
%A
%A rtems_fatal_error_occurred函数能由 RTEMS 或用户的应用以及ISR调用。
%A
%A 注意:
%A
%A 该函数只支援本地操作。
%A
%A 除非用户定义异常处理采取了特别的行动(例如重新启动调用任务)否则函数不会返回给调用任务。
%A
%A 一般来说,用户定义的扩展会包含一个shutdown,关闭系统中所有的节点。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。