一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx

上传人:b****4 文档编号:6556302 上传时间:2023-05-06 格式:DOCX 页数:16 大小:255.06KB
下载 相关 举报
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第1页
第1页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第2页
第2页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第3页
第3页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第4页
第4页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第5页
第5页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第6页
第6页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第7页
第7页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第8页
第8页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第9页
第9页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第10页
第10页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第11页
第11页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第12页
第12页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第13页
第13页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第14页
第14页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第15页
第15页 / 共16页
一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx

《一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx》由会员分享,可在线阅读,更多相关《一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。

一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx

2.如权利要求1所述的嵌入式系统,其特征在于:

该嵌入式系统的软件基于实时多任务操作系统,该实时多任务操作系统可以是VXWORKS、LINUX、OSII、ECOS等嵌入式操作系统中的一种。

3.如权利要求1所述的嵌入式系统,其特征在于:

可编程逻辑器件可以是GAL、CPLD或FPGA等器件,如系统内已有此类器件,可直接与其它功能模块复用此器件,而不需专门增加一片此类器件;

如系统内没有此类器件,则可视具体情况选用合适的器件。

4.如权利要求1所述的嵌入式系统,其特征在于:

配置到可编程逻辑器件中的内存范围信息包含最低内存地址和最高内存地址,可同时配置一条或多条内存范围信息。

5.如权利要求1所述的嵌入式系统,其特征在于:

配置到可编程逻辑器件中的任务信息包含任务标识和任务名,函数信息包含函数名、函数起始地址和函数结束地址,任务信息和函数信息都可以配置一条或多条,函数信息必需与某任务信息关联。

说明书

技术领域

本发明涉及一种嵌入式系统中的内存越界错误快速定位方法,具体涉及一种借助于可编程逻辑器件,结合硬件和软件,快速确定引起内存越界错误的任务/进程以及该任务/进程调用的直接引起内存越界错误的具体函数的方法。

背景技术

内存越界错误是软件中比较常见的错误,也是非常致命的错误。

C语言的广泛应用是一把双刃剑,好处是:

它使大量的没受过专业教育的人员能够较快的具备程序设计能力,也使软件编码过程大大缩短,坏处是:

或者由于项目进度的压力,或者由于程序员的责任心不强,很多应该在编译阶段就排除的软件错误,最后演变成严重甚至致命的运行时错误,内存越界错误多数就由此产生,如附图4.a、4.b、4.c和4.d这几种情况,错误的根源都很微小,或掉了各“*”号,或循环变量数值多了1,看起来只是个简单笔误,但引起了内存越界错误。

内存越界错误由于对内存的不合法使用,产生的后果非常严重,轻者由于使用的数据并非正确数据,导致系统输出错误的结果,如附图4.a和4.c的情形,虽然软件读越界或写越界,但由于误读的数据或误修改的数据未进一步使用,而是直接输出了,在这种情况下,系统仍健壮,但输出结果错误;

重者由于越界错误破坏了系统核心,导致系统崩溃,如附图4.b和4.d的情形,前者将一个非预期的数据当作一个函数执行,后果可想而知,后者则直接清除了中断向量表,系统产生中断时系统将崩溃。

而且,随着系统趋于庞大,内存越界错误越来越难找到直接原因,尤其是在引起内存越界的执行路径执行的概率非常低时。

一个模块引起的内存越界错误,排查时间有时甚至超过设计该模块的时间。

嵌入式系统由于它本身的固有特性,调试往往采用结合主机和目标机的远程调试,每一步调试都需要主机和目标机的多次交互,调试效率极低,排查内存错误的困难远比单纯调试主机软件大。

因此,调试主机软件的有效手段:

“设断点“、“单步”、“在断点处检查变量和内存”等等,基本不能在嵌入式系统中运用,排查嵌入式系统的隐蔽错误常常通过代码检查和在可疑代码内部插入打印某些重要变量的方式完成,而这些,也需要在花费大量的时间的基础上才能实现,并且,这些调试手段是否有效很大程度上依赖于编程人员的能力和经验。

因此,如果能够找到一种更高效的内存错误定位方法对嵌入式系统开发是大有裨益的。

发明内容

本发明的目的是为尽快排除嵌入式系统已经发现的内存错误,提出了一种借助于可编程逻辑器件,结合硬件和软件的快速定位引起内存越界的原因的方法。

该方法的基本思路是:

首先,该方法需要硬件和软件一起配合实现,硬件是可编程逻辑器件,软件是一个中断服务程序和一个检测任务。

