G06F12/02
1.一种嵌入式系统中内存管理的方法,其特征在于,包括:
在嵌入式系统的应用模块存在针对引擎的任务需求时,向该引擎发送查询信息;
该引擎根据所述查询信息,反馈需要的内存大小;
所述应用模块向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;
该引擎利用所述内存空间,处理来自所述应用模块的任务。
2.如权利要求1所述的方法,其特征在于,所述该引擎利用所述内存空间,处理来自所述应用模块的任务的步骤,包括:
在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
在接收到引擎内各模块的内存释放请求时,释放相应的申请内存,并调整所述内存控制信息。
3.如权利要求2所述的方法,其特征在于,所述该引擎利用所述内存空间,处理来自所述应用模块的任务的步骤,还包括:
按照后进先出原则利用所述内存空间。
4.如权利要求2所述的方法,其特征在于,所述内存控制信息包括地址偏移,所述地址偏移的初始值为0;
所述内存申请请求包括有申请内存大小;
所述内存申请请求处理步骤包括:
将所述内存空间首地址+地址偏移作为申请内存的首地址,返回给所述引擎内各模块;
将地址偏移更新为地址偏移+申请内存大小;
和/或,
所述内存释放请求处理步骤包括:
根据所述内存释放请求,释放相应的申请内存;
将地址偏移更新为地址偏移-申请内存大小。
5.如权利要求1所述的方法,其特征在于,还包括:
在任务处理完毕时,该引擎向所述应用模块发送内存空间释放通知。
6.如权利要求1所述的方法,其特征在于,依据如下步骤统计所述内存大小:
在调试阶段,所述应用模块向嵌入式系统申请调试内存空间,并在申请成功后,将所述调试内存空间首地址传送给该引擎;
该引擎利用调试内存空间,统计处理任务所需消耗的内存,所述统计过程包括:
设置累计内存消耗值和内存消耗峰值,并赋初始值为0;
在为引擎内各模块分配内存时,将所述累计内存消耗值更新为累计内存消耗+分配内存大小;
若当前累计内存消耗大于内存消耗峰值,则将内存消耗峰值赋为当前累计内存消耗值;
在释放分配内存时,将所述累计内存消耗更新为累计内存消耗值-分配内存大小;
在任务处理完毕时,以所述内存消耗峰值作为所述内存大小。
7.一种嵌入式系统中内存管理的装置,其特征在于,包括:
应用模块,位于嵌入式系统中,包括:
发送模块,用于在存在针对引擎的任务需求时,向引擎发送查询信息;及
申请传送模块,用于向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;及
引擎,包括:
反馈模块,用于根据所述查询信息,反馈需要的内存大小;及
任务处理模块,用于利用所述内存空间,处理来自所述应用模块的任务。
8.如权利要求7所述的装置,其特征在于,所述任务处理模块包括:
内存申请请求处理子模块,用于在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
内存释放请求处理子模块,在接收到引擎内各模块的内存释放请求时,释放相应的申请内存,并调整所述内存控制信息。
9.如权利要求8所述的装置,其特征在于,所述任务处理模块还包括:
管理子模块,用于按照后进先出原则管理所述申请内存。
10.如权利要求8所述的装置,其特征在于,所述内存控制信息包括地址偏移,所述地址偏移的初始值为0;
所述内存申请请求包括有申请内存大小;
所述内存申请请求处理子模块包括:
返回单元,用于将所述内存空间首地址+地址偏移作为申请内存的首地址,返回给引擎内各模块;及
更新单元,用于将地址偏移更新为地址偏移+申请内存大小;和/或,
所述内存释放请求处理子模块包括:
释放单元,用于根据所述内存释放请求,释放相应的申请内存;及
第二更新单元,用于将地址偏移更新为地址偏移-申请内存大小。
技术领域
本发明涉及嵌入式技术领域,特别是涉及一种嵌入式系统中内存管理的方法和装置。
背景技术
由于内存空间配置与嵌入式系统成本紧密相关,故嵌入式系统中内存管理是非常重要的一环。
不同的嵌入式系统,往往有不同的内存管理机制,由于不同的内存管理机制会存在不同的内存限制,其中,所述内存限制主要包括:应用申请堆空间的次数、每次申请的大小、申请空间的内存位置与方式等。因此,一套封闭的内存管理机制不可能适用于市场上各种各样的嵌入式系统。这样,一套引擎若要在一个新的嵌入式系统上正常运行,就不得不根据这个嵌入式系统的内存限制做一些调整,这就是所谓的平台适配。
根据嵌入式系统的不同,具体的平台适配工作也会有所区别,具体可以概括为如下几点:修改内存申请API(应用程序编程接口,Application Programming Interface);修改内存申请的空间大小;修改内存申请的次数,等等。
但是,平台适配工作是一项消耗大量的人力资源与时间成本的工作;另外,由于牵扯到代码修改,每一次平台适配工作都有可能会引入一些程序漏洞(bug),这无疑增加了研发的风险成本。
总之,需要本领域技术人员迫切解决的一个技术问题就是:如何能够降低平台适配所消耗的人力和时间成本。
发明内容
本发明所要解决的技术问题是提供一种嵌入式系统中内存管理的方法和装置,用以省去引擎的平台适配工作,并且,能够减小引擎在内存空间开辟方面的工作量。
为了解决上述问题,本发明公开了一种嵌入式系统中内存管理的方法,包括:
在嵌入式系统的应用模块存在针对引擎的任务需求时,向该引擎发送查询信息;
该引擎根据所述查询信息,反馈需要的内存大小;
所述应用模块向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;
该引擎利用所述内存空间,处理来自所述应用模块的任务。
优选的,所述该引擎利用所述内存空间,处理来自所述应用模块的任务的步骤,包括:
在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
在接收到引擎内各模块的内存释放请求时,释放相应的申请内存,并调整所述内存控制信息。
优选的,所述该引擎利用所述内存空间,处理来自所述应用模块的任务的步骤,还包括:
按照后进先出原则利用所述内存空间。
优选的,所述内存控制信息包括地址偏移,所述地址偏移的初始值为0;
所述内存申请请求包括有申请内存大小;
所述内存申请请求处理步骤包括:
将所述内存空间首地址+地址偏移作为申请内存的首地址,返回给所述引擎内各模块;
将地址偏移更新为地址偏移+申请内存大小;
和/或,
所述内存释放请求处理步骤包括:
根据所述内存释放请求,释放相应的申请内存;
将地址偏移更新为地址偏移-申请内存大小。
优选的,所述方法还包括:
在任务处理完毕时,该引擎向所述应用模块发送内存空间释放通知。
优选的,依据如下步骤统计所述内存大小:
在调试阶段,所述应用模块向嵌入式系统申请调试内存空间,并在申请成功后,将所述调试内存空间首地址传送给该引擎;
该引擎利用调试内存空间,统计处理任务所需消耗的内存,所述统计过程包括:
设置累计内存消耗值和内存消耗峰值,并赋初始值为0;
在为引擎内各模块分配内存时,将所述累计内存消耗值更新为累计内存消耗+分配内存大小;
若当前累计内存消耗大于内存消耗峰值,则将内存消耗峰值赋为当前累计内存消耗值;
在释放分配内存时,将所述累计内存消耗更新为累计内存消耗值-分配内存大小;
在任务处理完毕时,以所述内存消耗峰值作为所述内存大小。
依据另一实施例,本发明还公开了一种嵌入式系统中内存管理的装置,包括:
应用模块,位于嵌入式系统中,包括:
发送模块,用于在存在针对引擎的任务需求时,向引擎发送查询信息;及
申请传送模块,用于向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;及
引擎,包括:
反馈模块,用于根据所述查询信息,反馈需要的内存大小;及
任务处理模块,用于利用所述内存空间,处理来自所述应用模块的任务。
优选的,所述任务处理模块包括:
内存申请请求处理子模块,用于在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
内存释放请求处理子模块,在接收到引擎内各模块的内存释放请求时,释放相应 的申请内存,并调整所述内存控制信息。
优选的,所述任务处理模块还包括:
管理子模块,用于按照后进先出原则管理所述申请内存。
优选的,所述内存控制信息包括地址偏移,所述地址偏移的初始值为0;
所述内存申请请求包括有申请内存大小;
所述内存申请请求处理子模块包括:
返回单元,用于将所述内存空间首地址+地址偏移作为申请内存的首地址,返回给引擎内各模块;及
更新单元,用于将地址偏移更新为地址偏移+申请内存大小;
和/或,
所述内存释放请求处理子模块包括:
释放单元,用于根据所述内存释放请求,释放相应的申请内存;及
第二更新单元,用于将地址偏移更新为地址偏移-申请内存大小。
与现有技术相比,本发明具有以下优点:
本发明通过嵌入式系统的应用模块来申请内存空间,由于所述应用模块位于嵌入式系统上,在内存空间申请方面不受平台适配、堆空间整体用量、申请次数等束缚;这样,引擎只需告知所述应用模块需要的内存大小,即可获得与该内存大小相应的内存空间,因此,本发明可以省去现有技术中引擎的平台适配工作,以及,所述平台适配工作所消耗的人力和时间成本;
其次,假设引擎中有N个模块,那么,现有技术中,引擎需要通过内存申请函数、内存释放函数向嵌入式系统申请开辟N次内存空间,而本发明只需要开辟一块与所述内存大小相应的内存空间,因而能够将引擎开辟空间的次数从N次减少到1次;对于那些对申请内存空间次数有限制的平台,这样的优化显然能够提升引擎的平台适应性;
再者,本发明在调试阶段统计获得所述内存大小,由于与非调试阶段相同,所述调试阶段也需要为这些引擎内各模块开辟内存空间,因此,调试阶段统计的内存大小能够准确地从整体上反映引擎实际处理任务所需的堆空间用量;
另外,本发明按照后进先出原则利用所述内存空间,这样,在释放一块申请内存时,引擎总是知道所述内存空间中的最后一块申请内存是谁申请的,因而能够避免利用不当导致的内存碎片等内存资源浪费,同时也可避免内存泄露问题。
附图说明
图1是本发明一种统计内存大小方法实施例的流程图;
图2是本发明一种嵌入式系统中内存管理的方法实施例的流程图;
图3是本发明一种嵌入式系统中内存管理的装置实施例的结构图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
本发明实施例的核心构思之一在于,通过嵌入式系统的应用模块来申请内存空 间,由于所述应用模块位于嵌入式系统上,在内存空间申请方面不受平台适配、堆空间整体用量、申请次数等束缚;这样,引擎只需告知所述应用模块需要的内存大小,即可获得与该内存大小相应的内存空间,因此,本发明可以省去现有技术中引擎的平台适配工作,并且,能够提高引擎在内存方面的使用效率。
参照图1,示出了本发明一种统计内存大小方法实施例的流程图,具体可以包括:
步骤101、在调试阶段,应用模块向嵌入式系统申请调试内存空间,并在申请成功后,将所述调试内存空间首地址传送给引擎;
一个人工智能引擎往往是一个集合了多领域研究成果的复杂系统,引擎中的每个引擎内各模块都是相对独立的。那么其中一个模块在工作时需要的空间,往往需要从堆空间上开辟出来。
本发明实施例在调试阶段统计引擎处理任务所消耗的内存大小;与非调试阶段(正常工作阶段)相同,调试阶段也需要为这些模块开辟内存空间,因此,调试阶段统计的内存大小能够准确地反映引擎实际处理任务所需的堆空间用量。
在调试阶段,由于不知道所述内存大小,所述应用模块会申请一块足够大的内存空间,并反馈给该引擎。
步骤102、该引擎利用调试内存空间,统计处理任务所需消耗的内存,所述统计过程具体可以包括:
步骤121、设置累计内存消耗值和内存消耗峰值,并赋值为0;
步骤122、在为引擎内各模块分配内存时,将所述累计内存消耗值更新为累计内存消耗+分配内存大小;
步骤123、若当前累计内存消耗大于内存消耗峰值,则将内存消耗峰值赋为当前累计内存消耗值;
步骤124、在释放分配内存时,将所述累计内存消耗更新为累计内存消耗值-分配内存大小;
步骤125、在任务处理完毕时,以所述内存消耗峰值作为所述内存大小。
在引擎运行(处理任务)过程中,所述累计内存消耗值会在分配内存时增加,以及,在释放内存时减小,由于所述内存消耗峰值仅是记录当前最大的累计内存消耗值,所以最终得到的内存消耗峰值能够准确反映引擎运行所需的最大内存值,也即,统计的内存大小在非调试阶段足够利用,且不会产生浪费。
对于已分配的所述调试内存空间,如果引擎利用不当,可能会出现内存碎片,造成内存资源被大量浪费。
针对所述内存碎片问题,本发明按照后进先出原则,管理所述调试内存空间内部的每次申请内存,也即,最先分配的申请内存,最后被释放;依据后进先出原则,对于当前发出释放请求的引擎内各模块,其总是知道所述调试内存空间中的最后一块申请内存是自己申请的,因而每个内存块都是连续排布的,从而能够避免内存碎片问题,提升内存使用效率。
例如,在调试阶段还可以通过如下步骤检测是否按照后进先出原则:
设置申请记录数组,并对该申请记录数组元素赋0值;
在第M次分配内存时,将该申请记录数组的第M-1个元素赋为分配内存大小,其 中,M≥1;
在释放分配内存时,判断该申请记录数组中最后一个非0元素是否与当前分配内存大小相等,若是,则将该非0元素清零,否则报错。
如果最后一个非0元素与当前分配内存大小不等,则说明没有按照后进先出原则利用所述调试内存空间,可以报错。进一步,在任务处理完毕时,如果该申请记录数组中的元素不全为0,则说明引擎有内存泄露问题,也可以报错。
可以理解,在任务处理完毕时,引擎可以向所述应用模块发送通知信息,由所述应用模块进行所述调试内存空间的释放。
参照图2,示出了本发明一种嵌入式系统中内存管理的方法实施例的流程图,具体可以包括:
步骤201、在嵌入式系统的应用模块存在针对引擎的任务需求时,向该引擎发送查询信息;
本发明可以应用于智能工控设备、POS(销售终端,Point of Sale)/ATM(自动取款机,Automatic Teller Machine)机、IC(集成电路,IntegratedCircuit)卡等工业控制嵌入式系统,机顶盒、数字电视、WebTV(网络电视)、网络冰箱、网络空调等众多消费类和医疗保健类电子设备,以及,多媒体手机、袖珍电脑、掌上电脑、车载导航器等嵌入式系统。
以多媒体手机为例,假设某个多媒体应用模块在执行“播报短信”业务时,需要将文本转换成语音,此时可以向相应文本语音转换发送查询信息。
这里,所述查询信息可以依据所述应用模块和引擎之间的协议确定,本发明对此不加以限制。
步骤202、该引擎根据所述查询信息,反馈需要的内存大小;
所述内存大小为引擎在调试阶段统计获得,例如,其可以为50M、100M等。
步骤203、所述应用模块向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;
步骤204、该引擎利用所述内存空间,处理来自所述应用模块的任务。
在实际中,所述步骤204具体可以包括:
子步骤A1、在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
子步骤A2、在接收到引擎内各模块的内存释放请求时,释放相应的申请内存,并调整所述内存控制信息。
例如,所述内存控制信息可以包括地址偏移offset,所述地址偏移offset的初始值为0;
所述内存申请请求可以包括有申请内存大小size;
相应地,所述子步骤A1的实现过程可以为:
首先,将所述内存空间首地址0x00000000+地址偏移offset作为申请内存的首地址,返回给所述引擎内各模块;
然后,将地址偏移offset更新为地址偏移offset+申请内存大小size;
和/或,
所述子步骤A2的实现过程可以包括:
首先,根据所述内存释放请求,释放相应的申请内存;
然后,将地址偏移offset更新为地址偏移offset-申请内存大小size。
需要说明的是,作为申请内存首地址的返回对象,所述引擎内各模块是指发出内存申请请求的当前模块,所述子步骤A1和A2分别对内存申请请求和内存释放请求的响应方案进行了说明,因而,本发明对申请对象、返回对象等操作对象不做具体限制。
在引擎的工作阶段(非调试阶段),本发明同样可以按照后进先出原则利用所述内存空间,以避免利用不当带来的内存泄露等问题;假设在内存空间中分别开辟了A(0x00000000+0x00100000)、B(0x00100000+0x01000000)、C(0x01000000+0x01100000)三块申请内存,三块内存连续排布,从而避免内存碎片问题。它们的释放顺序则为C、B、A;由于在释放一块申请内存时,引擎总是知道所述内存空间中的最后一块申请内存是谁申请的,例如,释放A时,所述最后一块申请内存是0x00000000+0x00100000,释放后内存偏移归零,因而能够检查内存泄露问题。
可以理解,在任务处理完毕时,该引擎可以向所述应用模块发送内存空间释放通知。
本发明具有如下优点:
1、由于通过应用模块来开辟内存,因此可以避免了现有技术中的平台适配工作;
2、现有技术中,引擎往往通过OslMalloc,applib_mem_ap_alloc,med_alloc_ext_mem等函数向嵌入式系统申请内存,以及,通过free、delete等函数向嵌入式系统申请释放内存;假设引擎中有N个模块,那么,在引擎运行过程中,需要引擎向嵌入式系统申请开辟N次内存空间。而本发明只需要开辟一块与内存大小相应的内存空间,因而能够将引擎开辟空间的次数从N次减少到1次;
3、本发明在调试阶段统计获得所述内存大小,由于与非调试阶段相同,所述调试阶段也需要为引擎内的这些模块开辟内存空间,因此,调试阶段统计的内存大小能够准确地从整体上反映引擎实际处理任务所需的堆空间用量。
与前述内存管理方法实施例相应,本发明还公开了一种嵌入式系统中内存管理的装置,参照图3,具体可以包括:
应用模块301,位于嵌入式系统中,具体可以包括:
发送模块311,用于在存在针对引擎的任务需求时,向引擎发送查询信息;及
申请传送模块312,用于向嵌入式系统申请与所述内存大小相应的内存空间,并在申请成功后,将所述内存空间首地址传送给该引擎;及
引擎302,具体可以包括:
反馈模块321,用于根据所述查询信息,反馈需要的内存大小;及
任务处理模块322,用于利用所述内存空间,处理来自所述应用模块的301任务。
在本发明的一种优选实施例中,所述任务处理模块322具体可以包括:
内存申请请求处理子模块,用于在接收到引擎内各模块的内存申请请求时,依据内存控制信息,返回相应申请内存的首地址,并调整所述内存控制信息;
内存释放请求处理子模块,在接收到引擎内各模块的内存释放请求时,释放相应的申请内存,并调整所述内存控制信息。
例如,所述内存控制信息可以包括地址偏移,所述地址偏移的初始值为0;
所述内存申请请求可以包括有申请内存大小;
相应地,所述内存申请请求处理子模块具体可以包括:
返回单元,用于将所述内存空间首地址+地址偏移作为申请内存的首地址,返回给引擎内各模块;及
更新单元,用于将地址偏移更新为地址偏移+申请内存大小;
和/或,
所述内存释放请求处理子模块可以包括如下单元:
释放单元,用于根据所述内存释放请求,释放相应的申请内存;及
第二更新单元,用于将地址偏移更新为地址偏移-申请内存大小。
为避免内存利用不当导致的内存泄露问题,在本发明的另一种优选实施例中,所述任务处理模块322还可以包括:
管理子模块,用于按照后进先出原则管理所述申请内存。
可以理解,在任务处理完毕时,所述引擎302还可以向所述应用模块发送内存空间释放通知。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本发明所提供的一种嵌入式系统中内存管理的方法和装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
本文发布于:2023-04-14 13:06:22,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/4/86496.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |