嵌入式软件堆栈溢出检测方法和装置制造方法及图纸

技术编号:17346122 阅读:56 留言:0更新日期:2018-02-25 11:13
本发明专利技术公开了一种嵌入式软件堆栈溢出检测方法和装置,所述方法包括:通过链接文件将处理器随机存储器空间划分为堆栈区、堆栈溢出缓冲区和全局变量区;并在所述堆栈溢出缓冲区定义一个堆栈溢出缓冲数组;处理器上电,开启定时器;在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出;将溢出的上下文信息存入所述堆栈溢出缓冲数组;判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。本发明专利技术通过设置堆栈溢出缓冲区,保证了浅度堆栈溢出不会造成系统运行异常,并且可以辅助开发人员进行程序修正。

【技术实现步骤摘要】
嵌入式软件堆栈溢出检测方法和装置
本专利技术主要应用于软件测试领域,具体为一种嵌入式软件堆栈溢出检测方法和装置。
技术介绍
面向特定应用的嵌入式系统一般会根据实际需求选择规格适中的MCU,采用C语言进行软件开发。在MCU的地址空间中,RAM是一段连续分配的线性空间,全局变量、堆(Heap)、堆栈(Stack)都分配在这段有限的线性空间内,根据实际需要,嵌入式系统还可能把FLASH中一段代码重定位到一段RAM空间内运行,以加快程序运行速度,提高系统实时性。但由于RAM资源有限,不可能为堆栈分配太大的尺寸。堆栈尺寸设置过小、局部变量尺寸定义过大、中断优先级设置不合理、中断服务程序过长导致中断嵌套、递归调用、函数调用层次过深等程序设计不当之处都可能导致堆栈溢出。堆栈溢出会改变临近堆栈的RAM空间中的内容,临近堆栈的RAM空间的数据变化也会改变堆栈内容,从而造成程序运行异常,发生故障甚至导致重大事故。为了确定堆栈空间的尺寸,需要根据源程序中每个函数的局部变量大小确定每个函数的堆栈使用量,然后根据编译器生成的函数调用列表为每个函数建立调用树,检查每棵调用树,确定从树根到树叶的调用路径的堆栈使用量,从中选出最大堆栈使用量,同时,还要仔细分析系统用到的所有中断,确定中断服务程序的堆栈使用量。但是,我们无法得知C标准库函数以及大值整数的乘除、浮点运算等对应的运行库函数的堆栈使用量,这种静态分析方式得到的数据并不完善,而且这种方式依赖于具体的应用和源程序实现方式,缺乏通用性。专利文献CN201610080939.2公开了一种适用于多任务软件进程堆栈使用深度检测的方法,触发被测软件执行最大运行路径测试,通过任务堆栈区初始化值的变化判断堆栈使用量,这种方式需要开发人员分析被测软件,才能确定出最大运行路径,同时通过专用指令触发被测软件执行最大运行路径,违反了产品正常的使用过程,而且忽略了中断对堆栈的消耗,不能反映真实的堆栈使用情况。如何在不影响软件正常运行的情况下检测堆栈使用情况,保证发生溢出时进行及时应对,仍是目前需要本领域技术人员迫切解决的一个技术问题。
技术实现思路
为了解决上述问题,本专利技术提供了一种嵌入式软件堆栈溢出检测方法,设置一堆栈溢出缓冲区,隔离堆栈和全局变量分区,在不影响系统正常运行的情况下,在不受堆栈溢出影响的定时器中断服务程序中,周期检测堆栈使用量,将最大堆栈使用量和系统发生堆栈溢出后的部分上下文数据存入非易失性存储器,并通过控制LED提示堆栈溢出情况。系统在实际环境中运行一段时间后,通过查看LED状态以及读取非易失性存储器中的数据,便可以判断堆栈使用情况,通过保存的溢出上下文数据分析程序异常位置,从而调整堆栈尺寸或者调整程序设计,以提高系统运行的稳定性。为了实现上述目的,本专利技术采用如下技术方案:一种嵌入式软件堆栈溢出检测方法,包括以下步骤:步骤1:通过链接文件将处理器随机存储器空间划分为堆栈区、堆栈溢出缓冲区和全局变量区;并在所述堆栈溢出缓冲区定义一个堆栈溢出缓冲数组;步骤2:处理器上电,开启定时器;步骤3:在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;步骤4:判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出,进入下一步;若否,返回步骤3;步骤5:将溢出的上下文信息存入所述堆栈溢出缓冲数组;步骤6:判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。所述步骤1中划分随机存储器空间的方法为:按从顶部到底部的顺序,将随机存储器空间划分为依次相邻的堆栈区、堆栈溢出缓冲区和全局变量区;尺寸关系为:RAM_SIZE>=STACK_SIZE+STACK_BUF+APP_RAM_SIZERAM_SIZE为随机存储器尺寸,STACK_SIZE为堆栈区尺寸,STACK_BUF为堆栈溢出缓冲区尺寸,APP_RAM_SIZE为全局变量区尺寸。所述步骤2还包括初始化堆栈指针位置、堆栈区数据和堆栈溢出缓冲数组,并初始化最大堆栈使用量为0。所述步骤3具体包括:步骤3.1:在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算当前堆栈使用量;步骤3.2:判断当前堆栈使用量是否大于最大堆栈使用量,若是,将所述当前堆栈使用量赋值给最大堆栈使用量,若否,返回步骤3.1。所述步骤3.1中当前堆栈使用量计算方法为:当前堆栈使用量=STACK_SIZE+STACK_BUF-Read_times所述步骤6具体包括:步骤6.1:判断所述最大堆栈使用量是否小于或等于预设阈值:如果小于,点亮LED进行提示;如果等于,闪烁LED灯进行提示;步骤6.2:检查LED状态,如果为点亮或者闪烁,读取最大堆栈使用量和堆栈溢出缓冲数组,根据所述堆栈溢出缓冲数组中的数据判断堆栈溢出位置。其中,所述预设阈值为堆栈区尺寸+堆栈溢出缓冲区尺寸。所述方法还包括步骤7:修改程序设计或者增加堆栈空间的尺寸,然后返回步骤1判断能否满足要求。根据本专利技术的第二目的,本专利技术提供了一种计算机装置,用于嵌入式软件堆栈溢出检测,包括随机存储器、处理器及存储在随机存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤,包括:接收用户对处理器随机存储器的空间划分,所述空间划分将随机存储器划分为堆栈区、堆栈溢出缓冲区和全局变量区,并接收在堆栈溢出缓冲区上设置的堆栈溢出缓冲区数组;接收上电指令,开启定时器;在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出,进入下一步;若否,继续计算最大堆栈使用量;将溢出的上下文信息存入所述堆栈溢出缓冲数组;判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。根据本专利技术的第三目的,本专利技术提供了一种计算机可读存储介质,其上存储有嵌入式软件堆栈溢出检测的计算机程序,该程序被处理器执行时实现以下步骤:接收用户对处理器随机存储器的空间划分,所述空间划分将随机存储器划分为堆栈区、堆栈溢出缓冲区和全局变量区,并接收在堆栈溢出缓冲区上设置的堆栈溢出缓冲区数组;接收上电指令,开启定时器;在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出,进入下一步;若否,继续计算最大堆栈使用量;将溢出的上下文信息存入所述堆栈溢出缓冲数组;判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。本专利技术的有益效果:(1)本专利技术的堆栈检测不影响软件的正常运行,在软件运行过程中实时检测堆栈使用情况。(2)本专利技术堆栈溢出及使用量检测函数位于定时器中断服务程序中,即使发生堆栈溢出,MCU也会响应定时器中断,会执行堆栈检测函数。(3)本专利技术设置了堆栈缓冲溢出区,隔离堆栈和全局变量分区,浅度的堆栈溢出不会影响全局变量,不会造成系统运行异常。(4)本专利技术在堆栈溢出后,将关键的上下文数据存放在堆栈溢出缓冲区,将堆栈溢出缓冲区数据存入非易失性存储器,可以帮助开发人员判断溢出原因,检查程序缺陷。附图说明构成本申请的一部分本文档来自技高网
...
嵌入式软件堆栈溢出检测方法和装置

