【问题标题】:ZLIB with small memory usage内存占用少的 ZLIB
【发布时间】:2022-01-07 07:36:17
【问题描述】:

我正在开发带有 5kb 可用闪存的嵌入式设备 (STM32)。我正在尝试使用 zlib 库压缩 string。 我创建了函数HERE,它返回-2 (Z_STREAM_ERROR)。

我做了什么:

  • zconf.h 上,我将MAX_MEM_LEVEL 的值更改为1,将MAX_WBITS 更改为5,以降低内存使用率。但我仍然返回-2 (Z_STREAM_ERROR)。

然后我在deflate.c 上找到了这个,我不能低于MAX_WBITS 低于8

if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
        strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
        return Z_STREAM_ERROR;
}
if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */

然后我将它设置为 MAX_MEM_LEVEL1MAX_WBITS8 但是当我尝试编译时它总是返回 region FLASH overflowed by 15960 bytes。看来我的内存用完了。

然后我又试了一个例子:

  • 跟随zpipe.c 示例,定义CHUNK1024

结果还是一样,region FLASH overflowed by 15960 bytes。 有没有其他方法可以仅使用 FLASH 内存 5kb left?

注意:

  • RAM 也是5kb 左侧。

【问题讨论】:

  • 当您说“剩余
  • @Someprogrammerdude 它是闪存。对不起,我会编辑问题。
  • @Someprogrammerdude 所以它是 5kb 在编译 zlib 函数和库之后。但是当我将MAX_MEM_LEVEL 设置为5 并将MAX_WBITS 设置为8 时,FLASH overflowed 失败了(当我将两者都设置为1 时,它使用剩余的5kb 可用内存成功编译)但它总是返回-2 (Z_STREAM_ERROR) 上面已经解释过了。
  • 您尝试更改的值会影响压缩算法及其 RAM 的使用,而不是库的静态代码大小。
  • @Clifford 是的,这就是我的观点,因为该技术信息页面之前指出放气可以使用 3K 内存完成。我现在已更正该页面以添加 6K 的恒定开销。

标签: c++ embedded zlib


【解决方案1】:

没有。 deflate 所需的最小 RAM 量为 9K。您可以尝试使用其他压缩器,例如 lz4

deflate 代码本身在我的机器 (x86_64 ISA) 上编译为 33K,并进行了速度优化。我尝试使用积极的空间优化进行编译,结果将其降至 25K。

【讨论】:

  • 对我的案子来说,这似乎是死胡同了。谢谢您的建议。我会标记答案。
  • compress或者compress2函数一样吗?
  • 是的。这些函数使用 deflate。
  • 好的,谢谢
  • @Pnzy 可能存在改进现有代码以留出空间的空间——即从整体上看待问题。与其更改 zlib 以使其适合,不如将现有代码更改为 allow zlib 以适合。但是,您需要同时提高代码大小和 RAM 使用率,而 RAM 使用率是代码/算法/数据结构效率的问题,无法通过编译器优化来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多