【嵌入式】MDK使用sct文件将代码段放入RAM中执行

news2025/1/19 8:14:45

sct文件即分散加载文件,是ARMCC编译器使用的链接脚本文件,等同于GCC编译器的ld链接脚本。MDK IDE使用的是ARMCC。

支持NorFlash中运行代码(XIP)的MCU例如STM32,一般将所有代码(text段)都放在FLash中,但是Flash的访问速度低于和CPU、RAM,如下图(STM32F103):

当CPU主频为72Mhz的时候,为了弥补CPU和Flash之间的速度差异,需要在访问Flash的时候插入等待周期,否则Flash访问会有问题。因此在整个MCU的运行速度的木桶短板为Flash存储器的访问速度。为了提高代码运行速度,可以将代码装入RAM中,MCU的RAM速度和CPU速度没有差异(不像MPU,中间需要使用cache弥补CPU和RAM之间的速度差异),因此从RAM中执行代码可以提高运行速度。同时在进行Flash编程擦写的时候,Flash是无法读写的,这时候如果遇到中断的话,是无法进入中断处理函数的,但是如果代码放在RAM中,就没有影响了。

为了将代码放入RAM中运行,需要使用链接脚本控制代码段位置,使用MDK的ARMCC编译器就需要sct分散加载文件。创建一个sct文件main.sct,在RW_IRAM1存储器中添加一个.ramcode段,如下所示:

; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region

  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

    .ANY (+RO)

   .ANY (+XO)

  }

  RW_IRAM1 0x20000000 0x00005000  {  ; RW data

   *.o(.ramcode)

   .ANY (+RW +ZI)

  }

}

然后再MDK的Options的Linker选项卡中使用我们自定义的sct文件:

 最后将我们需要放在RAM中的代码使用attribute关键字放入ramcode段中:

__attribute__((section(".ramcode"))) void DMA1_Channel4_IRQHandler()
{
    DMA_ClearFlag(DMA1_FLAG_TC4);
    int i;
    for(i=0;i<sizeof(SPI2_RX_DMA_Buff);i++)
        printf("%c",SPI2_RX_DMA_Buff[i]);
    printf("\r\n");
}

编译之后查看map文件中DMA1_Channel4_IRQHandler的信息:

    DMA1_Channel4_IRQHandler                 0x20000001   Thumb Code   684  main.o(.ramcode)

可以看到DMA1_Channel4_IRQHandler函数的位置位0x20000001(代码的地址最后一位置1表示为thumb代码)。然后找到Execution Region RW_IRAM1:

    Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08003ab0, Size: 0x00003ec0, Max: 0x00005000, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x08003ab0   0x000003a0   Code   RO          137    .ramcode            main.o

可以看到ramcode段的Exec Addr为0x20000000,Load Addr为0x08003ab0,即这段代码存放在Flash的0x08003ab0,需加载到0x20000000处运行。加载过程同bss段清零和data段复制类似,在main函数调用之前就会被执行(MDK的ARMCC会自动生成这部分代码,gcc编译器需要自己写)。

实验发现,放在RAM中执行代码相较于Flash,确实有速度提升(没有做定量分析实验)!但是注意代码放在RAM中比较占用RAM空间,并且在Flash中还是会存放代码的,只是在运行时拷贝到RAM中去。

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

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

相关文章

[ 云计算 | AWS ] 亚马逊云科技核心服务之计算服务(Part1:AWS EC2 星巴克为什么横向排队)

(星爸爸网络上的一张图) 注意上图中的5个人&#xff0c;对没错这5个人。一般情况星巴克的人员配置大概是这样的&#xff1a; 1个经理&#xff0c;在办公室两个收银&#xff0c;在收银台&#xff08;本文关注的重点&#xff09;三个人做咖啡 当你去过星巴克买咖啡时&#xff0…

【NS2】tcl与c++互相调用/传参

在NS2&#xff0c;做实验的时候&#xff0c;为了能通过循环配合传值实验&#xff0c;一直找不到tcl传参给c的方法&#xff0c;网上的只po出一部分看不懂&#xff0c;只能通过源码自己研究。最后的解决办法就是&#xff0c;模仿源码的操作&#xff0c;以下通过tcl→ex→sat-irid…

Navicat Monitor 3.0 现已上市 | 欢迎下载试用

Navicat Monitor 3.0 现已上市Navicat Montior 3.0 现已发布&#xff01;一经发布&#xff0c;受到广大专业运维人员的关注与选择! 五大新亮点带给运维团队最为实用且有效地提升监控能力。其具备 PostgreSQL 服务器监控能力、支持优化慢查询、构建自定义指标、性能分析工具优化…

flutter问题

问题一1.报错&#xff1a;Flutter ios/Flutter/Debug.xcconfig: unable to open file (in target "Runner" in project "Runner")2.解决&#xff1a;cd 项目目录flutter cleanflutter create --org solanddriver .运行Xcode问题二1.Cannot run with sound …

Java线程安全问题的原因和解决方案

1.什么是线程安全2.线程不安全的原因 及 解决措施2.1 多线程同时修改同一个变量2.2 修改操作不是原子性加锁操作关键字&#xff1a;synchronized2.3 抢占式执行,随机调度 (根本原因)2.4内存可见性问题volatile 关键字2.5指令重排序1.什么是线程安全 线程安全的确切定义是比较复…

Java——SSM项目(瑞吉外卖)笔记

阅读提醒&#xff1a;最重要的内容都是我手打的字&#xff0c;还有截图上的红字备注部分。 nginx是一个服务器&#xff0c;主要部署一些静态的资源&#xff0c;包括后面做tomcat的集群&#xff0c; 可以接收前端的请求&#xff0c;然后分发给各个tomcat 第一步搭建数据库&…

