在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 规定的动作,http://www.fubusi158.com 显然我们可以利用它来实现客户需求。

三、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中执行的方法痞子衡便介绍完毕了,掌声在哪里~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 浏览器支持

HTML5 浏览器支持 HTML5是最新版本的HTML,它引入了许多新特性,旨在更好地适应丰富的网络内容和服务。然而,由于浏览器的更新和兼容性问题,HTML5的浏览器支持情况可能会有所不同。本文将探讨HTML5的主要特性以及在不同浏览器上的支…

RabbitMQ(面试篇)

目录 MQ是什么 MQ的优点 消息队列有什么缺点 什么是RabbitMQ? rabbitMQ的使用常见 RabbitMQ基本概念 大家一起加油 !!! MQ是什么 MQ是消息队列,是软件和软件之间同行的中间件产品 MQ的优点 异步处理&#xff0c…

【前端基础篇】JavaScript之BOM介绍

文章目录 浏览器对象模型(BOM)介绍1. 什么是BOM?2. Window 对象2.1 弹出框2.1.1 警告框2.1.2 确认框2.1.3 提示框 2.2 定时事件2.2.1 延时器2.2.2 定时器 2.3 Window 对象其他常用属性与方法2.3.1 获取窗口尺寸2.3.2 打开新窗口与关闭窗口2.3…

【习题】构建更加丰富的页面

判断题 1. Tabs组件可以通过接口传入一个TabsController,该TabsController可以控制Tabs组件进行页签切换。 A、正确(True) B、错误(False) 2. WebviewController提供了变更Web组件显示内容的接口,例如可以使用loadData来加载一个网页链接地址改…

【JS|第25期】探索HTTP POST请求:请求体的演变与应用

日期:2024年8月16日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

iOS RunLoop

一:什么是Runloop Runloop,正如其名,loop表示某种循环,和run放在一起就表示一直在运行着的循环 二:Runloop的创建? iOS并没有提供Runloop的创建方法,因为创建了现场自然会有一个Runloop. 所以只有获取Runloop的方法: NSRunLoop * runloo…

Leetcode 3267. Count Almost Equal Pairs II

Leetcode 3267. Count Almost Equal Pairs II 1. 解题思路2. 代码实现 题目链接:3267. Count Almost Equal Pairs II 1. 解题思路 这一题同样是题目3265. Count Almost Equal Pairs I的进阶版本。 它主要的区别在于说: 最大的操作次数增加到两次&am…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例:列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中,访问文件系统是常见的需求之一。有时我们需要遍历目录树以…

kafak集群搭建-基于zookeeper方式

kafak集群搭建-基于zookeeper方式 1、准备3个kafka2、修改配置文件2.1、修改配置文件 3、启动测试3.1、先启动zookeeper3.2、再启动三台kafka 4、SpringBoot集成kafka集群4.1、项目配置文件application.yml4.2、kafka配置类4.3、启动SpringBoot程序 5、kafka集群架构分析6、查看…

学习能力与研究能力

摘要: 学习就像搭金字塔, 研究就像挖井. 1. 什么是学习 学习 (study) 是获得技能、知识、方法的过程. 学习有两种模式: 一是直接获得前人总结的经验; 二是从数据中总结规律. 2. 什么是研究 研究 (research) 是对已有或新的问题进行探索, 获得新技能、新知识、新方法的过程.…

【kubernetes】相关pod的创建和命令

【书写方法】: 管理使用k8s集群时,创建资源的Yaml文件非常重要,如何快速手写呢? 根据命令提示书写: kubectl explain [资源名称]例如打算写pod资源文件时,可查看如下: # 查看pod下所有字段 …

IO多路复用,select、poll和epoll简介

文章目录 前言1、select2、poll3、epoll4、总结 前言 select、poll 和 epoll 是 Linux 下用于多路复用 I/O(Input/Output)的系统调用,它们用于监视多个文件描述符,以查看哪个文件描述符上有可读、可写或发生了异常的事件。 1、sel…

python之多线程和多进程以及threading和multiprocessing模块

在 Python 中,多线程和多进程是实现并发编程的两种主要方式。多线程适用于 I/O 密集型任务,而多进程适用于 CPU 密集型任务。Python 提供了 threading 模块用于多线程编程,提供了 multiprocessing 模块用于多进程编程。 多线程 基本用法 使…

深度学习100问9-什么是word2vec模型

Word2vec 模型是一种用于将词语转换为向量表示的工具。 想象一下,我们有很多很多的词语,就像一个个不同的小盒子。Word2vec 模型的作用就是给每个小盒子都找到一个对应的位置,这个位置用一个向量来表示。这样,意思相近的词语在这…

Google Colab快速使用

Google Colab快速使用 1. 引言2. Jupyter笔记本的创建3. 上传代码和数据集4. Colab常规指令 1. 引言 Google Colab是谷歌提供的免费Jupyter,很类似于Linux系统这些在终端界面操纵的感觉,不需要深度学习环境配置就可以使用,完全基于云端运行。…

Shell输出、重定向与管道符

Shell输出、重定向与管道符 1、Shell输出1.1、标准输入输出1.2、echo指令1.3、print与printf指令 2、Shell重定向3、Shell管道符 由于Shell脚本批处理的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此,使用重定向和管道…

在Windows Server 2012 R2上安装.NET Framework 3.5

在Windows Server 2012 R2上安装.NET Framework 3.5,可以按照以下步骤进行: 打开服务器管理器: 首先,登录到Windows Server 2012 R2的服务器。然后,打开“服务器管理器”。添加角色和功能: 在“服务器管理…

react面试题五

一、请解释React中的高阶组件(HOC)和Hooks。 在React中,高阶组件(High-Order Components, HOCs)和Hooks是两种强大的特性,它们用于重用组件逻辑。尽管它们的目的相似,但它们在实现和使用方式上有…

使用Python恢复Windows、Linux、MacOS回收站中的文件和目录

一、使用Python恢复Windows回收站中的文件和目录 import os import platformdef put_back_trash():# 获取操作系统类型os_type platform.system()if os_type "Windows": # Windowsfrom winshell import recycle_binfor item in recycle_bin():winshell.undelete(…

针对防火墙IPSec业务不通或业务丢包问题,防火墙如何做流量统计、远程抓包、报文示踪

问题描述 针对防火墙IPSec业务不通或业务丢包问题,防火墙如何做流量统计、远程抓包、报文示踪 解决方案 1)配置流统和远程抓包用的ACL; system [sysname] acl 3555 [sysname-acl-adv-3555] rule permit icmp source 10.82.100.215 0 destin…