2012-07-13 76 views
1

我正在将Windows 7库移植到嵌入式平台。为了做到这一点,我的雇主向我询问了我的系统在移植后需要的内存数量(和CPU,但让我们集中精力记忆内存) - 这样他就可以根据我的需要调整板卡的尺寸。Windows到嵌入式端口:数据和代码内存大小

我在互联网上看看,那里似乎不存在这个问题多的信息,因此,我的问题:为了得到闪存代码的内存占用的一个粗略的想法

  1. 内存(代码只有没有数据的内存),我在互联网上阅读,我应该总结我使用的所有DLL的大小。看起来,所有编译器和平台都为代码占用空间提供了不同的大小,但总体上代码的大小(没有数据)通常非常接近。你确认吗?

  2. 为了处理数据所需的内存(堆+堆栈,但没有代码),我看了一下任务管理器(和进程管理器)。看来我使用的数据总量是在“峰值工作集”中指定的。我对此有几点疑问:

2.a. “工作集”包含堆+堆栈内存还是仅对应于堆?

2.b. “工作集”是否也包含代码的大小? (因为我在Windows 7上,代码也存储在RAM中,而不是嵌入式系统中的闪存中),还是只对应于数据?

2.c.看起来'峰值工作集'反映了从程序启动时实际存储在RAM中的最大物理内存量,但它并不反映程序之后可能需要的大小(如果我碰巧在运行时分配内存 - 这将是不好的;) - 峰值将继续增加)。你确认吗?

2.d.因此,您是否也确认,如果我在运行时不分配内存,“峰值工作集”应该大致是我的嵌入式系统需要的RAM的最大大小?最高位大小差异的原因是系统技术的区别...

感谢,

安托万。

+0

最好的东西是一个跟踪malloc()和什么的调试器,而且你会模糊系统来充分运用它。您在任务管理器中看到的内容并不特别准确。 – 2012-07-13 16:55:59

+0

操作系统通过利用虚拟内存并尽可能多地为进程提供合理的物理内存来优化内存使用。工作集编号告诉你为进程运行多少物理内存。这可能比流程需求少得多,少于代码+数据+堆+堆栈大小。移植到不同的操作系统和硬件时,不能依赖工作集编号。这样做毫无意义。 – 2012-07-13 22:41:37

回答

1

除非您打算在Windows Embedded上运行您的应用程序,否则查看Windows中的代码和数据使用情况并不会很有用。

1)动态链接库是库 - 并不是所有的代码都会被你的代码使用。大多数嵌入式系统都是静态链接的,链接器仅链接您的代码中实际引用的模块。因此,考虑到DLL依赖关系的总和,可能导致对内存需求的高估。

2)Windows内存管理随着内存的使用而挥之不去 - 因为它可以并且这样做通常会提高典型桌面系统的性能。例如,Windows中的线程堆栈通常为2Mb的数量级 - 您可能很少使用那么多,但Windows在任何情况下都会给它,因为它可以在安全方面出错。嵌入式系统中的线程堆栈通常范围从几十字节到几十千字节 - 这取决于您的应用程序。

Windows任务管理器显示Windows分配给您的进程的内容,这可能与您的进程需要的内容无关。此外,您的应用程序正在使用Windows服务 - 用于内核和设备服务的所有内存都不会显示为您的进程的一部分,但是您的嵌入式系统可能仍然需要这些内存。

如果你确实使用你的Windows原型代码来评估嵌入式系统的需求,那么你最好的开始的地方是让链接器生成一个映射文件,它将根据静态分配给出内存使用的详细描述数据和代码大小。

代码大小不仅取决于编译器的性能,还取决于指令集的效率。一些架构比其他架构实现更高的代码密度。 Windows应用程序代码的大小从来不是嵌入代码大小的好指标,因为它的执行环境可能差别很大。例如,32位ARM上的先发制人的多任务RTOS内核可以用不到10Kb的代码实现,文件系统可能还有10个,网络堆栈从10K到30K不等,另外10个USB。你可以看到这是一个不同的世界到桌面代码。

可能更容易确定数据存储器的使用情况;但是你通过分析应用程序来做到这一点,而不是观察Windows的功能。有应用程序直接实例化的数据,然后有数据实例化您可能会调用的库和设备驱动程序 - 在Windows中,后者可能相对较大并且不受您的控制。用于诸如网络堆栈,USB,文件系统等的典型嵌入式系统库在性能和大小方面都变得更小且更具确定性。

最好的办法是根据通用性,性能要求,实时约束和硬件要求(显示,网络,I/O,大容量存储等)描述应用程序,然后查看可比较的解决方案或您需要实施解决方案的库;大多数嵌入式系统都是“裸板”,除非您编写或使用第三方解决方案,否则您没有在Windows中找到的服务--Windows很少是嵌入式系统的类似解决方案。


如果它仅仅是一个库,而不是一个应用程序,然后建立它使用Windows一个likley目标托管GCC交叉编译器,看看它有多大结束。你不需要硬件,甚至花费任何金钱。

+0

嗯......我想我在这里得到了重点:两个系统之间的比较并不简单,而且相当危险。看起来嵌入式系统真的非常不同。但是有一个问题,系统确定的堆栈大小呢?有没有办法了解它? – user1524055 2012-07-13 22:17:36

+0

@ user1524055堆栈的最大大小不仅可以通过RAM的数量来限制,而且可以通过CPU来限制(如果它是不寻常的CPU)。你需要的大小由你的代码,它作为局部变量的东西,函数调用的深度(特别是递归的)决定。如果ISR要使用当前的堆栈,则还需要考虑其堆栈使用情况。 – 2012-07-13 22:36:42

+0

@ user1524055:大多数Windows编译器为每个线程应用(大)默认堆栈大小,但允许开发人员分配不同的大小。在大多数不使用OS或简单RTOS的嵌入式环境中,开发人员必须分析和应用每个线程的堆栈大小,并且在某些架构中还要使用中断堆栈。你控制*一切*。如果你从来没有圆顶嵌入式开发,我强烈建议你找一个专家。 – Clifford 2012-07-14 07:27:00