在可编程逻辑器件上配置一个或多个需监测的内存范围,同时将系统正常运行时可能合法访问这些内存区域的任务及函数信息存储在可编程逻辑器件中,利用可编程逻辑器件监测嵌入式系统的地址总线,并周期性的对地址总线采样,得到当前系统的内存访问地址,如果该内存访问地址落在可编程器件监测的一个内存区域内,则标记该内存区域为活跃,同时可编程逻辑器件则向CPU产生一次中断,对应的中断服务程序查询在发生本次中断前,当前正在执行的任务A,并借助于可编程逻辑器件上存储的任务信息,判断任务A是否是该活跃内存区域的合法访问任务,如果不是,则将任务A的信息告知检测任务/进程M,任务/进程M通过任务A的控制块得到当前该任务执行的指令计数器,基于指令计数器的值得到访问该内存区域的函数,如果该函数是该内存区域合法的访问函数,则系统恢复继续运行,否则确定该函数是直接引起内存越界的函数。

该方法的功能结构如图1所示。

在图1中,左边的流程图表示是可编程逻辑器件实现的功能,右边上半部分表示的是中断服务程序实现的功能,右边下半部分表示的是检测任务/进程实现的功能。

附图说明

图1为电信级以太网系统中的虚拟硬件方法功能结构示意图。

图2为可编程逻辑器件与CPU的连接关系图。

图3为可编程逻辑器件内配置信息示意图。

图4.a为内存读越界对系统的轻度影响示意图。

图4.b为内存读越界对系统的崩溃性影响示意图。

图4.c为内存写越界对系统的轻度影响示意图。

图4.d为内存读越界对系统的崩溃性影响示意图。

图5为实时多任务操作系统任务控制块实例。

具体实施方式

下面结合附图对本发明进行详细的描述。

●可编程逻辑器件关联功能的实现

图2是可编程器件和CPU的连接关系简图,这里只给出了为实现地址总线检测采样部分的连接关系图,而CPU管理和控制可编程器件的接口连接关系这里从略。

CPU管理和控制可编程逻辑器件的接口用来实现CPU和可编程逻辑器件之间的信息交互,与系统使用可编程逻辑器件的一般情况相同,即可编程逻辑器件的内部存储作为CPU可访问的存储器或寄存器使用。

系统使用SRAM或DRAM(包括SDRAM和DDR等),地址总线检测的连接关系和逻辑是有很大差别的,图2实际给出了包括SRAM或DRAM的一个总的连接关系,实际应用中视具体情况而定。

如果使用DRAM类,则只使用地址线“A0..A31”中的一个子集作为行地址和列地址输入,行选“RAS”、列选“CAS”必须使用,使用SDRAM的系统,“SDRAM_CLK”也需采用。

如果使用SRAM类,则地址线“A0..A31”视SRAM器件的情况选用,“RAS”、“CAS”和“SDRAM_CLK”则不采用。

“INTR”是中断请求信号,当可编程逻辑器件判断地址总线采样命中某个配置的内存区域范围内,则使“INTR”有效。

本方法中,可编程逻辑器件部分的功能如附图1左子图所示。

首先,是CPU通过管理控制接口向可编程逻辑器件写入监视内存区域范围信息(可以是一条或多条)、合法任务信息和合法访问函数信息(可以是一条或多条)。

内存区域范围信息、合法任务信息和合法访问函数信息在可编程逻辑器件内部存储的结构如附图3所示,每条内存区域范围包括“起始地址”、“结束地址”、“活跃标记”信息,活跃标记表示本内存区域范围包含最近采样得到的地址,如果只配置一个内存区域范围,则活跃标记可不是用。

任务信息包含“任务标识”和“任务名”,函数信息包含“函数名”、“函数起始地址”和“函数结束地址”信息,值得注意的是,函数信息一定与某个具体任务关联。

上述内存区域范围信息、任务信息和函数信息可存储的条目数多少使可编程逻辑器件的容量和实际应用需要确定。

在配置信息设置好后,CPU可设定可编程逻辑器件的采样频率、并置“启动/停止”标志位为“启动”(“启动/停止”标志位为“启动”时,可编程逻辑器件开始周期性的对地址线采样等操作,否则不做任何操作),则可编程逻辑器件开始工作。

值得注意的是,采样频率不应低于存储器的访问频率,否则,有可能一些重要的内存访问没有被监测到。

当某次采样确定得到的地址落在某条配置好的内置区域范围内,而且配置的内存区域范围多于一条,则置位该内存区域范围的“活跃标记”,清除其它内存区域范围的“活跃标记”,并在中断请求信号“INTR”上输出一个脉冲。

同时,置“启动/停止”标志位为“停止”。

上述功能中,除配置信息通过CPU和可编程逻辑器件共同完成外,其它功能由可编程逻辑器件自动完成。

●中断服务程序关联的功能实现

本方法中,中断服务程序的功能如附图1右上子图所示。

中断服务程序的设计随着CPU和实时多任务操作系统的不同可能存在较大的差异,但主要机制和原理是相似的。

大多数情况下如下:

初始化中断服务程序时将中断服务程序和一个中断向量相连,中断服务程序的起始关中断,中断服务程序结束时开中断。

