大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法

  最近和同事在讨论一个客户案例,客户 APP 工程是基于 IAR 开发环境,客户希望将工程里尽可能多的代码都重定向到 RAM 里执行,仅留必要或者指定的源文件代码在 Flash 中执行。这个需求和痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》 实现正好相反,正常需求都是指定一些代码重定向到 RAM,客户这次却是要保留一些指定代码在 Flash 中,其余全部都重定向到 RAM。

  客户的这个需求原则上我们还是可以用老方法去做,即在 IAR 链接文件里将除了指定源文件外的其它 object 全部加入 initialize by copy 语句里,或者直接代码里对相关函数加 __ramfunc 或者 section 属性,但显然这种方式手工活太多比较繁琐,有没有更人性化的方式呢?当然有!这就是痞子衡今天要聊的话题:

一、代码全部重定向问题

  在话题开始之前,我们先讨论一个问题。我们是否可以完全借助 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中执行的方法的更多相关文章

  1. 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  2. 痞子衡嵌入式:在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  3. 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...

  4. 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...

  5. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  6. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

  7. 痞子衡嵌入式:IAR内部C-SPY调试组件配套宏文件(.mac)用法介绍

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法. 痞子衡之前写过一篇 <JLink Script文件基础及其在IAR下调用 ...

  8. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  9. jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)

    不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上.     其实大家安装的jdk路径下,这 ...

  10. 痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link / CMSIS-DAP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致. 做Cortex-M内核MCU嵌入式软件开发,可用的集成开发环境( ...

随机推荐

  1. 你要的AI Agent工具都在这里

    只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力.本篇,我们让AI Agent使用更多的工具,比如:外部搜索.分析CSV.文生图.执行代码等. 1. ...

  2. P3731 题解

    简要题意是找到一条边连接使得最大团大小增加. 在补图上最大团等于最大独立集. 所以问题转化为删掉一条边使得最大独立集增加,又因为团不超过两个,所以原图是二分图,也就是使得最大匹配减少. 考虑什么样的匹 ...

  3. MySQL 获取所有表名、所有表结构

    获取所有表名 SELECT A.TABLE_SCHEMA '数据库', A.TABLE_NAME '表名', A.TABLE_ROWS '表记录行数', A.CREATE_TIME '创表时间', A ...

  4. Python 潮流周刊#60:Python 的包管理工具真是多啊(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  5. 很呆的一个问题:我的新项目又找不到mapper这个bean了

    1.选springboot版本 <properties> <java.version>8</java.version> <project.build.sour ...

  6. 基于禅道数据库对bug进行不同维度统计

    工作中经常需要在周报.月报.年报对禅道bug数据进行不同维度统计导出,以下是我常用的统计sql 1.统计2022年每个月bug数(deleted='0'是查询未删除的bug) select DATE_ ...

  7. 3、Git之常用命令

    3.1.速查表 命令 作用 git config --global user.name 用户名 设置用户签名(昵称) git config --global user.email 邮箱 设置用户签名( ...

  8. 【英伟达】GTC 2024|黄仁勋2小时演讲精华版|六大亮点| Blackwell GPU | DGX B200 | NVL72 | cuLitho | GROOT | Omniverse Cloud —— 智能机器人元年

    视频地址: https://www.youtube.com/watch?v=zBIddyiMXsU

  9. 并行化强化学习 —— 初探 —— 并行reinforce算法的尝试 (中篇:强化学习在大规模仿真环境下单步交互并行化设计的可行性)

    本篇博客是前篇博客并行化强化学习 -- 初探 -- 并行reinforce算法的尝试 (上篇:强化学习在多仿真环境下单步交互并行化设计的可行性)的继续,文中代码地址为:https://gitee.co ...

  10. 深度学习框架 MindSpore —— 华为出品的AI计算框架, docker 安装

    深度学习框架  MindSpore  --   华为出品的AI计算框架 官网地址: https://www.mindspore.cn/ 源代码地址: https://gitee.com/devilma ...