估计软件的内存大小

时间:2011-10-25 12:05:02

标签: memory-management embedded estimation sizing

我正在开发Boot,它将嵌入到项目的PROM芯片中。 我的任务是估计软件可能会采用的最终内存大小,但我以前从未这样做过。

我搜索了一下,我正在考虑做以下事情:

  • 计算所有变量,此大小直接计入总大小
  • 估算每个函数将采用的代码行数(代码尚未编写)
  • 找出每条c指令的近似asm指令数
  • 总大小=总nb代码行*每c指令的avg asm指令* 32位

我的解决方案很可能是假的,我希望有人能够提供帮助。

2 个答案:

答案 0 :(得分:4)

原则上 - 你走在正确的轨道上:

您需要区分几种类型的内存占用:

  • 堆栈
  • 动态内存(malloc,new等)
  • 初始化变量
  • 未初始化的变量

Stack主要受递归,局部变量和函数参数的影响。

动态内存(堆)很明显,也可能与您无关 - 所以我暂时忽略它。

初始化变量很有意思,因为你需要计算两次 - 一次用于PROM上的程序占用(类似于代码和常量),一次用于RAM占用。

未初始化的变量显然会转向RAM并且计算大小几乎足够好(您还需要考虑对齐和填充。

最难估计的是代码或进入PROM的内容,你需要计算常量和局部变量以及代码,代码本身或多或少都是你怀疑的(在添加填充,对齐,函数调用开销之后,中断向量初始化等)但许多事情可以使它比预期的更大,例如内联函数,库函数(许多看似琐碎的操作涉及这些函数),转换等。

答案 1 :(得分:2)

回答问题的方法是来自体验或评估具有类似功能的现有代码。但是会有许多因素会影响代码大小:

  • 目标架构和指令集。
  • 使用的编译器和编译器选项。
  • 图书馆代码使用情况。
  • 开发人员的能力。
  • 所需功能。

开发Boot ”不会告诉我们启动过程的要求或功能。这将对代码大小产生最大影响。作为目标如何产生差异的一个例子,8位目标通常具有更高的代码密度,但是在更大的数据类型上生成更多用于算术的代码,而在ARM目标上,您可以在Thumb目标和ARM指令集之间进行选择,代码密度会发生显着变化。

如果您没有任何经验或代表性代码库,那么我建议您执行一些实验以获得可以使用的一些指标:

  • 构建一个空的应用程序 - 如果是C或C ++,只是一个空的main()函数;这将为您提供运行时启动的基本固定开销。

  • 如果您使用的是库代码,那么可能会占用大量空间;将虚拟调用添加到您将在最终应用程序中使用的所有库接口,这将告诉您库代码将占用多少代码(假设库代码没有内联)。

  • 此后它将取决于功能;您可以实现所需功能的子集,然后估计可能构成的最终构建的比例。

关于你的建议,请记住变量不占用ROM中的空间,尽管任何常量初始化器都会这样做。通常,引导加载程序可以使用所有可用的RAM,因为应用程序启动将为自己重新建立新的运行时环境,丢弃引导加载程序环境和变量。

如果您要提供功能和目标的详细信息,您可以利用社区的经验来估算所需的资源。例如,我可能会告诉您(来自经验),支持Flash编程的启动加载器将使用ARM指令集在ARM7上使用XMODEM协议通过UART加载,这将适合4k字节或者,通过SD卡添加支持可能会再增加6Kb,并说USB虚拟通信端口再增加4Kb。但是,您的要求可能是唯一的,您必须以某种方式为自己确定资源负载。