痞子衡嵌入式:深扒IAR啟動函式流程之段初始化實現中可用的壓縮選項

痞子衡發表於2021-11-29

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是IAR啟動函式流程裡段初始化實現中可用的壓縮選項

  接著 《IAR啟動函式流程之段初始化函式__iar_data_init3實現》 一文,我們們再深入一步。對於 .bss 段的初始化,其實沒什麼好說的,就是簡單的清零操作,但是 .data/.textrw 段的初始化工作是可以做一點文章的,尤其是當這些段資料量非常大的時候,可以增加一些壓縮處理(連結階段做壓縮,並且自動插入相應解壓函式進映象檔案,啟動初始化時做解壓),以減小最終程式映象檔案的長度(程式碼優化選項 High - Size 之外的新手段),這也是 IAR 這種商業性軟體區別於標準 GCC 工具鏈的地方之一。今天我們就仔細說說 IAR 工具下支援的 RW 段壓縮選項:

  • Note 1: 閱讀本文前需要對 《IAR連結檔案(.icf)》 有所瞭解。
  • Note 2: 本文使用的 IAR EWARM 軟體版本是 v9.10.2。

一、在連結檔案中設定壓縮選項

  我們還是結合一個具體應用程式工程來講解,痞子衡選擇的是 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar 例程(切到 flexspi_nor_debug build),這個工程的連結檔案是 MIMXRT1176xxxxx_cm7_flexspi_nor.icf,在連結檔案裡我們使用瞭如下 initialize by copy 語句來指定 IAR 連結器去做 RW/ZI 段初始化工作:

initialize by copy { readwrite, section .textrw };

  其實上述語句是不完整的,其中包含了一些預設引數省略,我們翻看 \IAR Systems\Embedded Workbench 9.10.2\arm\doc\EWARM_DevelopmentGuide.ENU.pdf 文件可以找到如下 initialize 完整語法:

  with packing = auto或smallest 是預設壓縮設定,這個選項的意思是 IAR 連結器在連結時會綜合比較全部支援的壓縮演算法,取最終生成程式碼尺寸最小的那種壓縮演算法(注意,解壓函式本身也會被計算進程式碼尺寸):

initialize by copy with packing = auto     { readwrite, section .textrw };
initialize by copy with packing = smallest { readwrite, section .textrw };

  我們在 IAR 工程選項 Linker / Extra Options 里加入 --log initialization 命令就可以在 log 輸出框裡看到 IAR 連結器選擇壓縮演算法的過程:

二、RW段壓縮演算法選項詳解

  上一節 initialize 完整語法介紹裡,我們知道了 algorithm 引數共有六種選擇,除了預設的 auto/smallest,還有四種:none、zeros、packbits、lz77,這四種就是可用的壓縮演算法選項,它們的解壓函式分別在如下四個原始檔裡:

\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\init\copy_init3.c     - 存放 __iar_copy_init3 函式
\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\init\rle_init.c       - 存放 __iar_rle_init3 函式
\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\init\packbits_init.c  - 存放 __iar_packbits_init3 函式
\IAR Systems\Embedded Workbench 9.10.2\arm\src\lib\init\lz77_init.c      - 存放 __iar_lz77_init3 函式

2.1 algorithm = none

  none 選項顧名思義,就是完全不壓縮,它對應的解壓函式 __iar_copy_init3 實現最簡單,就是單純的資料拷貝。none 選項比較適用資料流很小或者規律性極差的情況。

2.2 algorithm = zeros

  zeros 演算法對應解壓函式 __iar_rle_init3 ,這種演算法主要用於壓縮資料流中出現的連續零值,資料流中連續零值佔比越大,zeros 演算法壓縮效果越好。

2.3 algorithm = packbits

  packbits 演算法對應解壓函式 __iar_packbits_init3 ,PackBits是一種應用於資料長度編碼的快速,簡單無損的資料壓縮方案(是蘋果公司在 Mactionsh 計算機上首先推出的演算法)。對於資料流中具有許多連續相同位元組的情況,packbits 演算法壓縮效果最佳。

2.4 algorithm = lz77

  lz77 演算法對應解壓函式 __iar_lz77_init3 ,該演算法全稱 Lempel-Ziv-77,是 Abraham Lempel 與 Jacob Ziv 在 1977 年發表的論文 “A Universal Algorithm for Sequential Data Compression” 中提出的無損資料壓縮演算法。lz77 演算法可用於各種型別的資料流,壓縮表現很均衡,唯一的缺點是解壓函式程式碼尺寸稍微大一些。

  至此,IAR啟動函式流程裡段初始化實現中可用的壓縮選項痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章