ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:255.06KB ,
资源ID:6556302      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6556302.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一种嵌入式系统内存越界错误快速定位方法Word文档格式.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、2. 如权利要求1所述的嵌入式系统,其特征在于:该嵌入式系统的软件基于实时多任务操作系统,该实时多任务操作系统可以是VXWORKS、LINUX、OS II、ECOS等嵌入式操作系统中的一种。 3. 如权利要求1所述的嵌入式系统,其特征在于:可编程逻辑器件可以是GAL、CPLD或FPGA等器件,如系统内已有此类器件,可直接与其它功能模块复用此器件,而不需专门增加一片此类器件;如系统内没有此类器件,则可视具体情况选用合适的器件。4. 如权利要求1所述的嵌入式系统,其特征在于:配置到可编程逻辑器件中的内存范围信息包含最低内存地址和最高内存地址,可同时配置一条或多条内存范围信息。5. 如权利要求1所述

2、的嵌入式系统,其特征在于:配置到可编程逻辑器件中的任务信息包含任务标识和任务名,函数信息包含函数名、函数起始地址和函数结束地址,任务信息和函数信息都可以配置一条或多条,函数信息必需与某任务信息关联。说 明 书技术领域本发明涉及一种嵌入式系统中的内存越界错误快速定位方法,具体涉及一种借助于可编程逻辑器件,结合硬件和软件,快速确定引起内存越界错误的任务/进程以及该任务/进程调用的直接引起内存越界错误的具体函数的方法。 背景技术内存越界错误是软件中比较常见的错误,也是非常致命的错误。C语言的广泛应用是一把双刃剑,好处是:它使大量的没受过专业教育的人员能够较快的具备程序设计能力,也使软件编码过程大大缩

3、短,坏处是:或者由于项目进度的压力,或者由于程序员的责任心不强,很多应该在编译阶段就排除的软件错误,最后演变成严重甚至致命的运行时错误,内存越界错误多数就由此产生,如附图4.a、4.b、4.c和4.d这几种情况,错误的根源都很微小,或掉了各“*”号,或循环变量数值多了1,看起来只是个简单笔误,但引起了内存越界错误。内存越界错误由于对内存的不合法使用,产生的后果非常严重,轻者由于使用的数据并非正确数据,导致系统输出错误的结果,如附图4.a 和4.c的情形,虽然软件读越界或写越界,但由于误读的数据或误修改的数据未进一步使用,而是直接输出了,在这种情况下,系统仍健壮,但输出结果错误;重者由于越界错误

4、破坏了系统核心,导致系统崩溃,如附图4.b 和4.d的情形,前者将一个非预期的数据当作一个函数执行,后果可想而知,后者则直接清除了中断向量表,系统产生中断时系统将崩溃。而且,随着系统趋于庞大,内存越界错误越来越难找到直接原因,尤其是在引起内存越界的执行路径执行的概率非常低时。一个模块引起的内存越界错误,排查时间有时甚至超过设计该模块的时间。嵌入式系统由于它本身的固有特性,调试往往采用结合主机和目标机的远程调试,每一步调试都需要主机和目标机的多次交互,调试效率极低,排查内存错误的困难远比单纯调试主机软件大。因此,调试主机软件的有效手段:“设断点“、“单步”、“在断点处检查变量和内存”等等,基本不

5、能在嵌入式系统中运用,排查嵌入式系统的隐蔽错误常常通过代码检查和在可疑代码内部插入打印某些重要变量的方式完成,而这些,也需要在花费大量的时间的基础上才能实现,并且,这些调试手段是否有效很大程度上依赖于编程人员的能力和经验。因此,如果能够找到一种更高效的内存错误定位方法对嵌入式系统开发是大有裨益的。发明内容本发明的目的是为尽快排除嵌入式系统已经发现的内存错误,提出了一种借助于可编程逻辑器件,结合硬件和软件的快速定位引起内存越界的原因的方法。该方法的基本思路是:首先,该方法需要硬件和软件一起配合实现,硬件是可编程逻辑器件,软件是一个中断服务程序和一个检测任务。在可编程逻辑器件上配置一个或多个需监测

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

