• 在bootloader及IAP中使用zlib解压缩


    原有的bootloader方案是在片内FLASH上面分成3块,bootloader区占一小块,然后剩下区域平分成两块,一块是运行区,一块是新固件临时存储区。

    好在现在FLASH在系统成本中占的比例越来越低了,不然这样用肯定很奢侈浪费了。

    在此方案基础上,我们还可以使用压缩功能,这样临时存储区可以更小一些,可以释放出更多空间给运行区。

    压缩算法格式综合考虑后使用gzip,解压程序使用zlib。

    因为gzip格式比较通用,方便压缩和调试。而解压所消耗的资源也尚可接受。

    一般测试下来,gz所用的 deflate 压缩算法大概有75%的压缩率。

    所以建议使用压缩后的运行区与临时存储区的大小比例为  4:3 比较合适。

    不过压缩率跟原文特征有很大关系,

    因此,生成固件时,除原文不能大于运行区的大小以外,还要限制压缩后的体积不能大于临时存储区的大小。

    另外,如果系统传输有使用加密技术的话,一定要先压缩再加密。

    因为加密后的数据压缩率很小,甚至会有压缩后的体积大于原文的情况。

    最后看下zlib解压消耗资源情况:

    实测在某cortex-M3/4的系统上面,zlib只启用解压功能,CRC32把table放在RAM中,在末进行其它特别优化的情况占用FLASH在15KB左右。

    而解压文件时,消耗的RAM在32KB+9KB,不过一般bootloader或IAP时,其它功能处于禁用状态,所以RAM一般都是可以满足的。

    所以,只要固件被压缩下来的体积大于20~30KB就可以考虑使用压缩算法了。

    解压速度(120Mhz cortex-M3):

    输入输出缓冲块均为16字节
    初始化5us,解压1.8KB数据2.1ms,结束上下文7us.
    初始化5us,解压150KB数据150ms,结束上下文7us.

    输入输出缓冲块均为64字节
    初始化5us,解压150KB数据100ms,结束上下文7us.

  • 相关阅读:
    异常 集中异步处理
    客户端获取服务端自定义类数据 z
    客户端使用自定义代理类访问WCF服务 z
    学习“要件审判九步法”,正确处理五个关系 z
    “要件审判九步法”具体步骤
    要件审判九步法及其基本价值 z
    WCF Windows Service Using TopShelf and ServiceModelEx z
    [ACM_数据结构] Color the ball [线段树水题][数组开大]
    [ACM_数据结构] HDU 1166 敌兵布阵 线段树 或 树状数组
    [ACM_数据结构] 线段树模板
  • 原文地址:https://www.cnblogs.com/aozima/p/4572626.html
Copyright © 2020-2023  润新知