你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】IAR 下如何将程序拷贝在 RAM 中运行

[复制链接]
STMCU小助手 发布时间:2022-3-2 21:44
一. 前言1 V4 X* E! y; v; B  S4 P
有时候我们需要将一部分程序从 FLASH 拷贝到 RAM 中运行,以提高程序运行的速度。本文基于 IAR Embedded Workbench 列出了一些方法,可以在系统启动时自动从 FLASH 中将这部分程序拷贝到RAM 中运行。本文中所有例子都是在 IAR v7.2 下,基于 STM32F334 完成的。! R1 @7 b/ s3 E  k
二. IAR 下将程序拷贝到 RAM 中运行的方法
5 H9 C" ~- O$ V, F% r3 g1. 利用关键字__ramfunc+ u/ V  ^# p7 }
   IAR 中提供了关键字来声明将某个函数放在 RAM 中运行。该函数用关键字__ramfunc 声明后,编译器将这段程序和其他的需要初始化的变量一起放在一个具有读/写属性的区域(SECTION),系统启动时自动和其他的需要初始化的变量一起被从 ROM 拷贝到 RAM。使用__ramfunc 关键字的缺点就是,不能指定具体的 RAM 位置。8 w8 X0 x" `, M, A: ]8 D, ^

, g/ x& Y  C9 l) f; A9 v% m! ]
  1. <div>__ramfunc void ramcode (void)</div><div>{</div><div> uint32_t i ;</div><div> for(i=0; i<1000; i++)</div><div> {</div><div> asm("nop");</div><div> }</div><div>}</div>
复制代码

* w, C& Y0 s; l9 t5 D' l8 k8 k# c: l! u' ^  Z3 b
编译后的 map 文件中,可以看到函数 ramcode 的地址在 RAM 范围:9 Z2 z  X8 g- w4 a! P: ~4 l6 i* P

8 P( X1 t/ g7 P1 W (4APOM5X~RS%PYD8%J659U0.png / C7 U) D% [6 t* O( f& ?

! o+ H% i1 i9 s4 g2 d7 j" Q, U在 map 文件的 INIT TABLE 部分可以看出,ramcode 在 flash 中是保存在 0x080012a4 开始的位置,在系统初始化时,由__iar_copy_init3 函数从 flash 的 0x080012a4 位置拷贝到 0x20000000 的。
5 i1 m* L! x! `3 ?8 `7 e$ Q) n  z1 p4 o7 R" c
7C}(]R3UR}{}O9{A@DQ2VMT.png
' K( t6 W: Z3 a2 d$ f% O" x& k5 i; H7 F/ \6 R$ ?6 A
在定义为__ramfunc 的函数中调用非__ramfunc 函数,会出现下面的警告:. B" ~1 V) n1 g/ u0 ~9 I$ t+ N
  1. “Warning[Ta022]: Possible rom access (array) from within a __ramfunc function ”
复制代码
; @- X1 Y- _3 S" A- ?2 s
5 \) X* G) W' d6 Y9 X8 ?% J
而且在 ramfunc 的函数中调用不是 ramfunc 的函数会降低执行速度。$ K' L( S. d& f- E- S0 u/ y
# U/ I! h: t* Q8 e$ \* ~" I
2. 将程序放在指定的 RA 区域运行
6 f! A4 R$ \$ _. i7 F+ O当我们不仅想让程序在 RAM 中运行,还想指定特定的 RAM 区域时,可以将相关程序放在自定义SECTION,然后在 linker 文件中指定该 SECTION 的存储位置。比如 STM32F334 的 CCM RAM,可以在其中执行时间关键程序。我们现在将说明如何将一段代码在上电后拷贝到 CCM RAM 中运行。. b* ?" D( h' K- c# K
步骤一:修改 Linker 文件。可以对比参考工程中的 stm32f334x8_CCMRAM.icf 与stm32f334x8_flash.icf 文件,查看修改的地方。
& c. q$ T- N9 B
  1. <div>//将自定义的 SECTION RAMCODE 增加到程序启动时自动执行初始化的列表里</div><div>initialize by copy { readwrite, section RAMCODE};</div><div>//用 place in 指令将 RAMCODE SECTION 放到 CCMRAM 区</div><div>place in CCMRAM_region {section RAMCODE};</div>