7、内存区域的函数,如果该函数是该内存区域合法的访问函数,则系统恢复继续运行,否则确定该函数是直接引起内存越界的函数。该方法的功能结构如图1所示。在图1中,左边的流程图表示是可编程逻辑器件实现的功能,右边上半部分表示的是中断服务程序实现的功能,右边下半部分表示的是检测任务/进程实现的功能。附图说明图1 为电信级以太网系统中的虚拟硬件方法功能结构示意图。图2 为可编程逻辑器件与CPU的连接关系图。图3 为可编程逻辑器件内配置信息示意图。图4.a 为内存读越界对系统的轻度影响示意图。图4.b 为内存读越界对系统的崩溃性影响示意图。图4.c 为内存写越界对系统的轻度影响示意图。图4.d 为内存读越界对系

8、统的崩溃性影响示意图。图5 为实时多任务操作系统任务控制块实例。具体实施方式下面结合附图对本发明进行详细的描述。 可编程逻辑器件关联功能的实现图2是可编程器件和CPU的连接关系简图,这里只给出了为实现地址总线检测采样部分的连接关系图,而CPU管理和控制可编程器件的接口连接关系这里从略。CPU管理和控制可编程逻辑器件的接口用来实现CPU和可编程逻辑器件之间的信息交互,与系统使用可编程逻辑器件的一般情况相同,即可编程逻辑器件的内部存储作为CPU可访问的存储器或寄存器使用。系统使用SRAM 或DRAM(包括SDRAM和DDR等),地址总线检测的连接关系和逻辑是有很大差别的,图2实际给出了包括SRAM

9、 或DRAM的一个总的连接关系,实际应用中视具体情况而定。如果使用DRAM类,则只使用地址线“A0.A31”中的一个子集作为行地址和列地址输入, 行选“RAS”、列选“CAS”必须使用,使用SDRAM的系统,“SDRAM_CLK”也需采用。如果使用SRAM类,则地址线“A0.A31”视SRAM器件的情况选用,“RAS”、“CAS”和“SDRAM_CLK”则不采用。“INTR”是中断请求信号,当可编程逻辑器件判断地址总线采样命中某个配置的内存区域范围内,则使“INTR”有效。本方法中,可编程逻辑器件部分的功能如附图1左子图所示。首先,是CPU通过管理控制接口向可编程逻辑器件写入监视内存区域范围信

10、息(可以是一条或多条)、合法任务信息和合法访问函数信息(可以是一条或多条)。内存区域范围信息、合法任务信息和合法访问函数信息在可编程逻辑器件内部存储的结构如附图3所示,每条内存区域范围包括“起始地址”、“结束地址”、“活跃标记”信息,活跃标记表示本内存区域范围包含最近采样得到的地址,如果只配置一个内存区域范围,则活跃标记可不是用。任务信息包含“任务标识”和“任务名”,函数信息包含“函数名”、“函数起始地址”和“函数结束地址”信息,值得注意的是,函数信息一定与某个具体任务关联。上述内存区域范围信息、任务信息和函数信息可存储的条目数多少使可编程逻辑器件的容量和实际应用需要确定。在配置信息设置好后,

11、CPU可设定可编程逻辑器件的采样频率、并置“启动/停止”标志位为“启动”(“启动/停止”标志位为“启动”时,可编程逻辑器件开始周期性的对地址线采样等操作,否则不做任何操作),则可编程逻辑器件开始工作。值得注意的是,采样频率不应低于存储器的访问频率,否则,有可能一些重要的内存访问没有被监测到。当某次采样确定得到的地址落在某条配置好的内置区域范围内,而且配置的内存区域范围多于一条,则置位该内存区域范围的“活跃标记”,清除其它内存区域范围的“活跃标记”,并在中断请求信号“INTR”上输出一个脉冲。同时,置“启动/停止”标志位为“停止”。上述功能中,除配置信息通过CPU和可编程逻辑器件共同完成外,其它

