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

这篇具有很好参考价值的文章主要介绍了【嵌入式】MDK使用sct文件将代码段放入RAM中执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

STM32 MCU是支持在RAM中执行代码的,I-bus可以访问SRAM,参考之前的STM32在RAM中执行代码的测试文章:【ARM】STM32在RAM中运行代码测试_筐 Quant的博客-CSDN博客_stm32在内存运行代码

但是这个测试只能验证RAM中执行代码的可行性,没法真正使用。为了将正常代码放入RAM中运行,需要使用链接脚本控制代码段位置,使用MDK的ARMCC编译器就需要sct分散加载文件,使用gcc的使用ld脚本,参考:【嵌入式】使用链接脚本从零创建STM32代码工程_筐 Quant的博客-CSDN博客

这里使用MDK,创建一个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文件:

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

 最后将我们需要放在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中去。文章来源地址https://www.toymoban.com/news/detail-406089.html

到了这里,关于【嵌入式】MDK使用sct文件将代码段放入RAM中执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Keil MDK的sct分散加载文件详解

    MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。 工程构建时, MDK 会根据我们选择的芯片型号,获知芯片的内部

    2024年02月02日
    浏览(35)
  • Git基础教程:使用Git Pull从远程仓库拉取代码(适用于嵌入式开发)

    Git基础教程:使用Git Pull从远程仓库拉取代码(适用于嵌入式开发) 在嵌入式开发中,使用版本控制系统是一种常见的做法,以便团队成员之间能够协同开发,并保持代码的版本管理。其中,Git是一种广泛采用的分布式版本控制系统,它提供了许多强大的功能来管理代码库。

    2024年02月08日
    浏览(47)
  • 在嵌入式Linux中使用C++读取 /proc/meminfo 文件来获取系统内存大小

    在嵌入式Linux中,可以使用C++编程语言通过读取  /proc/meminfo  文件来获取系统内存大小。以下是一个示例代码片段: 上述代码打开  /proc/meminfo  文件并逐行读取其中的内容。当找到以 \\\"MemTotal:\\\" 开头的行时,提取出内存大小信息并去除空格和单位(KB),然后将其转换为无符

    2024年02月10日
    浏览(46)
  • 嵌入式软件开发常用的编辑代码工具、比较工具和测试工具的使用说明和操作步骤

    嵌入式软件开发常用的编辑代码工具有: Eclipse Eclipse是一款开源的集成开发环境,支持多种编程语言和插件,适用于多种嵌入式开发平台。以下是Eclipse的使用说明和操作步骤: 步骤1:创建新工程 单击“File”菜单,选择“New”→“Project”选项,选择工程类型和开发平台。

    2024年02月02日
    浏览(101)
  • 【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载

    【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载 单一模型: 将程序中所有功能全部实现于一个单一的源文件内部。编译时间长,不易于维护和升级不易于协作开发。 分离模型 将程序中的不同功能模块划分到不同的源文件

    2024年01月15日
    浏览(56)
  • 嵌入式Linux开发——解决uboot无法使用nfs服务从ubuntu中下载文件(TTT、cannot mount等错误)

    最近在学习正点原子嵌入式Linux开发板uboot的移植实验,移植完之后想测试网络部分的驱动能否工作正常。最后经过测试发现tftp可以正常下载,nfs却一直报错无法下载文件,最后也是折磨了两天才解决了问题,特写下此博客进行记录、总结。 我的轻薄本没有网口,事先买了一

    2024年01月20日
    浏览(41)
  • 嵌入式代码查看分析利器---Understand

      平时在开发嵌入式程序的时候大多数使用的都是keil软件,一般小的工程使用keil没感觉到有什么问题,但是当工程比较大的时候,比如移植了FreeRTOS系统或者LWIP网络系统时,代码全部编译一次就要花费很长世间,特别是开启了点击函数右键跳转的功能之后,速度更加慢。

    2024年02月01日
    浏览(101)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省

    2023年04月15日
    浏览(104)
  • 嵌入式 QT纯代码设计UI

        目录 1.1 实例功能 1.2 界面创建 1.3 界面组件的创建与布局 1.4 信号与槽的关联 UI 的可视化设计是对用户而言的,其实底层都是 C++ 的代码实现,只是 Qt 巧妙地进行了处理,让用户 省去了很多繁琐的界面设计工作。   由于界面设计的底层其实都是由 C++ 语言实现的,底层

    2024年03月09日
    浏览(56)
  • 嵌入式学习笔记(17)代码重定位实战 上篇

    3.5.1任务:在iSRAM中将代码从0xd0020010重定位到0xd0024000 注解:本练习对代码本身运行无实际意义,我们做这个重定位纯粹是为了练习重定位技能。但是某些情况重定位就是必须的,譬如在uboot中。 3.5.2思路 (1)通过链接脚本将代码链接到0xd0024000(链接地址) (2)使用dnw下载时将

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包