如何统计各个全局变量占用内存的内存占用情况

一种内存占用情况统计装置及内存占用情况统计方法
专利名称一种内存占用情况统计装置及内存占用情况统计方法
技术领域本发明涉及计算机技术领域,尤其涉及一种内存占用情况统计装置及内存占用情 况统计方法。
背景技术在各种程序的开发过程中,程序运行时对系统内存的占用情况是衡量一个程序性 能的重要指标,内存占用多少,在长时间的运行过程中是否保持稳定的状态,这些信息对程 序开发人员而言相当重要。所以开发人员在程序开发过程中,需要一个能提供准确内存占 用信息,并能方便进行统计的内存占用情况统计装置,来协助定位程序中是否存在内存泄 露和性能瓶颈等问题。微软的Windows操作系统提供了一个比较方便的可显示内存占用情况的装置任 务管理器。这也是程序开发人员使用频率最高的工具之一。任务管理器提供了内存、处理 器、线程等等信息,能够满足普通系统操作用户的日常需求。但是,发明人发现,现有的显示内存占用情况的装置,如任务管理器存在明显的缺 陷
现有的显示内存占用情况的装置最大的缺陷就是系统信息不能保存,用户看到的只 能是当前的信息,以前的信息无法查询。因此,当需要跟踪和统计程序的运行情况时,现有 的显示内存占用情况的装置就无能为力了,用户只能每隔一段时间就要去观察内存使用情 况,并手动进行记录和统计,操作十分不便,效率也很低下。
本发明提供一种内存占用情况统计装置及内存占用情况统计方法,可以由用户指 定需要监控和统计的进程,对该进程的内存占用信息进行采样和保存,并自动进行统计,为 用户跟踪和统计程序的运行情况提供一个高效、方便的工具。本发明提供的内存占用情况统计装置包括
用于获取系统当前运行的所有进程的进程获取模块;
与所述进程获取模块相连以及内存监控模块、统计模块相连的人机交互模块,所述人 机交互模块用于向用户提供所述系统当前运行的所有进程供用户选择;在统计模块完成选 定进程的内存占用情况的统计后,向用户提供统计结果;
与所述人机交互模块以及统计模块相连的内存监控模块,所述内存监控模块用于监控 用户通过所述人机交互模块选定的进程,定时对该进程的内存占用情况进行采样,并向统 计模块发送采样数据;
与所述内存监控模块和人机交互模块相连的统计模块,所述统计模块用于接收所述内 存监控模块发送的采样数据,根据所述采样数据生成统计结果,并将所述统计结果交所述 人机交互模块进行显示。优选的,所述进程获取模块包括系统快照单元和进程获取单元;所述系统快照单元用于获取系统当前运行信息;所述进程获取单元与所述系统快照单元相连,用于从所述系统快照单元获取的系统当前运行信息中获取系统当前运行的所有进程,并向所述人机 交互模块发送所述系统当前运行的所有进程。优选的,所述人机交互模块包括信息显示单元和指令接收单元;所述信息显示 单元用于接收所述进程获取模块发送的系统当前运行的所有进程,并进行显示;所述指令 接收单元用于接收用户指令,并向内存监控模块转发所述用户指令;所述用户指令中包括 用户需要监控的进程的信息。优选的,所述指令接收单元接收的用户指令中还包括用于设定的内存监控模块 进行监控采样的时间间隔,以及监控采样的时长。优选的,所述内存监控模块包括交互单元、采样单元和计时控制单元,每个单元 都与另外两个单元相连;所述交互单元用于接收人机交互模块发送的用户指令,并向所述 统计模块发送所述采样单元获取的采样数据;所述计时控制单元用于根据所述交互单元接 收的用户指令,控制所述采样单元定时对相应进程的内存占用情况进行采样;所述采样单 元用于根据计时控制单元的控制,定时对相应进程的内存占用情况进行采样,并通过交互 单元将采样数据发送给统计模块。优选的,所述统计模块包括数据收发单元和与所述数据收发单元相连的存储统 计单元;所述数据收发单元用于接收内存监控模块发送的采样数据;在所述存储统计单元 完成对采样数据的统计后,向所述人机交互模块发送统计结果;所述存储统计单元存储所 述内存监控模块接收的采样数据,在所述内存监控模块完成全部采样后,对所有采用数据 进行统计;通过所述数据收发单元向人机交互模块发送统计结果。优选的,所述统计模块还包括统计算法单元,所述统计算法单元与存储统计单元 相连,用于存储对采样数据的统计算法;所述存储统计单元根据所述统计算法单元中的统 计算法对采用数据进行统计。相应的,本发明还提供一种内存占用情况统计方法,包括 获取系统当前运行的所有进程并向用户提供,供所述用户选择;
监控所述用户选定的进程,定时对该进程的内存占用情况进行采样,获取采样数据; 根据所述采样数据生成统计结果,并向用户显示所述统计结果。优选的,所述获取系统当前运行的所有进程并向用户提供,供所述用户选择包 括
获取系统当前运行信息;
从所述系统当前运行信息中获取系统当前运行的所有进程; 向用户提供所述系统当前运行的所有进程,供所述用户选择。优选的,所述获取系统当前运行的所有进程并向用户提供,供所述用户选择之后; 监控所述用户选定的进程之前,还包括
接收用户指令;所述用户指令中包括用户选定的、需要监控的进程的信息。优选的,所述用户指令中还包括对选定的进程进行监控采样的时间间隔、监控采 样的时长以及统计算法。优选的,所述根据所述采样数据生成统计结果,并向用户显示所述统计结果包 括在完成对所述进程的内存占用情况全部采样后,按照预设的统计算法对采用数据进行 统计;
向用户显示所述统计结果。本发明提供的内存占用情况统计装置及内存占用情况统计方法,可以由用户指定需要监控和统计的进程,对该进程的内存占用信息进行采样和保存,并自动进行统计,为用 户跟踪和统计程序进程的运行情况提供一个高效、方便的工具。
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可 以根据这些附图获得其他的附图。图1为本发明提供的内存占用情况统计装置主体结构示意图; 图2为本发明提供的内存占用情况统计装置详细结构示意图3为本发明提供的内存占用情况统计装置信息显示单元显示示意图; 图4为本发明提供的内存占用情况统计方法第一实施例流程示意图; 图5为本发明提供的内存占用情况统计方法第二实施例流程示意图。
具体实施例方式本发明提供的内存占用情况统计装置,可以由用户指定需要监控和统计的进程, 对该进程的内存占用信息进行采样和保存,并自动进行统计,为用户跟踪和统计程序进程 的运行情况提供一个高效、方便的工具。参见图1,为本发明提供的内存占用情况统计装置实施例结构示意图,如图1所 示,该装置包括
用于获取系统当前运行的所有进程的进程获取模块1 ;
与进程获取模块1以及内存监控模块3、统计模块4相连的人机交互模块2,人机交互 模块2用于向用户提供系统当前运行的所有程序进程供用户选择;在统计模块4完成选定 进程的内存占用情况统计后,向用户提供统计结果。与人机交互模块2以及统计模块4相连的内存监控模块3,内存监控模块3用于监 控用户通过人机交互模块选定的进程,定时对该进程的内存占用情况进行采样,并向统计 模块4发送采样数据。与内存监控模块3和人机交互模块2相连的统计模块4,统计模块4用于接收内存 监控模块3发送的采样数据,根据采样数据生成统计结果,并将统计结果交人机交互模块2 进行显示。更为具体的,参见图2,本发明实施例提供的内存占用情况统计装置,其进程获取 模块1具体包括系统快照单元11和进程获取单元12 ;
系统快照单元11用于获取系统当前运行信息;进程获取单元12与系统快照单元12相 连,用于从系统快照单元11获取的系统当前运行信息中获取系统当前运行的所有进程,并 向人机交互模块发送系统当前运行的所有进程。
更进一步的,在本发明实施例中,系统快照单元11和进程获取单元12可以利用微 软提供的API函数实现。API函数是微软提供的获取系统状态的函数集合,运行API函数可 以返回进程信息、模块信息、设备驱动程序信息、进程内存使用信息、工作集信息、内存映射 文件信息等系统信息。本实施例以ToolHelp32库函数为例,ToolHelp32库函数是标准的 API函数。系统快照单元11 可以使用!"oolHelpSZ 的 Create^ToolhelpSZSnapshot ()函数, 用于创建系统信息“快照”,获取系统当前运行信息。进程获取单元12 可以使用 1~001彻切32 的 Process32First ()和 Process32Next () 函数,从系统当前运行信息中获取系统当前运行的所有进程。进程获取单元12首先调用一 次PrOCesS32FirSt函数,从快照中获取进程列表,然后重复调用ftx)CesS32Nex函数,直 到该函数返回FALSE为止。这样进程获取单元12将遍历快照中进程列表。本实施例提供的内存占用情况统计装置,其人机交互模块2具体包括信息显示 单元21和指令接收单元22 ;信息显示单元21用于接收进程获取模块1发送的系统当前运 行的所有进程,并进行显示;指令接收单元22与信息显示单元21相连,用于接收用户指令 并向内存监控模块3转发用户指令;用户指令中包括用户需要监控的进程的信息。更进一步的,信息显示单元21接收进程获取模块1发送的系统当前运行的所有进 程,并进行显示,供用户选择其需要进行监控的进程,显示界面如图3所示。指令接收单元22用于接收用户指令并向内存监控模块3转发用户指令。更为具 体的,所述用户指令中包括用户需从信息显示单元21显示的进程中选择的需要进行监控 的进程。优选的,指令接收单元22接收的用户指令中还包括用于设定的内存监控模块3 进行监控采样的时间间隔,以及监控采样的时长等信息。本实施例提供的内存占用情况统计装置,其内存监控模块3具体包括交互单元 31、计时控制单元32和采样单元33,每个单元都与另外两个单元相连。交互单元31负责与本实施例提供的内存占用情况统计装置的其它模块和单元进 行信息交互,主要包括接收人机交互模块2发送的用户指令,并向计时控制单元32转发用 户指令;以及向统计模块4发送采样单元33获取的采样数据。计时控制单元32具有计时功能,用于根据交互单元31发送的用户指令,控制采样 单元33定时对相应进程的内存占用情况进行采样。如图3所示,若用户设置采样间隔为 0. 01秒,监控时长为120秒,则计时控制单元32在120秒内,每隔0. 01秒控制采样单元33 对用户选定需要监控的进程的内存占用情况进行采样。采样单元33用于根据计时控制单元的控制,定时对相应进程的内存占用情况进 行采样,并通过交互单元31将采样数据发送给统计模块。采样单元33对相应进程的内存 占用情况进行采样的功能可以通过OpenProcess ()和GetProcessMemoryhfo ()两个API 函数实现。更为具体的,在进程获取模块1调用完Process32First或Process32Next之 后,返回值中将包含系统中各进程的关键信息,包括进程ID。采样单元33可以根据该进程 ID,调用Operfrocess ()函数,获取被监控进程的句柄(Process Handle)。采样单元33调用Operfrocess ()函数获取被监控进程ftOcess Handle后,可以 根据该ftOcess Handle,使用GetProcessMemoryhfo ()函数获取该进程的内存占用情况。
本发明提供的内存占用情况统计装置,其统计模块4包括数据收发单元41和与数据收发单元41相连的存储统计单元42。数据收发单元41用于接收内存监控模块3发送的采样数据,并交存储统计单元42 存储;数据收发单元41在存储统计单元42完成对采样数据的统计后,向人机交互模块2发 送统计结果。存储统计单元42存储数据收发单元41发送的采样数据,在内存监控模块3完成 全部采样后,对所有采用数据进行统计;通过数据收发单元41向人机交互模块2发送统计 结果。在本实施例中,存储统计单元42可以采用EXCEL表格完成对采样数据的存储和统计, 因为EXCEL提供了操作简便而功能丰富的统计功能和图表,从而使本发明提供的内存占用 情况统计装置更简单而实用。更为具体的,我们可以采用VC++来进行excel的操作。首先,我们要在工程中加入excel的类,即EXCEL9. H及EXCEL9. CPP (可通过加入 EXCEL9. OLB获得),其中EXCEL9对应eXCel2000。接下来根据类中提供的方法将数据,包括 时间和内存信息,保存到指定的excel文件中。使用excel进行统计和图表显示
优选的,本实施例提供的内存占用情况统计装置,其统计模块4还包括统计算法单元 43,统计算法单元43与存储统计单元42相连,用于存储对采样数据的统计算法,存储统计 单元42根据统计算法单元43中的统计算法对采用数据进行统计。本发明提供的内存占用情况统计装置,可以由用户指定需要监控和统计的进程, 对该进程的内存占用信息进行采样和保存,并自动进行统计,为用户跟踪和统计程序进程 的运行情况提供一个高效、方便的工具,节省程序开发过程中消耗在跟踪和统计内存使用 情况的时间和精力。参见图4,为本发明提供的内存占用情况统计方法第一实施例流程示意图,本方法 可以有如图1所示的内存占用情况统计装置实施。该方法如图4所示,包括
在步骤S100,获取系统当前运行的所有进程。在步骤S101,向用户提供系统当前运行的所有进程,供所述用户选择。在步骤S102,监控所述用户选定的进程,定时对该进程的内存占用情况进行采样, 获取采样数据。在步骤S103,根据所述采样数据生成统计结果,并向用户显示所述统计结果。本发明提供的内存占用情况统计方法,可以由用户指定需要监控和统计的进程, 对该进程的内存占用信息进行采样和保存,并自动进行统计,为用户跟踪和统计程序进程 的运行情况提供一个高效、方便的工具,节省程序开发过程中消耗在跟踪和统计内存使用 情况的时间和精力。参见图5,为本发明提供的内存占用情况统计方法第二实施例流程示意图,在本实 施例中,将更为详细的描述该内存占用情况统计方法的具体流程,本方法可以有如图2所 示的内存占用情况统计装置实施。该方法如图4所示,包括
在步骤S200,获取系统当前运行信息。更为具体的,本步骤可以由前述内存 占用情况统计装置的系统快照单元执行。系统快照单元可以使用T00lHelp32的 CreateToolhelp32Snapshot ()函数,用于创建系统信息“快照”,获取系统当前运行信息。在步骤S201,从所述系统当前运行信息中获取系统当前运行的所有进程。更为具体的,本步骤可以由前述内存占用情况统计装置的进程获取单元执行。进程获取单元可以 使用!"oolHelpSZ的ftOcess32First()和Process32Next ()函数,从系统当前运行信息中 获取系统当前运行的所有进程。进程获取单元首先调用一次ProCesS32FirSt函数,从快 照中获取进程列表,然后重复调用ftx)CesS32Nex函数,直到该函数返回FALSE为止。这样 进程获取单元将遍历快照中进程列表。在步骤S202,向用户提供所述系统当前运行的所有进程,供所述用户选择。更为具 体的,本步骤可以由前述内存占用情况统计装置人机交互模块执行。人机交互模块接收进 程获取模块发送的系统当前运行的所有进程,并进行显示,供用户选择其需要进行监控的 进程,显示界面如图3所示。在步骤S203,接收用户指令;所述用户指令中包括用户选定的、需要监控的进程 的信息。更为具体的,本步骤可以由前述内存占用情况统计装置人机交互模块执行。所述 用户指令中包括用户从人机交互模块显示的进程中选择的需要进行监控的进程。优选的, 人机交互模块接收的用户指令中还包括用户设定的对需要监控的进程进行监控采样的时 间间隔、监控采样的时长以及统计算法等信息。在步骤S204,定时对相应进程的内存占用情况进行采样。更为具体的,本步骤可 以由前述内存占用情况统计装置内存监控模块执行。内存监控模块具有计时功能,其根据 用户指令定时对相应进程的内存占用情况进行采样。如图3所示,若用户设置采样间隔为 0. 01秒,监控时长为120秒,则内存监控模块在120秒内,每隔0. 01秒对用户选定需要监控 的进程的内存占用情况进行采样。进一步的,内存监控模块对相应进程的内存占用情况进行采样的功能可以通过 OpenProcess ()和GetProcessMemoryhfo ()两个API函数实现。在进程获取模块调用 完Process32First或Process32Next之后,返回值中将包含系统中各进程的关键信息, 包括进程ID。内存监控模块可以根据该进程ID,调用Operfr0cess ()函数,获取被监控 进程的句柄(Process Handle)。内存监控模块调用Operfrocess ()函数获取被监控进程I^rocess Handle后,可 以根据该ftOcess Handle,使用GetProcessMemoryhfo ()函数获取该进程的内存占用情 况。在步骤S205,在完成全部采样后,对所有采用数据进行统计。更为具体的,本步骤 可以由前述内存占用情况统计装置的统计模块执行。统计模块存储内存监控模块发送的采样数据,在内存监控模块完成全部采样后, 对所有采用数据进行统计。在本实施例中,统计模块可以采用EXCEL表格完成对采样数据 的存储和统计,因为EXCEL提供了操作简便而功能丰富的统计功能和图表,从而使本发明 提供的内存占用情况统计装置更简单而实用。更为具体的,我们可以采用VC++来进行excel的操作。首先,我们要在工程中加入excel的类,即EXCEL9. H及EXCEL9. CPP (可通过加入 EXCEL9. OLB获得),其中EXCEL9对应eXCel2000。接下来根据类中提供的方法将数据,包括 时间和内存信息,保存到指定的excel文件中。使用excel进行统计和图表显示
优选的,本实施例提供的内存占用情况统计装置,其统计模块还存储有各种可选的,用 于对采样数据进行统计的算法,统计模块根据用户指令中用户选择的统计算法,对采用数据进行统计。在步骤S206,通过人机界面向用户显示统计结果。本发明提供的内存占用情况统计方法,可以由用户指定需要监控和统计的进程, 对该进程的内存占用信息进行采样和保存,并自动进行统计,为用户跟踪和统计程序进程 的运行情况提供一个高效、方便的工具,节省程序开发过程中消耗在跟踪和统计内存使用 情况的时间和精力。以上所揭露的仅为本发明一种较佳实施例而已,当然不能以此来限定本发明之权 利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助 软件加必需的硬件平台的方式来实现,当然也可以全部通过硬件来实施。基于这样的理解, 本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来, 该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使 得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例 或者实施例的某些部分所述的方法。
1.一种内存占用情况统计装置,其特征在于,包括用于获取系统当前运行的所有进程的进程获取模块;与所述进程获取模块以及内存监控模块、统计模块相连的人机交互模块,所述人机交 互模块用于向用户提供所述系统当前运行的所有进程供用户选择;在统计模块完成选定进 程的内存占用情况的统计后,向用户提供统计结果;与所述人机交互模块以及统计模块相连的内存监控模块,所述内存监控模块用于监控 用户通过所述人机交互模块选定的进程,定时对该进程的内存占用情况进行采样,并向统 计模块发送采样数据;与所述内存监控模块和人机交互模块相连的统计模块,所述统计模块用于接收所述内 存监控模块发送的采样数据,根据所述采样数据生成统计结果,并将所述统计结果交所述 人机交互模块进行显示。
2.如权利要求1所述的内存占用情况统计装置,其特征在于,所述进程获取模块包 括系统快照单元和进程获取单元;所述系统快照单元用于获取系统当前运行信息;所述进程获取单元与所述系统快照单元相连,用于从所述系统快照单元获取的系统当 前运行信息中获取系统当前运行的所有进程,并向所述人机交互模块发送所述系统当前运 行的所有进程。
3.如权利要求2所述的内存占用情况统计装置,其特征在于,所述人机交互模块包 括信息显示单元和指令接收单元;所述信息显示单元用于接收所述进程获取模块发送的系统当前运行的所有进程,并进 行显不;所述指令接收单元与信息显示单元相连,用于接收用户指令,并向内存监控模块转发 所述用户指令;所述用户指令中包括用户需要监控的进程的信息。
4.如权利要求3所述的内存占用情况统计装置,其特征在于,所述指令接收单元接收 的用户指令中还包括用于设定的内存监控模块进行监控采样的时间间隔,以及监控采样 的时长。
5.如权利要求4所述的内存占用情况统计装置,其特征在于,所述内存监控模块包 括交互单元、采样单元和计时控制单元,每个单元都与另外两个单元相连;所述交互单元用于接收人机交互模块发送的用户指令,并向所述统计模块发送所述采 样单元获取的采样数据;所述计时控制单元用于根据所述交互单元接收的用户指令,控制所述采样单元定时对 相应进程的内存占用情况进行采样;所述采样单元用于根据计时控制单元的控制,定时对相应进程的内存占用情况进行采 样,并通过交互单元将采样数据发送给统计模块。
6.如权利要求5所述的内存占用情况统计装置,其特征在于,所述统计模块包括数 据收发单元和与所述数据收发单元相连的存储统计单元;所述数据收发单元用于接收内存监控模块发送的采样数据;在所述存储统计单元完成 对采样数据的统计后,向所述人机交互模块发送统计结果;所述存储统计单元存储所述数据收发单元发送的采样数据,在所述内存监控模块完成全部采样后,对所有采用数据进行统计;通过所述数据收发单元向人机交互模块发送统计结果。
7.如权利要求1至6中任一项所述的内存占用情况统计装置,其特征在于,所述统计模 块还包括统计算法单元,所述统计算法单元与存储统计单元相连,用于存储对采样数据的 统计算法;所述存储统计单元根据所述统计算法单元中的统计算法对采用数据进行统计。
8.—种内存占用情况统计方法,其特征在于,包括获取系统当前运行的所有进程并向用户提供,供所述用户选择;监控所述用户选定的进程,定时对该进程的内存占用情况进行采样,获取采样数据;根据所述采样数据生成统计结果,并向用户显示所述统计结果。
9.如权利要求8所述的内存占用情况统计方法,其特征在于,所述获取系统当前运行 的所有进程并向用户提供,供所述用户选择包括获取系统当前运行信息;从所述系统当前运行信息中获取系统当前运行的所有进程; 向用户提供所述系统当前运行的所有进程,供所述用户选择。
10.如权利要求9所述的内存占用情况统计方法,其特征在于,所述获取系统当前运行 的所有进程并向用户提供,供所述用户选择之后;监控所述用户选定的进程之前,还包括接收用户指令;所述用户指令中包括用户选定的、需要监控的进程的信息。
11.如权利要求10所述的内存占用情况统计方法,其特征在于,所述用户指令中还包 括对选定的进程进行监控采样的时间间隔、监控采样的时长以及统计算法。
12.如权利要求11所述的内存占用情况统计方法,其特征在于,所述根据所述采样数 据生成统计结果,并向用户显示所述统计结果包括在完成对所述进程的内存占用情况全部采样后,按照预设的统计算法对采用数据进行 统计;向用户显示所述统计结果。
本发明提供一种内存占用情况统计装置,包括用于获取系统当前运行的所有进程的进程获取模块;用于向用户提供系统当前运行的所有进程供用户选择,在统计模块完成选定进程的内存占用情况的统计后,向用户提供统计结果的人机交互模块;用于监控用户通过人机交互模块选定的进程,定时对该进程的内存占用情况进行采样,并向统计模块发送采样数据的内存监控模块;用于接收内存监控模块发送的采样数据,根据采样数据生成统计结果,并将统计结果交人机交互模块进行显示的统计模块。实施本发明提供的内存占用情况统计装置,可以由用户指定需要监控和统计的进程,对该进程的内存占用信息进行采样和保存,并自动进行统计。
文档编号G06F11/34GKSQ
公开日日 申请日期日 优先权日日
发明者黄俊泳 申请人:深圳市同洲电子股份有限公司查看: 9153|回复: 15
STM32全局变量占用程序存储空间吗?
主题帖子精华
高级会员, 积分 709, 距离下一级还需 291 积分
在线时间0 小时
全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:
全局自动变量——保存在读写数据段
全局静态变量——保存在读写数据段
全局常量——保存在只读数据段
局部自动变量——保存在栈空间里的
而我们在做单片机程序的时候,由于都是用的C编程,所以数据的存储也是一样的。上面的读写数据段在单片机里就是RW-data段,上面的只读数据段在单片机里就是RO-data,还有一个零初始化数据段ZI-data段(由此可见,RW-data加上ZI-data就是总共要分配的RAM空间大小),最后一个Code段就不用介绍了,大家都明白。
那么究竟一个STM32程序编译链接完成后的BIN文件大小到底跟所申请的全局变量有没有关系呢?答案是无关!最终生成的BIN文件大小只与程序的代码段(Code段)和只读数据段(RO-data)有关,即BIN文件大小=Code段+RO-data段。
为了验证这一点,我特地拿正点原子战舰开发板的案例《实验48 串口IAP实验》来给大家演示,证明目标代码的大小与程序中所申请的全局变量大小无关。选择正点原子的这个案例有两个原因:1.本人目前正在学习STM32 IAP编程;2.该例程中分配了一个全局变量u8 USART_RX_BUF[USART_REC_LEN],USART_REC_LEN的长度为55K,几乎占用了80%的SRAM空间,对本文的论点起着典范作用。
首先我们不对工程进行修改,如下图:
编译链接后,生成的目标代码结果如下:
可以看到,Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=62400 &
得出ROM=21.7K &RAM=61K
我们再将USART_REC_LEN宏的长度修改为55,空间大大缩小,如下图:
编译链接后,目标代码大小如下:
可以看到Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=6136 &
得到ROM=21.7K &RAM=6K
而两次编译后,我们到工程目录下找到IAP.BIN文件,查看该文件的大小,都是21.7K,如下图:
由此可见,目标代码的大小与程序中所申请的全局变量大小无关,而只与代码段(Code段)和只读数据段(RO-data段)有关,而全局变量的大小只会影响到占用SRAM的大小。那么既然最终的目标代码大小跟全局变量的大小无关,是不是目标代码就一点也不包含全局变量了呢?呵呵,如果不包含全局变量,那程序运行的时候就不知道全局变量在哪里啦!当然会包含全局变量啦,只是不是包含它们的存储空间,而是包含他们分配空间的信息,比如该全局变量的起始地址、空间大小、是否要用0初始化等信息,这样就只会占用目标代码非常少的空间。那全局变量又是在什么时候分配的呢?全局变量的分配是在程序复位中断执行后,进入main函数之前分配的。那么全局变量又是由谁来分配的呢?全局变量的分配工作在你的用户程序中是看不到的,它们是有开发环境提供的C运行时库提供的代码,是由链接器把他们嵌入到你的用户代码里的。
现在,对于变量的空间分配,你是不是更了解了一些呢?
主题帖子精华
初级会员, 积分 64, 距离下一级还需 136 积分
在线时间0 小时
主题帖子精华
金牌会员, 积分 1169, 距离下一级还需 1831 积分
在线时间6 小时
哎,我太喜欢用全局变量了~
主题帖子精华
高级会员, 积分 649, 距离下一级还需 351 积分
在线时间1 小时
吗啊额儿科额~!
具有资深STM32点灯技术,
主题帖子精华
中级会员, 积分 487, 距离下一级还需 13 积分
在线时间0 小时
回复【楼主位】hexiaolong2008:
---------------------------------
楼主你好
我看了你解答的问题&但是我以前看过一本书&和你的问题有点才冲突&
那本书上的讲解是这样的&STM32&的FLASH占用大小&应该是code&+RO-data+RW-&&也就是说&在所有的全局变量中&没有被初始化为0&的全局变量也占用了flash的空间&我认为是这样的&假如&RW-data不占用flash空间&哪么程序如何知道这个全局变量的初始值是多少?
另外&关于SRAM&&程序占用SRAM的空间&当然是RW-data+ZI-data了&这个是一致的&
也就是说&RW-data&即占用了&flash空间&也占用了SRAM空间&
我认为是这样的&&呵呵&不对的话&求拍砖.
主题帖子精华
高级会员, 积分 709, 距离下一级还需 291 积分
在线时间0 小时
回复【5楼】langwanglx:
---------------------------------
嗯,你说的对,后来在阿莫电子论坛也有人提出了同样的反对意见,经过实践证明,你的接结论是对的,我对原始博客进行了修改,你可以直接点击原文博客链接,里面有说明的。
主题帖子精华
初级会员, 积分 108, 距离下一级还需 92 积分
在线时间33 小时
回复【楼主位】hexiaolong2008:
---------------------------------
看了楼主的帖子,这知识我不懂,受教了,楼主,什么触发你研究起这个知识点的呀?
研究这个知识点有什么意义哇?请教下,因为我突然想到这个问题。
得之我幸,失只我命!
主题帖子精华
高级会员, 积分 709, 距离下一级还需 291 积分
在线时间0 小时
回复【7楼】yihui184:
---------------------------------
因为想对程序内部的内存分布能有个透彻的了解,所以就想到了这里。。。。
主题帖子精华
初级会员, 积分 112, 距离下一级还需 88 积分
在线时间21 小时
楼主你好,那你能不能继续说说局部变量呢?局部变量是如何非配空间会分配到哪里去
主题帖子精华
在线时间547 小时
主题帖子精华
初级会员, 积分 115, 距离下一级还需 85 积分
在线时间9 小时
主题帖子精华
中级会员, 积分 254, 距离下一级还需 246 积分
在线时间4 小时
主题帖子精华
新手上路, 积分 45, 距离下一级还需 5 积分
在线时间4 小时
你说的不对,code&和ro&rw&zi都是要烧写到flash中的,在设备启动后,内置的boot程序会依据分散加载机制,将rw&zi加载到sram区中。
主题帖子精华
高级会员, 积分 709, 距离下一级还需 291 积分
在线时间0 小时
回复【13楼】huzhongmoshui:
---------------------------------
嗯,你说的是对的,请看5楼。
主题帖子精华
初级会员, 积分 71, 距离下一级还需 129 积分
在线时间17 小时
你说的不对,code&和ro&rw&zi都是要烧写到flash中的,在设备启动后,内置的boot程序会依据 ...
你说的很对,就像普通PC上exe中即包含rw-data又包含CODE,否则加载exe后如何得知一些全局变量的初始值阿。一个道理。
主题帖子精华
初级会员, 积分 192, 距离下一级还需 8 积分
在线时间24 小时
不错我还是要顶一下
Powered by}

我要回帖

更多关于 python 变量占用内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信