痞子衡嵌入式:在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法。
最近和同事在讨论一个客户案例,客户 APP 工程是基于 IAR 开发环境,客户希望将工程里尽可能多的代码都重定向到 RAM 里执行,仅留必要或者指定的源文件代码在 Flash 中执行。这个需求和痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》 实现正好相反,正常需求都是指定一些代码重定向到 RAM,客户这次却是要保留一些指定代码在 Flash 中,其余全部都重定向到 RAM。
客户的这个需求原则上我们还是可以用老方法去做,即在 IAR 链接文件里将除了指定源文件外的其它 object 全部加入 initialize by copy 语句里,或者直接代码里对相关函数加 __ramfunc 或者 section 属性,但显然这种方式手工活太多比较繁琐,有没有更人性化的方式呢?当然有!这就是痞子衡今天要聊的话题:
- Note 1: 阅读本文前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解。
- Note 2: 本文使用的 IAR EWARM 软件版本是 v9.50.1。
一、代码全部重定向问题
在话题开始之前,我们先讨论一个问题。我们是否可以完全借助 IAR 自身特性将 APP 工程代码全部重定向到 RAM 里执行(即 CPU 不会在 Flash 里执行任何代码)?在回答这个问题之前,我们先来回忆一下代码重定向到底是如何完成的。一些被指定重定向的代码在链接时会被放到 RAM 区执行,但是会在 Flash 里留下其代码体机器码数据,这些数据需要从 Flash 里被拷贝到 RAM 里,这个拷贝动作是 IAR 底层函数 __iar_data_init3() 完成的,详见痞子衡旧文 《IAR启动函数流程之段初始化函数__iar_data_init3实现》 。
很显然 IAR 底层函数 __iar_data_init3() 也是 APP 工程代码的一部分,它是需要在 Flash 里执行的,它没法被重定向(因为没有代码负责将这个底层函数机器码再拷贝到 RAM),鉴于此,我们也就没法完全利用 IAR 自身特性去做整个 APP 工程代码的重定向。
如果想实现整个 APP 工程的重定向,则必须额外设计一个在 Flash 里执行的二级 Loader 工程,由这个 Loader 工程将 APP 工程全部数据从 Flash 里全部拷贝到 RAM 里再跳转,具体实现可见痞子衡旧文 《KBOOT形态(ROM/Bootloader/Flashloader)》 里的 2.3.1 小节。
二、IAR链接语法 initialize {} except {}
现在回到正题,要想实现客户需求,我们还得借助 IAR 自身,翻看 \IAR Systems\Embedded Workbench 9.50.1\arm\doc\EWARM_DevelopmentGuide.ENU 手册,可以找到如下关于 initialize 语法的定义,其中有可选的 except 语句,顾名思义,就是可以让一些指定的 object/section 不做 initialize 规定的动作,显然我们可以利用它来实现客户需求。
三、initialize {} except {} 语法实践
现在让我们试试这个语法,我们以 \SDK_2_16_000_MIMXRT1170-EVKB\boards\evkbmimxrt1170\demo_apps\hello_world\cm7\iar 工程的 flexspi_nor_debug build 为例,其配套链接文件是 MIMXRT1176xxxxx_cm7_flexspi_nor.icf,全部的 readonly 段分配在 0x30000000 - 0x30FBFFFF 空间(在 Flash 中),全部的 readwrite 段分配在 0x20000000 - 0x2003FFFF 空间(在 DTCM 中)。
3.1 试验:将 readonly 放入 initialize by copy 中
先来做第一个实验,不用 except 语法,就是将 readonly 也放入 initialize by copy 中,看看是不是能够将 APP 中全部代码重定向到 DTCM。
编译链接后,打开 map 文件,可以看到 Flash 地址空间内仅剩下 section .boot_hdr.conf 和 .boot_hdr.ivt(这两个段没被重定向,主要原因是链接文件里没有用 readonly 修饰) 以及和 IAR 底层函数拷贝动作相关的源文件函数(这里可以便于我们识别哪些函数是和初始化阶段拷贝动作相关的)。
这个结果表明,即使不显式地写出 except 语句,那些和拷贝动作相关的函数也会自动从 readonly 段里被挑出来,不受 initialize by copy 的影响。
3.2 试验:用 except 挑出 RT 启动头
上一个测试结果在 i.MXRT 下并不能正常工作,除了没有将 .boot_hdr.xxx 启动头全部放在 Flash 指定偏移处之外(两个没加 readonly 修饰的侥幸放对了),ARM 中断向量表也没有放在指定位置,会影响复位函数 Reset_Handler 的正常执行,因此在 i.MXRT 上我们至少应该将如下段放进 except 列表里:
编译链接后,这时候启动头以及中断向量表就被保留在 Flash 指定偏移处了,这个程序下载进 Flash 是可以被芯片正常启动执行的。
3.3 试验:用 except 挑出指定源文件
此时终于进入到客户需求实现阶段了,将需要被保留在 Flash 执行的源文件/函数全部列出备用。以 hello_world 工程为例,我们就将 hello_world.c 源文件里的代码全部保留在 Flash 里,这时候只需要将其加进 except 列表里即可:
编译链接后,可以看到 hello_world.o 里的 ro code 和 const data 均被显式地保留在 Flash 区域了,客户需求得以完美实现。
四、如何重定向到非RW段所在RAM?
前面借助 IAR 特性实现的代码重定向均是将代码放到 RW 段所在 RAM 区(DTCM),但是对于 i.MX RT 这样包含多个非连续 RAM 空间的芯片来说,如果客户希望是重定向到非 RW 段所在的 RAM 空间的话,那情况就大不同了。
关于将 APP 工程里一些源文件重定向到任意指定的 RAM,由于 IAR 自身的限制,痞子衡写过两篇文章 《在IAR下将整个源文件代码重定向到任意RAM中的方法》、《在IAR下手动拷贝自定义程序段到RAM中执行的方法》 介绍过实现方法,就是需要在相应代码里增加一些自定义段修饰,但是这种方法显然不适用客户这种需求(同样是因为手工活太多比较繁琐的原因)。
那这种需求该如何实现呢?这里留下一个思路,可以结合 IAR 的用户代码库制作,将不需要重定向的代码汇编成一个库(Lib),然后对这个 Lib 整体再进行重定向,思路仅供参考。
至此,在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法的更多相关文章
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...
- 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...
- 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...
- jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)
不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上. 其实大家安装的jdk路径下,这 ...
- 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...
随机推荐
- Android 耳机驱动知识
Android 耳机驱动知识 2015-03-06 工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测.这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都 ...
- Linux greybus
背景 在研究高通平台驱动震动马达时,我需要为内核驱动实现以下功能:/sys/class/timed_output/vibrator/enable":sysfs文件系统注册接口.提供show. ...
- 让你的vscode搭载ChatGPT获得来自 AI 的编程指导
一直以来,VS Code 都是开发者心目中的生产力神器,它免费.开源且跨平台,被称为最好用的 IDE. 把 VS Code 和 ChatGPT 结合使用,用户将获得来自 AI 的编程指导,包括代码解释 ...
- wangEditor增加源码模式,添加查看源码功能
wangEditor是一款轻量级的富文本编辑器.使用还比较方便,但是缺少查看源码模式,需要我们自定义一个menu给增加查看源码模式 下面是wangEditor增加源码模式的代码: <!DOCTY ...
- 全网最适合入门的面向对象编程教程:18 类和对象的 Python 实现-多重继承与 PyQtGraph 串口数据绘制曲线图
全网最适合入门的面向对象编程教程:18 类和对象的 Python 实现-多重继承与 PyQtGraph 串口数据绘制曲线图 摘要: 本文主要介绍了 Python 中创建自定义类时如何使用多重继承.菱形 ...
- [oeasy]python0125_汉字打印机_点阵式打字机_汉字字形码
汉字字形码 回忆上次内容 IBM 将 ASCII 扩展之后 规定了 一个字节的字符集 并制作了 相应的字形库 添加图片注释,不超过 140 字(可选) 这种显示模式和字符大小之下 中文 ...
- 一文揭开JDK21虚拟线程的神秘面纱
虚拟线程快速体验 环境:JDK21 + IDEA public static void main(String[] args) { try (var executor = Executors.newV ...
- AI时代你应聚焦的领域在哪里
1. 每个人都应该拥抱AI 随着AI的飞速发展,把我们带到了一个全新的时代.在这个时代,AI将逐步渗透到各个方面,比如:自动驾驶.智能家居.医疗诊断.大模型等等.每个人都应该积极拥抱AI,让AI给我们 ...
- 初学者使用1Panel面板快速搭建WordPress网站
之前介绍了宝塔面板以及如何搭建wordpress网站,这篇文章我们来学习如何使用1Panel面板搭建wordpress网站. 一.1Panel面板介绍 1. 介绍 1Panel 是一个现代化.开源的基 ...
- Python和RPA网页自动化-浏览器切换不同窗口页面
以百度为例,点击[BOSS直聘]词条会打开一个BOSS新窗口页面,分别使用Python和RPA网页自动化在不同的窗口页面来回切换窗口完成以下顺序步骤 1.Python代码如下 步骤:打开新窗口页面后, ...