首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

痞子衡嵌入式:在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法

编程知识
2024年08月25日 16:44

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在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主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

From:https://www.cnblogs.com/henjay724/p/18379219
本文地址: http://shuzixingkong.net/article/1427
0评论
提交 加载更多评论
其他文章 聊一聊 C# 中让人惶恐的 Bitmap
一:背景 1. 讲故事 在.NET高级调试的旅程中,我常常会与 Bitmap 短兵相接,它最大的一个危害就是会让程序抛出匪夷所思的 OutOfMemoryException,也常常会让一些.NET开发者们陷入其中不能自拔,痛不欲生,基于此,这一篇我从dump分析的角度给大家深挖一下 Bitmap 背
聊一聊 C# 中让人惶恐的 Bitmap 聊一聊 C# 中让人惶恐的 Bitmap 聊一聊 C# 中让人惶恐的 Bitmap
Graphics2D绘图方法总结
使用Java的Graphics2D类,绘制业务需要的图形模板,然后在具体流程中填充数据,并且将图形存储起来。
Graphics2D绘图方法总结 Graphics2D绘图方法总结
计算机组成原理【3】:数据的表示和运算-下
概述 浮点数的表示和运算 浮点数的表示;IEEE 754标准;浮点数的加/减运算 浮点数的表示与运算 浮点数的表示 浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样在位数有限的情况下,既扩大了数的表示范围,又保持数的有效精度。 浮点数的表示格式 浮点数由符号、尾
计算机组成原理【3】:数据的表示和运算-下 计算机组成原理【3】:数据的表示和运算-下 计算机组成原理【3】:数据的表示和运算-下
修改kubeadm证书过期时间及更新k8s集群证书
一、为什么要修改 kubeadm 证书时间 Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。 不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有
Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
众所周知,苹果MacOs系统虽然贵为Unix内核系统,但由于系统不支持N卡,所以如果想在本地跑AI项目,还需要对相关的AI模块进行定制化操作,本次我们演示一下如何将基于Python3.11的AI项目程序打包为MacOS可以直接运行的DMG安装包,可以苹果系统中一键运行AI项目。 MacOs本地部署A
Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon) Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon) Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
题解:SP22382 ETFD - Euler Totient Function Depth
题目链接: link,点击这里喵。 前置知识: 【模板】线性筛素数,欧拉函数,点击这里喵。 题意简述: 给定整数 $l,r,k$,求出 $[l,r]$ 中有多少个整数不断对自己取欧拉函数刚好 $k$ 次结果为 $1$。 思路: 看眼数据范围,$10^{10}$ 的量级显然不容我们每次暴力,故考虑预处
Linux系统性能调优技巧
Linux系统性能调优是一个复杂而细致的过程,它涉及到硬件、软件、配置、监控和调优策略等多个方面。以下将详细阐述Linux系统性能调优的技巧: 一、硬件优化 CPU优化 选择适合的CPU:根据应用需求选择多核、高频的CPU,以满足高并发和计算密集型任务的需求。 CPU缓存优化:确保CPU缓存(L1、
推荐2款实用的持续集成与部署(CI&CD)自动化工具
前言 最近DotNetGuide技术社区交流群有不少同学在咨询:持续集成与部署(CI&CD)自动化工具有什么好用的推荐?今天大姚给大家推荐2款实用且免费的持续集成与部署(CI&CD)自动化工具,希望可以帮助到有需要的同学。 持续集成与部署工具的作用 持续集成(CI)和持续交付/部署(
推荐2款实用的持续集成与部署(CI&CD)自动化工具 推荐2款实用的持续集成与部署(CI&CD)自动化工具 推荐2款实用的持续集成与部署(CI&CD)自动化工具