值得注意的是,在嵌入式系统中,中断服务程序不适宜占用太多得CPU时间,一般情况下,中断服务程序仅仅响应产生中断的时间,记录一些信息,然后通知关联的任务,大部分任务都交给关联的任务去完成。

因此,本中断服务程序同样设计只做较少的工作,如附图1右上子图,中断服务程序响应中断后,仅仅做合法任务过滤工作和可编程器件中“启动/停止”标志位修改工作。

合法任务过滤工作放在中断服务程序中实现的原因是防止系统发生过多得任务调度,因为当前活跃任务不是监测任务,那么从当前活跃任务切换到监测任务系统需要重新调度。

如果活跃任务信息过多,合法任务过滤工作也可从中断服务程序中移出到监测任务/进程中实现。

中断服务程序修改“启动/停止”标志位的操作仅当当前活跃任务是命中的内存区域的合法访问任务时执行。

●检测任务/进程关联的功能实现

本方法中,监测任务/进程的功能如附图1右下子图所示。

监测任务/进程是配合中断服务程序而设置的,从技术上来讲,监测任务/进程所做得工作在中断服务程序里都可以实现,但嵌入式系统中,中断服务程序是不适合占用太多CPU时间,因此,大部分工作都移到任务中完成。

首先,监测任务/进程需从中断服务程序得到通知(通常是以信号量传递的方式),然后开始执行自己的任务(如得不到中断服务程序通知,监测任务/进程则处于阻塞状态)。

然后,监测任务/进程需从中断服务程序得到该内存区域的当前访问任务,如果设计的合法访问任务过滤功能不是由中断服务程序完成,那么监测任务/进程需完成此功能。

如果合法访问任务过滤功能由监测任务/进程实现,且过滤结果

接着,监测任务/进程还需完成合法访问过滤功能,如果

说明书附图

图1

INTR

SDRAMCLK

RAS

WE

CAS

A0……A31

图2可编程器件与CPU连接关系图

内存区域1起始地址

内存区域1结束地址

活跃标记

内存区域2起始地址

内存区域2结束地址

.

内存区域n起始地址

内存区域n结束地址

任务1标识

任务1名

函数1.1名

函数1.1起始地址

函数1.1结束地址

函数1.2名

函数1.2起始地址

函数1.2结束地址

函数1.n名

函数1.n起始地址

函数1.n结束地址

任务2标识

任务2名

函数2.1名

函数2.1起始地址

函数2.1结束地址

函数2.2名

函数2.2起始地址

函数2.2结束地址

函数2.m名

函数2.m起始地址

函数2.m结束地址

任务k标识

任务k名

函数k.1名

函数k.1起始地址

函数k.1结束地址

函数k.2名

函数k.2起始地址

函数k.2结束地址

函数k.l名

函数k.l起始地址

函数k.l结束地址

图3可编程器件内配置信息示意图

图5任务控制块实例示意图

wdb_info{

intwdbState;

REG_SET*wdbRegisters;

struct

{

void*wdb1;

void*wdb2;

}wdbEvtList;

intbpAddr;

inttaskBpAddr;

inttaskPc;

inttaskFp;

inttaskSp;

VOIDFUNCPTRwdbExitHook;

}WDB_INFO;

typedefstruct/*REG_SET*/

_RTypegpr[GREG_NUM];

/*generalpourposeregisters*/

_RTypemsr;

/*machinestateregister*/

_RTypelr;

/*linkregister*/

_RTypectr;

/*countregister*/

_RTypepc;

/*programcounter*/

UINT32cr;

/*conditionregister*/

UINT32xer;

/*fixed-pointexceptionregister*/

}REG_SET;

typedefstructwindTcb/*WIND_TCB-taskcontrolblock*/

char*name;

/*0x34:

pointertotaskname*/

intoptions;

/*0x38:

taskoptionbits*/

UINTstatus;

/*0x3c:

statusoftask*/

FUNCPTRentry;

/*0x74:

entrypointoftask*/

char*pStackBase;

/*0x78:

pointstobottomofstack*/

char*pStackLimit;

/*0x7c:

pointstostacklimit*/

char*pStackEnd;

/*0x80:

pointstoinitstacklimit*/

REG_SET*pExcRegSet;

/*0xd8:

exceptionregSetptrorNULL*/

EVENTSevents;

/*0xdc:

eventinfoforthetask*/

WDB_INFO*pWdbInfo;

/*0xe8:

ptrtoWDBinfo-futureuse*/

void*pPthread;

/*0xec:

ptrtopthreaddatastructs*/

#if(CPU_FAMILY==PPC)

EXC_INFOexcInfo;

/*0x108:

exceptioninfo*/

UINTpCoprocCtx;

/*0x12c:

pointertoCoprocessorCtx*/

REG_SETregs;

/*0x130:

registerset*/

#endif/*(CPU_FAMILY==PPC)*/

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2