复制代码
! d: Q: W3 C% i; \4 w' l) t; L

+ q( u9 H8 R) U5 x步骤二:将程序放在指定的 SECTION
0 j* O5 O: U' ]* u- e, p
  1. <div>//用 pragma 指令将程序放在指定的 SECTION</div><div>#pragma location = "RAMCODE"</div><div>void ramcode(void)</div><div>{</div><div> ……</div><div>}</div>
复制代码
2 }# A& x& p# M! X/ S1 A, J
" R* R) H7 L0 i. O, |1 l/ A+ h
还可以通过下面的方式将程序放在指定的 SECTION9 P+ u3 n# ]4 R3 k6 Y
  1. <div>void ramcode(void) @ “RAMCODE”</div><div>{</div><div> ……</div><div>}</div>
复制代码

8 u$ E, P6 ^" _: P
) ^$ c5 C8 R- `3 w/ A( ]: \从编译后的 map 文件中可以看出:ramcode 在 flash 中是保存在 0x080012a4 开始的位置,在系统初始化时,由__iar_copy_init3 函数从 flash 的 0x080012a4 位置拷贝到 0x10000000。
8 ]- T$ e. x6 O3 L. c) U
, t# G% l* P  B$ } L_]J}0N@2%]1J1N[JFES.png . {5 R% Y5 d5 C4 W$ D
' d  G- w* E: ~, v/ k6 V
如果想更具体一点,将程序放在指定的地址 0x10000010。只需要在 linker 文件中做如下修改:5 k* S; `0 X5 `- G9 L
  1. <div>修改前:</div><div>place in CCMRAM_region {section RAMCODE};</div><div>修改后:</div><div>place at address mem:0x10000010 {section RAMCODE}</div>
复制代码
2 T: d  H+ s- K

6 m) T6 V, [, g* A3. 将多个函数放在指定位置# W# t1 V6 e# j$ {, M* `! U
IARv6.7 版本以后增加了两个新的 pragma 指令:#pragma default_function_attributes和#pragma default_variable_attributes。在需要指定位置的函数或者变量前后,以一定格式加上这两个指令,就可以轻松地将多个函数或变量放在指定的位置。6 m# k5 b; J4 |8 ~! x
按照前文介绍的方法修改 linker 文件:+ w& ^0 K2 H  ^0 q, Z* p& t# a1 c% ?: O
0 ]$ r# F9 R+ O1 Z- Y$ [# f. y) B
$FCQAYQW%3~05QO$EN)950B.png
5 |' T" p5 @3 P- o2 l+ ?( g  {0 m# }6 _
在需要指定位置的程序组开始的位置,用”#pragma default_function_attributes = @“SECTION NAME” ”的格式说明要将下面的函数放到哪个 SECTION。
6 J  Y6 [; l0 w5 r* U: u然后在程序组结束的位置,用”#pragma default_function_attributes = “的格式说明从这里开始定义的函数不再放到前面指定的 SECTION。5 f# ~* j- K5 y7 L6 ?
; E( e) z. J, q) |" j: ?1 @
}WPZA_G[`5Q_U4AZS(B)_[S.png ) A! H) C* i  T: m
5 L2 u" ~6 L) K0 P% c+ d
我们看看编译后的 map 文件。flashcode 在 FLASH 里面,而 ramcode, ramcode2 被放在了 CCMRAM 里。
+ _# l0 `6 L1 {/ ]# l
' P: I0 c$ [7 m0 A3 s5 D6 K3 D' i
- I2 K8 M9 }9 B5 F JQ$[}E5}Q14QT~5P)_83L$A.png & ^" g% H! w; Z) N

0 D& k1 {6 r# m7 S0 L* Z) Z. \/ F. Y
赞 收藏 评论0 发布时间:2022-3-2 21:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版