stm32 zip gz zlib研究并移植

41 篇文章 1 订阅

今天,zlib是一种事实上的业界标准,以至于在标准文档中,zlib和DEFLATE常常互换使用。数以千计的应用程序直接或间接依靠zlib压缩函式库,包括:

* Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心。

* libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。

zlib库已经有人移植到RTT上了,并作为RTT的一个组件在可以在建工程的时候添加进去,我的硬件平台是STM32F437II,那个组件仅仅是移植了zlib库,并提供了一个例程,zlib_sample.c,这个例程很重要,我移植gzip zip的时候就是参考这个例程的,里面月很多系统调用,比如fopen(), 在RTT下没有,这是在stdio.h中声明的一个函数,但函数定义找不到,最终与RTT的接口在哪我也不知道,但是可以确实的是在RTT下此函数可以用, 还有很多类似的问题。 

   估计这个程序初衷就不是让单片机用的,里面充斥的大量的系统定义,类似

#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))

#if defined(USE_FILE32API)
#define fopen64 fopen
#define ftello64 ftell
#define fseeko64 fseek
#else
#ifdef __FreeBSD__
#define fopen64 fopen
#define ftello64 ftello
#define fseeko64 fseeko
#endif
我的处理就是顺其自然,首先那个“”WIN“”定义肯定是不能用的,然后再在其它选项中找,比如上面的定义,我就在KEIL中定义了USE_FILE32API,因为fopen fseek都能找到。

还有一个  fileno(file) 定义,我实在找不到RTT中对应的相关定义,经过查看,这个地方用在标准输入输出,stdin stdout,可以不用,我们的压缩解压缩输入输出都是文件格式,并不是标准输入输出接口,于是把相关引用的地方都屏蔽掉就行了,

经过一翻折腾折腾,终于可以编译通过了。编译通过只是开始,下面要就要研究gzip zip的命令了,这2种压缩格式都是使用的zlib库,并且都使用的命令行工作模式,

gzip 主要就是调用file_compress(*argv, outmode); 函数。

file_compress("/NOR/log.txt", "wb9f");

/* ===========================================================================
 * Usage:  minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]
 *   -c : write to standard output
 *   -d : decompress
 *   -f : compress with Z_FILTERED
 *   -h : compress with Z_HUFFMAN_ONLY
 *   -r : compress with Z_RLE
 *   -1 to -9 : compression level
 */

顺便说一下,-f是 Z_FILTERED方式,压缩率很高,我刚开始使用Z_HUFFMAN_ONLY,无论使用1,还是9,压缩率都提不上,后来选择 Z_FILTERED之后,压缩率一下就提上去了。

zip我只移植了miniunz命令,这个参数太多了,我测试了很九才弄明白, 它可以分为

1.只把压缩包中的文件名、类型、日期等信息列出来。

2.解压缩所有文件。

3.解压缩其中1个文件。
    printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
    printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
           "  -e  Extract without pathname (junk paths)\n" \
           "  -x  Extract with pathname\n" \
           "  -v  list files\n" \
           "  -l  list files\n" \
           "  -d  directory to extract into\n" \
           "  -o  overwrite files without prompting\n" \
           "  -p  extract crypted file using password\n\n");

使用的的过程中,使用绝对路径不方便,还好RTT也支持相对路径, chdir()就可以了。

移植的过程中我最大的感受是RTT提供了非常完善的系统调用,只有你想不到的,没有它提供不了的。

有一个

#ifdef USE_MMAP
int  gz_compress_mmap OF((FILE   *in, gzFile out));
#endif

居然RTT还提供了mmap()函数,但是我认为把“”文件映射到内存“”,这操作不够通用, 所以我就没有使用,

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是一个广泛应用的嵌入式微控制器,而“zlib.h”是一种用于压缩和解压缩数据的压缩库头文件。将“zlib.h”库移植STM32可以极大地扩展其功能,使其具备更广泛的应用和更高效的数据处理能力。 实现将“zlib.h”库移植STM32的方法主要分为两个方面。首先,需要将“zlib.h”库的源代码进行适当的修改,以适应STM32的硬件和软件环境。其次,需要适当地配置STM32的系统参数,确保其能够正确地运行“zlib.h”库。 在移植zlib.h”库的源代码时,需要考虑到STM32的处理器架构、内存和I/O接口等方面的差异。在移植zlib.h”库时,需要根据硬件平台对代码进行修改和重新编译。此外,还需要根据处理器的体系结构和特殊功能,重新分配库的工作区,确保正确的调用和使用。 在适当配置STM32系统参数时,需要重点考虑系统的时钟控制、存储器管理和IO涉及等方面。可以通过调整STM32的系统时钟频率来改变系统的处理速度以适应“zlib.h”库处理数据的速度要求。同时,还需要根据存储器模块来管理内存的分配和释放,确保“zlib.h”库能够充分利用系统的内存。 总之,将“zlib.h”库移植STM32需要对“zlib.h”库进行源代码修改和重新编译,并对STM32系统进行适当的配置,以确保系统能够正确地运行“zlib.h”库,并具有更高效的数据处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值