hpatch_conf.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Copyright (c) 2024, sulfurandcu.github.io
  3. *
  4. * SPDX-License-Identifier: MIT
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-10-24 liujitong first version
  9. * 2025-09-30 wdfk_prog add decompresser config
  10. */
  11. #ifndef __hpatch_conf_h__
  12. #define __hpatch_conf_h__
  13. #include "rtthread.h"
  14. #ifdef PKG_HPATCHLITE_DECOMPRESSER_TUZ
  15. /* 启用tuz解压功能 */
  16. #define _CompressPlugin_tuz 1
  17. /*
  18. * 0 (默认): Tinyuz 将使用自己独立的一套类型定义,如 tuz_byte, tuz_BOOL, _tuz_TInputCache 等。
  19. * 1: Tinyuz 将会直接使用 HPatchLite 的类型定义,例如 tuz_byte 会被 #define 成 hpi_byte,_tuz_TInputCache 会被 #define 成 _hpi_TInputCache。
  20. * 当 Tinyuz 和 HPatchLite 在同一个项目中紧密集成时,将此宏设为 1 可以减少代码体积。因为两种输入缓存结构体 (_TInputCache) 的实现可以被复用,从而节省几十到上百字节的Flash空间。
  21. */
  22. #define _IS_USED_SHARE_hpatch_lite_types 1
  23. /*
  24. * 作用: 控制 Tinyuz 是否启用一种特殊的**“原文数据块(Literal Line)”**处理模式。
  25. * 1 (默认,用于解压): 启用该模式。解压器能够处理一种特殊的指令,该指令表示“接下来的一段数据是未压缩的原文,请直接复制”。这对于处理那些本身就难以压缩的数据(如已压缩的图片、加密数据)非常有效,可以避免压缩算法在这些数据上“白费力气”,甚至防止压缩后体积变大的情况。
  26. * 0: 禁用该模式。解压器将不认识“原文数据块”指令。
  27. * 重要联动: 压缩端和解压端的这个宏设置必须完全一致!
  28. * 如果您在PC端使用 hdiffi.exe -c-tuz ... 来打包,那么您在MCU端的 tuz_isNeedLiteralLine 必须是 1。
  29. * 如果您在PC端使用 hdiffi.exe -c-tuzi ... (注意后面的 i) 来打包,那么您在MCU端的 tuz_isNeedLiteralLine 必须是 0。
  30. * 设置为 0 可以减少解压端的代码体积(节省大约54字节),但代价是可能降低对混合数据的压缩率。
  31. */
  32. // #define tuz_isNeedLiteralLine 0
  33. /* 禁用tuz断言 */
  34. // #define NDEBUG
  35. /*
  36. * 作用: 控制是否在代码中加入运行时的内存安全检查。
  37. * 1 (默认): 启用检查。代码中会包含一些 assert 或类似的检查,用于在解压过程中判断是否存在缓冲区溢出、数据损坏等风险。这会使代码更健壮,但会稍微增加一点代码体积和运行开销。
  38. * 0: 禁用检查。移除所有的安全断言。可以获得极致的代码大小和性能,但牺牲了运行时的安全性。通常只在经过充分测试、准备发布最终产品时才考虑关闭它。
  39. */
  40. // #define _IS_RUN_MEM_SAFE_CHECK 1
  41. /*
  42. * tuz_kMaxOfDictSize 和 tuz_kDictSizeSavedBytes
  43. * tuz_kMaxOfDictSize:
  44. * 作用: 定义了 Tinyuz 算法理论上支持的最大字典大小。它不是您实际使用的字典大小,而是一个编译时的上限。
  45. * 这个值会影响 tuz_kDictSizeSavedBytes 的计算。
  46. *
  47. * tuz_kDictSizeSavedBytes:
  48. * 作用: 这个宏非常重要。它决定了在压缩数据流的开头,用多少个字节来存储实际的字典大小值。
  49. * 计算逻辑: 它是根据 tuz_kMaxOfDictSize 的大小自动计算的。
  50. * 如果 tuz_kMaxOfDictSize 在 2^8-1 (255) 以内,就用1个字节存储。
  51. * 如果在 2^16-1 (65535) 以内,就用2个字节存储。
  52. * ... 以此类推。
  53. * 目的: 这是一种空间优化。如果知道一个系统永远不会使用超过64KB的字典,就可以通过 tuz_kMaxOfDictSize 限制它,从而使存储字典大小的头部字段更小。
  54. */
  55. // #define tuz_kMaxOfDictSize (1<<30)
  56. /*
  57. * 作用: 这个宏定义了 Tinyuz 算法所能接受的最小字典大小(Minimum Dictionary Size)。
  58. * 默认值: 1。
  59. * 目的:
  60. * 参数校验: 它主要用于参数合法性检查。当 hdiffi (压缩端) 或 tuz_dec (解压端) 接收到一个字典大小参数时,会检查这个值是否大于或等于 tuz_kMinOfDictSize。如果用户试图提供一个为0或无效的字典大小,这个检查可以防止程序出错。
  61. * 算法下限: 它从理论上确立了算法可以工作的最小资源条件。虽然使用只有1个字节的字典几乎没有任何压缩效果,但算法本身在这种极端情况下依然是正确和有效的 */
  62. // #define tuz_kMinOfDictSize 1
  63. #endif
  64. // Future decompressors can be added here
  65. // #ifdef PKG_HPATCHLITE_DECOMPRESSER_ZLIB
  66. // # define _CompressPlugin_zlib 1
  67. // #endif
  68. #define hpi_malloc(x) rt_malloc(x)
  69. #define hpi_free(x) rt_free(x)
  70. #endif /* __hpatch_conf_h__ */