[其他] MM32在KEIL环境中实现部分代码在RAM中运行

[复制链接]
 楼主| powerantone 发表于 2021-4-12 16:47 | 显示全部楼层 |阅读模式
一、简介
在MCU的实际使用过程中,一般的程序是放在FLASH中运行,但有时候我们需要程序的运行速度更快,系统有更好的实时性,这时我们可以将这部分代码放到RAM中运行。在本文中小编会通过MM32F073的一个实际例子来给大家介绍在KEIL环境中如何让程序运行在RAM上。
二、实验
本文的例子建立在一个LED_BLINK 的例程上,通过编译后观察MAP文件来看LED_TOGGE函数的位置。
首先看LED_BLINK 例程的主要函数,如下图:
164246f81i9i0efti8p0i6.jpg
看LED_TOGGE在FLASH中运行的情况,
164246zi4zwpmagtka64fh.jpg
可看到函数LED_TOGGE编译后的地址在FLASH中。
然后我们将LED_TOGGE放到SRAM中。
操作步骤:
A、 紧接上面的编译完成后会有一个.sct文件,现在我们需对这个文件进行修改,在linker的目录下进行如下图设置,点击Edit,我们便可对该文件进行修改。
164247ssxy6wb9by9xxxzb.jpg
B、在.sct文件中,定义一个RAMCODE的section,放在RW_IRAM1执行区域(0x20000000-0x00002000)。
修改内容如下图所示:
164247j9tccftpyvfjf9y9.jpg
C、方法一:用#pragma ARM section code = “RAMCODE”和#pragma armsection将需要放到SRAM中的程序包括起来;
164247r1m07zjmdzdj5v6e.jpg
方法二:在需要放到RAM中的函数前,用__attribute__((section("RAMCODE")))声明该函数放在RAMCODE section中。
  
164247zssnscstbosgs2l2.jpg
编译时,编译器会自动将这些函数放到RAMCODE所在0x20000000开始的区域。
D、结果如下图,此时LED_TOGGE编译后的地址在SRAM中的0x20000000开始的区域。
164247ywd7yv5dedalctcv.jpg
注意事项:
注意该函数中调用到的所有函数也要放到RAMCODEsection中,#pragma arm section code=“RAMCODE ”和#pragma arm section中可以包含多段代码。










两只袜子 发表于 2021-4-12 16:56 | 显示全部楼层
很好的理论知识贴,收获不少
yangjiaxu 发表于 2021-5-23 18:06 | 显示全部楼层
这么操作 能快多少?
734774645 发表于 2021-5-27 15:52 | 显示全部楼层
sct文件有相关的教程没,遇到这种操作,我都是不会的,想学习一下。
skyred 发表于 2021-6-17 17:33 | 显示全部楼层
一遇到地址内存的,我就头疼,又总想试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

670

主题

3890

帖子

4

粉丝
快速回复 返回顶部 返回列表