首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
» 嵌入式软件中基于栈的错误追踪机制设计
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
嵌入式软件中基于栈的错误追踪机制设计
发短消息
加为好友
我是MT
当前离线
UID
1023166
帖子
6651
精华
0
积分
3328
阅读权限
90
来自
燕山大学
在线时间
230 小时
注册时间
2013-12-19
最后登录
2016-1-5
论坛元老
UID
1023166
性别
男
来自
燕山大学
1
#
打印
字体大小:
t
T
我是MT
发表于 2015-11-27 10:12
|
只看该作者
嵌入式软件中基于栈的错误追踪机制设计
嵌入式软件
,
程序编写
,
软件开发
,
能力
,
信息
引言
嵌入式
软件开发往往缺乏必要的调试工具和调试手段,同时需要有较高的容错处理能力,程序正常运行过程中尽量不因为出现异常而导致系统停止。一旦发生错误或异常,开发人员需要尽量多的错误环境信息来查找问题的原因。从程序编写的角度来讲,一般
嵌入式
软件都采用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,该指针始终指向栈顶元素)。算法说明如下:
3 建立统一的错误描述字典表
为了进一步提高代码规范化程度并降低内存需求,可以将每种类型的错误定义一个错误描述保存在单独的文件或缓冲区中。当发生错误时,系统根据错误代码取出该错误的详细描述并显示给用户。以上操作可以封装为ShowErrorMessage函数,定义为Char*ShowErrorMessage(int errorId)。在错误发生位置并不直接描述错误信息的方法,不仅可以降低可执行内存需求,而且避免了由于不同开发者对错误文字描述的差异而导致对用户的提示信息不统一。例如错误提示“数组越下界!代码:53017010”,530即表示数组越下界异常,17表示编号为“17”的C源程序文件,010表示文件中第10个错误位置。部分错误代码描述示例如表1所列。
4 应用说明
下面以1个简单的例子来说明本文方法的运行。假设程序需要提供1个通过GPRS发送数据的函数 GprsSendData(char*ip,char*buf,int size),实现将buf缓冲区指定长度为size的字符串通过TCP方式发送到给定IP地址。示例代码如下:
由上面可以看出,可能出现错误的位置都加入了错误压栈操作,当GprsSendData函数的返回值为假时,上级调用函数会继续将其异常时的运行状态(局部变量、参数等)继续压栈,以此类推直到需要处理该异常的最顶级。开发人员后期调试时可以将栈顶元素依次出栈,构成一条完整的函数调用链,比较容易找出上述产生ip为空串的根本原因。
在软件开发阶段及运行的初期阶段,适当加大错误堆栈容量,可以储存更多信息辅助调试。随着设备软件可靠性、稳定性的增加,在正式投入运行后可以将异常栈设定为较小的容量,以降低存储需求。
可以设想,若整个
嵌入式
软件在开发中严格按照本文思路处理异常,应当可以很方便地进行异常的查找与处理。当
嵌入式
设备投入运行后,定期对该设备的错误栈进行分析,对于栈中存储的错误信息进行及时处理,可以迅速有效地增加设备软件的运行可靠性。一个经过严格测试的设备在绝大多数情况下错误栈应为空。
结语
本文对于基于C语言的
嵌入式
软件开发中的错误追踪机制进行了详细描述。该机制可以有效地降低软件异常发生的概率,提升软件的可靠性,减少开发成本。同时,该机制亦可以用于正常开发阶段的辅助调试中,在关键程序段将环境信息压栈实现后期分析,也为改进
嵌入式
软件的调试手段提供了新的辅助思路。文中所述机制已经在作者主持的电力GPRS集抄终端的软件设计中得到了实际应用,取得了良好的效果。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议