首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式软件中基于栈的错误追踪机制设计

嵌入式软件中基于栈的错误追踪机制设计

 嵌入式软件开发往往缺乏必要的调试工具和调试手段,同时需要有较高的容错处理能力,程序正常运行过程中尽量不因为出现异常而导致系统停止。一旦发生错误或异常,开发人员需要尽量多的错误环境信息来查找问题的原因。从程序编写的角度来讲,一般嵌入式软件都采用C语言开发。C语言本身的特点决定了无法利用语言本身的功能实现对异常的跟踪与处理,只能通过良好的编程模型与习惯,以及后期的大量测试,来发现和解决异常。因此,如何进一步提升程序开发中的可调试性,对于运行中的异常如何保存现场,从而方便进行异常追踪等,是开发者需要考虑的重要问题。本文针对嵌入式C语言开发的特点,提出一种基于堆栈模式的异常追踪编程模型,能够实现有效的异常现场保存与恢复,并为后期的问题分析与解决打好基础。同时,本文所提出的思路亦可作为实际运行阶段提升可调试性的一种手段应用于嵌入式软件编程中,最大限度实现对于异常发生环境的保存与定位,提升系统的可维护性。
  1 建立全局错误代码表
  对于嵌入式软件来说,尽量节省内存资源、降低程序代码量是十分重要的。因此,将程序中所有错误、异常情况都进行了统一编码,提高了错误处理代码的规范化与可读性。设计8位整数编码格式如下:

  每个错误代码在程序中仅需要1个字节进行存储。对于程序中每个可能异常的地方(如COM1没打开),都设定1个唯一编号,当出现错误或异常时根据该编号可以直接定位到源程序对应文件和程序段,并确定错误类型。
  采用错误代码的形式存储错误信息,不仅可以精确描述错误的类型、位置等信息,还可以最大限度地节省宝贵的可执行内存资源,降低程序对内存的需求。
  2 建立全局异常堆栈
  在一个复杂的嵌入式实时系统中,程序处理流程复杂,不同资源之间往往在操作上存在着交叉。当出现程序错误或异常时,不能简单地退出程序,而是应当尽量将错误处理掉,实在无法处理的错误应进行记录,但整个程序的运行不应当中断。对此,使用1个错误堆栈来保存错误信息。该栈用下面数组定义:

  ERROR_STACK为全局错误栈类型定义,MainErrStack为全局栈实例,其元素个数由ERR_STACK_SIZE确定。ErrorParm为字符数组,当错误发生时可以依次保存函数的人口参数以及异常发生之前局部变量的值等。实际数组长度ERR_ENV_LEN可以根据情况调整,一般情况下开发阶段可以设置大一些,保证存放更多的错误信息用于调试;进入实际运行阶段可以适当缩小该错误环境栈长度,减少内存空间的占用。
  为了确保错误处理机制本身不会给程序引入新的异常,因此将堆栈的操作完全封装为Push和Pop两个函数,并引入当前堆栈指针stackCu-rrentPos(初始为一1表示堆栈为空,有效取值范围为一1~ERR_STlACK_SIZE一1,该指针始终指向栈顶元素)。算法说明如下:

返回列表