MSP430上的Zlib压缩

6

有人尝试在MSP430上使用zlib压缩吗?您有关于如何编译用于MSP430项目(我正在使用IAR嵌入式工作台)的库的建议吗?


1
你是否绝对需要zlib?还是只需要一个压缩算法? - Cyan
https://dev59.com/DU7Sa4cB1Zd3GeqP7-8N - old_timer
https://dev59.com/VG865IYBdhLWcg3wivGi - old_timer
我实际上并不需要zlib,只需要一种可以在嵌入式平台上使用的压缩算法,该平台具有一定限制的内存,并且可以在Windows平台上通过类似7-zip或WinZip的工具进行解码。 - user1148476
3个回答

9
根据MSP430资料表维基百科文章,你的RAM不足(最多只有16 KiB),即使仅用于滑动窗口(32 KiB)也不够。因此,你不能在MSP430上使用任何压缩算法。考虑到ZLIB只是deflate的一个实现,这对ZLIB也是正确的。即使你尝试编写自己的deflate实现,你也无法成功。因为deflate需要32 KiB的滑动字典和一些额外的内存来存储它的哈夫曼树。这仅适用于解压部分。对于压缩,你需要额外的内存来存储哈希链匹配查找器,其大小为7.5*字典大小=240 KiB(根据7zip的deflate实现)。如果你真的需要在这种小型架构上进行压缩,我建议尝试自定义的字节码LZSS压缩算法。它们快速而轻巧。但是,由于熵编码的差异,它们并不足以与deflate竞争。

做得好,你的发现节省了我很多尝试时间。 - old_timer
请注意,大多数压缩算法都需要消耗大量资源。其中一些在CPU功率与内存之间存在某种权衡(即有些使用大量内存但只需少量CPU功率,反之亦然)。您甚至可以找到一些使用高达13 GiB内存的算法。这里是一个参考基准,列出了流行压缩器的处理时间和内存使用情况。 - Osman Turan
我知道,这是因为我不知道它需要多少,我的方法是试验而不是研究。谢谢你提供的链接,这将非常有用。 - old_timer

2

我曾经将zlib用作处理器开发的测试,但随着世界开始向64位过渡,他们对unsigned long和unsigned int的杂乱使用以及没有仔细进行类型转换等行为会给编译器带来灾难。现在可能已经稳定下来了,但我放弃了使用它。

它确实需要/想要大量内存,与某些竞争对手相比,msp430在RAM方面特别小。

我有一个msp430模拟器,您可以使用http://github.com/dwelch67/msp430sim。易于配置具有大量RAM,超过芯片中的RAM。尽管zlib可能仍然需要全部64k并且不会留下任何空间。只需要看看会发生什么。也许我会接受这个挑战并尝试自己在我的模拟器上进行测试。在上述模拟器或者我其他的模拟器上,我使用了一种具有非常(相对而言)小的内存占用的不同压缩工具。不确定您是否需要特定的zlib,还是只需要一般的解压缩。


1

我已经为多个目标构建了它,不仅仅是MSP430,但这并不重要。它全部采用ISO C编写,并且只依赖于标准库调用。它使用动态内存分配,因此您需要一个堆。


谢谢你的回答。我已经能够使用deflate算法构建一个小型的msp430测试程序,但是遇到了堆栈空间不足的问题。我猜测这可能与你提到的堆有关。你能否详细解释一下? - user1148476
堆栈需求是一个不同的问题。通常你会在 C 运行时启动时的某个地方分配一定量的堆栈。如果你使用任何类型的 IDE 和项目配置工具,那么很可能有这样的选项。在某些情况下,项目将把所有剩余的内存分配给堆,在其他情况下,你可能需要显式指定堆大小。无论哪种方式,我关于需要一个堆的观点仅仅是因为你需要一个。zlib 在目标上的成功将取决于是否有足够的内存以及是否支持动态内存分配。 - Clifford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接