打印
[信息]

【实战经验】IAR下如何让程序在RAM中运行

[复制链接]
10626|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 14:53 编辑

实战经验:IAR下如何让程序在RAM中运行

                             《IAR下如何将程序拷贝在RAM中运行》
一.前言
有时候我们需要将一部分程序从FLASH拷贝到RAM中运行,以提高程序运行的速度。本文基于IAR Embedded Workbench列出了一些方法,可以在系统启动时自动从FLASH中将这部分程序拷贝到RAM中运行。本文中所有例子都是在IAR v7.2下,基于STM32F334完成的。

二. IAR下将程序拷贝到RAM中运行的方法
1. 利用关键字__ramfunc
IAR中提供了关键字来声明将某个函数放在RAM中运行。该函数用关键字__ramfunc声明后,编译器将这段程序和其他的需要初始化的变量一起放在一个具有读/写属性的区域(SECTION),系统启动时自动和其他的需要初始化的变量一起被从ROM拷贝到RAM。使用__ramfunc关键字的缺点就是,不能指定具体的RAM位置。

在定义为__ramfunc的函数中调用非__ramfunc函数,会出现下面的警告:“Warning[Ta022]: Possible rom access (array) from within a __ramfunc function ”
而且在ramfunc的函数中调用不是ramfunc的函数会降低执行速度。

2. 将程序放在指定的RA区域运行
当我们不仅想让程序在RAM中运行,还想指定特定的RAM区域时,可以将相关程序放在自定义SECTION,然后在linker文件中指定该SECTION的存储位置。比如STM32F334的CCM RAM,可以在其中执行时间关键程序。我们现在将说明如何将一段代码在上电后拷贝到CCM RAM中运行。

步骤一:修改Linker文件。可以对比参考工程中的stm32f334x8_CCMRAM.icf与stm32f334x8_flash.icf文件,查看修改的地方。

从编译后的map文件中可以看出:ramcode在flash中是保存在0x080012a4开始的位置,在系统初始化时,由__iar_copy_init3函数从flash 的0x080012a4位置拷贝到0x10000000。


3. 将多个函数放在指定位置
IARv6.7版本以后增加了两个新的pragma指令:#pragma default_function_attributes和#pragma default_variable_attributes。在需要指定位置的函数或者变量前后,以一定格式加上这两个指令,就可以轻松地将多个函数或变量放在指定的位置。
按照前文介绍的方法修改linker文件:

在需要指定位置的程序组开始的位置,用”#pragma default_function_attributes = @“SECTION NAME” ”的格式说明要将下面的函数放到哪个SECTION。
然后在程序组结束的位置,用”#pragma default_function_attributes = “的格式说明从这里开始定义的函数不再放到前面指定的SECTION。








对应的代码run in ram
更多实战经验,请看:【ST MCU实战经验汇总贴】








沙发
mmuuss586| | 2015-6-5 12:28 | 只看该作者

最好也增加个KEIL MDK的吧;

使用特权

评论回复
板凳
香水城|  楼主 | 2015-6-5 14:02 | 只看该作者
好的,考虑让FAE补充一下

使用特权

评论回复
地板
搞IT的| | 2015-6-5 22:17 | 只看该作者
看着高达上啊。很实用的东西

使用特权

评论回复
5
turnfey| | 2016-3-12 09:56 | 只看该作者
想问一下,若想要在执行某一特定任务时,才将程序加载到RAM中,初始化时不自动从FLASH中拷贝到RAM,而在正常情况下,该部分RAM不占用,需要释放出来给其它变量使用,这是否可以实现,若可以该怎么做?

使用特权

评论回复
6
LIMBO123| | 2016-4-27 18:15 | 只看该作者
谢谢分享

使用特权

评论回复
7
戈卫东| | 2016-4-27 19:11 | 只看该作者
学习。。。

使用特权

评论回复
8
X--| | 2017-3-27 11:21 | 只看该作者
楼主,请教个问题。
IAR的环境,我把一段代码用 #pragma location="MY_RAM_FUNC" copy到RAM中运行,查看编译后的代码,发现调用的一个貌似系统函数,而这个系统函数在flash里面。这个时候我把flash 已经关了。程序就执行不动了。

RAM.jpg (125.96 KB )

RAM.jpg

使用特权

评论回复
9
X--| | 2017-3-27 11:25 | 只看该作者
RAM的地址域是from 0x0000 to 0x07FF
flash的地址域是from 0x8000 to 0xFFFF
在RAM中运行,关掉flash。 是为了低功耗运行。
请大神们指点一二!

使用特权

评论回复
10
51xlf| | 2017-3-27 16:43 | 只看该作者
这样就不用烧写flash了。

使用特权

评论回复
11
51xlf| | 2017-3-27 16:46 | 只看该作者
以前只在DSP上使用过在ram烧写程序。

使用特权

评论回复
12
gotofly21| | 2017-4-20 08:47 | 只看该作者
试了一下,把一个中断加__ramfun  看map函数地址确实在ram中 ,但是函数执行时间原来500ns  变为了700多ns,反而变慢了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17066

帖子

283

粉丝