12、功能由可编程逻辑器件自动完成。 中断服务程序关联的功能实现 本方法中,中断服务程序的功能如附图1右上子图所示。中断服务程序的设计随着CPU和实时多任务操作系统的不同可能存在较大的差异,但主要机制和原理是相似的。大多数情况下如下:初始化中断服务程序时将中断服务程序和一个中断向量相连,中断服务程序的起始关中断,中断服务程序结束时开中断。值得注意的是,在嵌入式系统中,中断服务程序不适宜占用太多得CPU时间,一般情况下,中断服务程序仅仅响应产生中断的时间,记录一些信息,然后通知关联的任务,大部分任务都交给关联的任务去完成。因此,本中断服务程序同样设计只做较少的工作,如附图1右上子图,中断服务程序响应中

13、断后,仅仅做合法任务过滤工作和可编程器件中“启动/停止”标志位修改工作。合法任务过滤工作放在中断服务程序中实现的原因是防止系统发生过多得任务调度,因为当前活跃任务不是监测任务,那么从当前活跃任务切换到监测任务系统需要重新调度。如果活跃任务信息过多,合法任务过滤工作也可从中断服务程序中移出到监测任务/进程中实现。中断服务程序修改“启动/停止”标志位的操作仅当当前活跃任务是命中的内存区域的合法访问任务时执行。 检测任务/进程关联的功能实现本方法中,监测任务/进程的功能如附图1右下子图所示。监测任务/进程是配合中断服务程序而设置的,从技术上来讲,监测任务/进程所做得工作在中断服务程序里都可以实现,但

14、嵌入式系统中,中断服务程序是不适合占用太多CPU时间,因此,大部分工作都移到任务中完成。首先,监测任务/进程需从中断服务程序得到通知(通常是以信号量传递的方式),然后开始执行自己的任务(如得不到中断服务程序通知,监测任务/进程则处于阻塞状态)。然后,监测任务/进程需从中断服务程序得到该内存区域的当前访问任务,如果设计的合法访问任务过滤功能不是由中断服务程序完成,那么监测任务/进程需完成此功能。如果合法访问任务过滤功能由监测任务/进程实现,且过滤结果接着,监测任务/进程还需完成合法访问过滤功能,如果说 明 书 附 图图 1INTR SDRAM CLKRASWECASA0A31图2 可编程器件与C

15、PU连接关系图内存区域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起始地

16、址函数k.l结束地址图3 可编程器件内配置信息示意图图5 任务控制块实例示意图wdb_info int wdbState; REG_SET * wdbRegisters; struct void * wdb1; void * wdb2; wdbEvtList; int bpAddr; int taskBpAddr; int taskPc; int taskFp;int taskSp; VOIDFUNCPTR wdbExitHook; WDB_INFO;typedef struct /* REG_SET */_RType gprGREG_NUM;/* general pourpose regis

17、ters */ _RType msr;/* machine state register */ _RType lr;/* link register */ _RType ctr;/* count register */ _RType pc;/* program counter */ UINT32 cr;/* condition register */ UINT32 xer;/* fixed-point exception register */ REG_SET;typedef struct windTcb /* WIND_TCB - task control block */ char * n

18、ame; /* 0x34: pointer to task name */ int options; /* 0x38: task option bits */ UINT status; /* 0x3c: status of task */ FUNCPTR entry; /* 0x74: entry point of task */ char * pStackBase; /* 0x78: points to bottom of stack */ char * pStackLimit; /* 0x7c: points to stack limit */ char * pStackEnd; /* 0

19、x80: points to init stack limit */ REG_SET * pExcRegSet; /* 0xd8: exception regSet ptr or NULL */ EVENTS events; /* 0xdc: event info for the task */ WDB_INFO * pWdbInfo; /* 0xe8: ptr to WDB info - future use */ void * pPthread; /* 0xec: ptr to pthread data structs */#if (CPU_FAMILY = PPC) EXC_INFO excInfo; /* 0x108: exception info */ UINT pCoprocCtx; /* 0x12c: pointer to Coprocessor Ctx */ REG_SET regs; /* 0x130: register set */#endif /* (CPU_FAMILY = PPC) */

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

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