2011-10-25 45 views
2

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

我搜索了一下四周,我想这样做如下:

  • 计数所有的变量,这个尺寸直接进入总规模
  • 估计数的代码行中的每个功能将(该代码还没有被写入)
  • 找出的每个C指令汇编指令
  • 总大小=码的总NB线的近似数*的每个C指令* 32位
  • 平均ASM指令

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

回答

4

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

你需要多种类型的内存占用的区分:

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

堆栈主要受递归,局部变量和函数参数的影响。动态内存(堆)是显而易见的,也可能与你无关 - 所以现在我会忽略它。

初始化变量很有趣,因为您需要对它们进行两次计数 - 一次用于PROM上的程序占用空间(类似于代码和常量),一次用于RAM占用空间。

未初始化变量显然去朝RAM和计数的大小几乎是足够好(你还需要考虑对齐和填充。

最难估计的代码或什么进入PROM,您需要计数常量和局部变量以及代码,代码本身或多或少是您怀疑的(在添加填充,对齐,函数调用开销,中断向量初始化等之后),但许多事情可能会使其大于预期,例如内联函数,库函数(许多表面上不重要的操作涉及这样的函数),铸造等。

+1

关于动态内存:许多系统都有固定的堆大小,无论您要使用多少内存,您都将使用尽可能多的RAM作为堆大小。关于初始化变量:在C/C++中,双重“脚印”仅适用于具有静态存储持续时间的变量,即声明为静态或全局的任何变量。本地(自动)变量总是存储在堆栈或CPU寄存器中,在那里你只对最大堆栈深度感兴趣,你不必计算它们的RAM语言,只是ROM常量,它们可能是程序存储器的一部分。 – Lundin

2

在回答问题的方式将从体验或评估具有类似功能的现有代码。但是会有一些影响代码大小的因素:

  • 目标体系结构和指令集。
  • 使用的编译器和编译器选项。
  • 库代码的用法。
  • 开发人员的能力。
  • 必需的功能。

的“发展引导的”没有告诉我们你的启动过程的需求或功能。这将对代码大小产生最大影响。作为目标如何发挥作用的例子,8位目标通常具有更高的代码密度,但为更大的数据类型生成更多的算术代码,而在ARM目标中可以在Thumb和ARM指令集之间进行选择,代码密度将发生显着变化。

如果你有没有现成的经验或代表的代码库,从工作,那么我建议你执行一些实验来获得一些指标,你可以工作:

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

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

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

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

如果您要提供功能和目标的详细信息,则可以利用社区的经验估算所需资源。例如,我可以告诉你(体验)支持Flash编程的引导加载程序,该引导加载程序使用ARM指令集在ARM7上使用XMODEM协议通过UART加载,适用于4k字节,或者添加支持通过SD卡加载可能会增加更多的6Kb,并称USB虚拟通信端口再增加4Kb。但是,您的要求可能是独一无二的,您将不得不以某种方式为自己确定资源负载。

+0

感谢您的回答,关于我们项目的更多细节。 这是一个使用ESA的空间项目,硬件使用的处理器是LEON2处理器(基于SPARC v8 archi和指令集)。通过带有数据包利用率标准命令的MIL-1553串行总线指令引导。基本上,该软件管理MIL-1553协议,执行接收到的命令,并在接收到特定命令时将二进制图像从EEPROM加载到RAM并开始执行。在启动过程中,它还初始化并测试整个硬件 – Leo