【技术保护点】
一种嵌入式软件堆栈溢出检测方法,其特征在于,包括以下步骤:步骤1:通过链接文件将处理器随机存储器空间划分为堆栈区、堆栈溢出缓冲区和全局变量区;并在所述堆栈溢出缓冲区定义一个堆栈溢出缓冲数组;步骤2:处理器上电,开启定时器;步骤3:在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;步骤4:判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出,进入下一步;若否,返回步骤3;步骤5:将溢出的上下文信息存入所述堆栈溢出缓冲数组;步骤6:判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。

【技术特征摘要】
1.一种嵌入式软件堆栈溢出检测方法,其特征在于,包括以下步骤:步骤1:通过链接文件将处理器随机存储器空间划分为堆栈区、堆栈溢出缓冲区和全局变量区;并在所述堆栈溢出缓冲区定义一个堆栈溢出缓冲数组;步骤2:处理器上电,开启定时器;步骤3:在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算最大堆栈使用量;步骤4:判断所述最大堆栈使用量是否大于堆栈区尺寸,若是,判断为堆栈溢出,进入下一步;若否,返回步骤3;步骤5:将溢出的上下文信息存入所述堆栈溢出缓冲数组;步骤6:判断所述最大堆栈使用量是否小于或等于预设阈值,若是,根据堆栈溢出缓冲数组判断堆栈溢出位置。2.如权利要求1所述的一种嵌入式软件堆栈溢出检测方法,其特征在于,所述步骤1中划分随机存储器空间的方法为:按从顶部到底部的顺序,将随机存储器空间划分为依次相邻的堆栈区、堆栈溢出缓冲区和全局变量区;尺寸关系为:RAM_SIZE>=STACK_SIZE+STACK_BUF+APP_RAM_SIZERAM_SIZE为随机存储器尺寸,STACK_SIZE为堆栈区尺寸,STACK_BUF为堆栈溢出缓冲区尺寸,APP_RAM_SIZE为全局变量区尺寸。3.如权利要求1所述的一种嵌入式软件堆栈溢出检测方法,其特征在于,所述步骤2还包括初始化堆栈指针位置、堆栈区数据和堆栈溢出缓冲数组,并初始化最大堆栈使用量为0。4.如权利要求1所述的一种嵌入式软件堆栈溢出检测方法,其特征在于,所述步骤3具体包括:步骤3.1:在所述定时器的中断服务程序中,读取堆栈溢出缓冲区和堆栈区的数据,计算当前堆栈使用量;步骤3.2:判断当前堆栈使用量是否大于最大堆栈使用量,若是,将所述当前堆栈使用量赋值给最大堆栈使用量,若否,返回步骤3.1。5.如权利要求2所述的一种嵌入式软件堆栈溢出检测方法,其特征在于,所述步骤3.1中当前堆栈使用量计算方法为:当前堆栈使用量=STACK_SIZE+STACK_BUF-Read_times6.如权利要求1所述的一种嵌入式软件堆栈溢出检测方法,其特征在于,所述步骤6具体包括:步骤6.1:判断所述最大堆栈使用...

【专利技术属性】
技术研发人员:马建辉王知学侯冬冬胡代荣孙常青
申请(专利权)人:山东省科学院自动化研究所
类型:发明
国别省市:山东,37

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1