痞子衡嵌入式:深扒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主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:深扒IAR启动函数流程之段初始化实现中可用的压缩选项的更多相关文章
- 痞子衡嵌入式:深扒IAR启动函数流程之段初始化函数__iar_data_init3实现
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程里的段初始化函数__iar_data_init3实现. 本篇是 <IAR启动函数流程及其__low_level_ ...
 - 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...
 - 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
 - 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
 - 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
 - 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
 - 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...
 - 痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting). 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我 ...
 - 痞子衡嵌入式:聊聊系统看门狗WDOG1在i.MXRT1xxx系统启动中的应用及影响
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是系统看门狗WDOG1在i.MXRT1xxx系统启动中的应用及影响. 软件看门狗模块(WDOG)在 MCU 应用里可以说是非常基础的功能模 ...
 
随机推荐
- 实现前后端分离,最好的方案就是SPA(Single Page Application)
			
从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...
 - 【UE4 C++ 基础知识】<1> UPROPERTY宏、属性说明符、元数据说明符
			
属性声明 属性使用标准的C++变量语法声明,前面用UPROPERTY宏来定义属性元数据和变量说明符. UPROPERTY([specifier, specifier, ...], [meta(key= ...
 - 【UE4 C++】资源烘焙与UE4Editor.exe启动
			
资源烘焙 虚幻引擎以内部使用的特定格式存储内容资源,将内容从内部格式转换为特定于平台的格式的过程 称为 烘焙((Cooking) 从编辑器烘焙资源 FIle → Cook Content for Wi ...
 - 配置pyenv环境
			
git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="$HOME/.pyenv&quo ...
 - springcloud (一)系统架构演变之路
			
演变过程 从传统架构(单点应用)→分布式架构(以项目进行拆分)→SOA架构(面向服务架构)→微服务架构 1 传统架构 其实就是ssh架构或者ssm架构,属于单点应用,把整个开发业务模块都会在一个项目中 ...
 - Scrum Meeting 0429
			
零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...
 - [对对子队]会议记录4.14(Scrum Meeting 5)
			
今天已完成的工作 刘子航  工作内容:设计第2,3关  相关issue:设计关卡2,3 吴昭邦  工作内容:制作场景,暂时解决了坐标错位问题  相关issue:实现游戏场景中的必要模型 何瑞 ...
 - poi实现生成下拉选联动
			
在我们实际的程序开发中,经常需要用到从excel导入数据中系统中,而为了防止用户在excel中乱输入文字,有些需要用到下拉选的地方,就需要从程序中动态生成模板.本例子简单的讲解一下,如何生成级联下拉选 ...
 - Noip模拟51 2021.9.12
			
T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...
 - 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
			
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...