浏览器网页视频怎么快速下载到本地?

我们在浏览网页时&#xff0c;经常会遇到一些特别喜欢的视频文件&#xff0c;想要下载收藏却苦于不会操作怎恶魔办呢&#xff1f;这时候可以通过一些小插件快速达成下载&#xff0c;比如通过猫爪视频下载插件用户可以轻松的抓取任意网页的视频文件&#xff0c;并将其保存到本地…

Java 利用PriorityQueue进行无InvokerTransformer反序列化

java_PriorityQueue java.util.PriorityQueue 是一个优先队列&#xff08;Queue&#xff09;&#xff0c;节点之间按照优先级大小排序成一棵树。其中PriorityQueue有自己的readObject反序列化入口。 反序列化链为&#xff1a;PriorityQueue#readObject->heapify()->sif…

新网站沙盒期要多久(关于网站走出沙盒期的征兆)

做网站优化首先要明白搜索引擎抓取原理&#xff0c;不管是百度还是谷歌&#xff0c;新站上线总要进入沙盒&#xff0c;接受来自搜索引擎的审查&#xff0c;涉及网站结构、网站内容、网站外链等内容。对于新手朋友来说&#xff0c;难免着急&#xff0c;这段考察期究竟有多长&…

【Python获取相亲网站数据】马上都元宵节了,还在相亲,看看某相亲网站有没有那个有缘人。

前言 马上都元宵节了&#xff0c;还在相亲&#xff0c;看看某相亲网站有没有那个有缘人。今天我们来爬取某相亲网站获取我们想要的数据&#xff0c;比如说&#xff0c;对方的姓名&#xff0c;年龄&#xff0c;身高&#xff0c;体重等等。今天我们主要使用CSS选择的方法来匹配我…

IDEA插件开发入门.01

环境准备Idea插件SDK文档在线地址&#xff1a;https://plugins.jetbrains.com/docs/intellij/welcome.html安装IntelliJ IDEA&#xff0c;这里使用版本2020.1.3 X64IDEA中安装Plugin DevKit插件创建插件项目新建工程。File ->New -> Project选择工程类型&#xff0c;Inte…

无法应用转换程序。请检查指定的转换程序路径是否有效。例子:Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装

不知道大家有没遇到这种情况&#xff0c;Adobe Acrobat DC (PDF编辑器)卸载不了或者无法重新安装&#xff0c;显示&#xff1a;无法应用转换程序。请检查指定的转换程序路径是否有效。 今天小编句遇到了这种情况&#xff0c;卸不了&#xff0c;把文件夹直接删了还是无法重新安装…

Linux安装Mysql8.0

mysql官网 www.mysql.com 这里是新建了个虚拟机 有时候用 rpm -qa|grep mysql和 rpm -qa|grep mariadb检测不到已经安装了mysql或者mariadb 可以使用rpm -qa|grep -i mysql 自己对Linux学习阶段,因此新建虚拟机安装 卸载原来的mariadb rpm -e mariadb-libs rpm -e --node…

微信如何注册小号?一个手机号注册两个微信账号?图文教学

2023年2月3日微信正式开放注册“小号”的功能&#xff0c;也就是可以使用一个手机号来注册两个微信账号。微信作为很多一款国民级别的工具&#xff0c;早就成为了小伙伴日常生活中不可或缺的一部分了。能够注册微信小号自然很好&#xff0c;可是微信如何注册小号呢&#xff1f;…

什么是窜货?为什么要治理窜货?如何正确治理窜货?

一、什么是窜货 “窜货”行为&#xff0c;就是超出自己授权范围&#xff0c;在非授权区域出售商品的行为。一般有线下窜区域销售、线下商品窜货线上销售两种情况。 二、为什么会出现窜货 1、窜货最常见的原因是&#xff0c;当经销商的授权区域市场趋向饱和时&#xff0c;或其…

茶杯:N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置。

N个杯子排成一排&#xff0c;第X个杯子藏有球&#xff0c;交换任意两个杯子K次后&#xff0c;找出藏球杯子位置。 (本文获得CSDN质量评分【85】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完…

Idea JSP 学习

运行JSP文件首次使用Idea运行jsp文件遇到的问题汇总。运行出现404错误。首先配置好Tomcat,我选用的是Tomcat 10.0.27.安装好Tomcat,并进行相关配置。我用的是IDEA2020.2.3 x64版本&#xff0c;不同版本会有区别。这是我的以上配置&#xff0c;特别注意下图三角标识的test.jsp。…

【JavaEE】单例模式详解

目录 一、单例模式的概念 二、饿汉模式 三、懒汉模式 &#xff08;1&#xff09;懒汉模式-单线程版 &#xff08;2&#xff09;懒汉模式-线程安全多线程版 啥是设计模式咧&#x1f914;设计模式好比象棋中的棋谱。红方当头炮&#xff0c;黑方马来跳&#x1f463;。针对红方…

鸿蒙开发学习|HarmonyOS是什么

鸿蒙开发学习 第一章 HarmonyOS是什么文章目录鸿蒙开发学习前言一、什么是HarmonyOS二、HarmonyOS系统架构2.1 内核层2.2系统服务层2.3框架层2.4应用层三、HarmonyOS系统特性3.1 对消费者3.2.对应用开发3.3.对设备开发四、HarmonyOS系统四大技术特性4.1 分布式架构首次用于终端…

LabVIEW最大内存块属性不存在

LabVIEW最大内存块属性不存在在NI Linux实时操作系统目标中使用系统属性节点和分布式系统管理器&#xff08;DSM&#xff09;&#xff0c;但遇到一些问题&#xff1a;它未正确报告系统上的可用物理内存量。在NI Linux实时系统上出现错误-2147220623尝试在NI Linux实时上监测RAM…