痞子衡嵌入式:深扒IAR啟動函數流程之段初始化實現中可用的壓縮選項
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是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主頁、知乎主頁、微信公眾號 平台上。
微信搜索”痞子衡嵌入式“或者掃描下面二維碼,就可以在手機上第一時間看了哦。