打印

STM32 外部扩展RAM

[复制链接]
12868|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
koy917|  楼主 | 2010-1-17 21:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
各位大侠,现在想STM32的内部RAM不够用,想扩展一片外部的SRAM,编译平台使用IAR FOR ARM 5.30,发现使用配置文件stm32f10x_flash_extsram.icf后,编译出来的文件没有使用内部的RAM,现在的问题就是如何让编译器先用内部RAM,用关键字来让特定的数组放到外部ram?这个问题比较急,求各位帮帮忙,谢谢。
来自 2楼
koy917|  楼主 | 2010-1-19 15:16 | 只看该作者
感谢again_gyf的提示,原来从来没有关心过编译器提供的文档,都是在网络寻找为主,结果这次找不到,才到bbs上问了半天,好在楼上的兄台一语道破天机,才让我恍然大悟,原来还有用户手册可以看,实在惭愧。
    开发手册,知道了IAR的RAM / ROM是可以指定范围的,而且比较灵活,给出了三种运算方式 | & - 有了这三种方式,就可以很灵活的定义你的RAM ROM的空间了,而且计算很方便。我在ICF中给出了RAM 的范围
define region RAM_region=mem:[from 0x20000000 to 0x6800ffff]-mem:[from 0x20002000 to 0x68000000];
编译后查看MAP 文件
"A1":  place at mem:0x8000000 { ro section .intvec };
"P1":  place in [from mem:0x8000000 to mem:0x807ffff] { ro };
"P2":  place in [from mem:0x20000000 to mem:0x20001fff] |
                [from mem:0x68000001 to mem:0x6800ffff] {
          rw, block CSTACK, block HEAP };
这说明和预期的范围是一致的,然后我在程序中定义了大量的数组,在编译器中选择不优化(怕把没什么用的数组优化掉)然后再查看map文件,它告诉我RAM的使用情况
"P2", part 1 of 4:                         0x7d4
  CSTACK                      0x20000000   0x400  <Block>
    CSTACK           uninit   0x20000000   0x400  <Block tail>
  HEAP                        0x20000400   0x200  <Block>
    HEAP             uninit   0x20000400   0x200  <Block tail>
  .iar.dynexit                0x20000600   0x1d4  <Block>
    .iar.dynexit     uninit   0x20000600     0xc  cppinit.o [3]
    .iar.dynexit     uninit   0x2000060c   0x1c8  <Block tail>
                            - 0x200007d4   0x7d4

"P2", part 2 of 4:                          0x98
  .bss               zero     0x200007d4    0x50  xfiles.o [3]
  .bss               zero     0x20000824    0x14  xsyslock.o [3]
  .bss               zero     0x20000838    0x10  main.o [1]
  .bss               zero     0x20000848     0x8  xxmemxmalloc.o [3]
  .bss               zero     0x20000850     0x4  main.o [1]
  .bss               zero     0x20000854     0x4  xgetmemchunk.o [3]
  .bss               zero     0x20000858     0x4  MtxWrapper.o [3]
  .bss               zero     0x2000085c     0x4  MtxWrapper.o [3]
  .bss               zero     0x20000860     0x4  MtxWrapper.o [3]
  .bss               zero     0x20000864     0x4  MtxWrapper.o [3]
  .bss               zero     0x20000868     0x4  iarwstd.o [5]
                            - 0x2000086c    0x98

"P2", part 3 of 4:                         0x14a
  P2 s0                       0x2000086c   0x14a  <Init block>
    .data            inited   0x2000086c    0x84  setlocale.o [3]
    .data            inited   0x200008f0    0x4c  localeconv.o [3]
    .data            inited   0x2000093c    0x40  xfiles.o [3]
    .data            inited   0x2000097c    0x10  stm32_eval.o [1]
    .data            inited   0x2000098c    0x10  stm32f10x_rcc.o [1]
    .data            inited   0x2000099c     0x8  stm32_eval.o [1]
    .data            inited   0x200009a4     0x8  stm32_eval.o [1]
    .data            inited   0x200009ac     0x4  stm32f10x_rcc.o [1]
    .data            inited   0x200009b0     0x4  cppinit.o [3]
    .data            inited   0x200009b4     0x2  stm3210e_eval_lcd.o [1]
                            - 0x200009b6   0x14a

"P2", part 4 of 4:                        0xfa04
  .bss               zero     0x68000004  0x3200  main.o [1]
  .bss               zero     0x68003204  0x3200  main.o [1]
  .bss               zero     0x68006404  0x3200  main.o [1]
  .bss               zero     0x68009604  0x3200  main.o [1]
  .bss               zero     0x6800c804  0x3200  main.o [1]
  .bss               zero     0x6800fa04     0x2  stm3210e_eval_lcd.o [1]
                            - 0x6800fa06  0xfa02
这说明分配的空间在连接时会自己定位,这样我的目的就达到了。
    再次感谢楼上的兄弟,不是我懒,实在是没想到看手册,也可以说明平时的开发习惯不好。问题总结道这里,希望对需要有类似应用的朋友有帮助。

使用特权

评论回复
板凳
zwll| | 2010-1-17 22:34 | 只看该作者
处女贴,帮顶

使用特权

评论回复
地板
koy917|  楼主 | 2010-1-18 08:48 | 只看该作者
呵呵,处女贴都被你顶了,谢谢。

使用特权

评论回复
5
again_gyf| | 2010-1-18 10:16 | 只看该作者
这个肯定要自己把变量分开放了,把放到内部的定义一个段,外部的也一个段

使用特权

评论回复
6
koy917|  楼主 | 2010-1-18 16:04 | 只看该作者
现在IAR 的ICF文件没有这个定义方式,编译出来,变量全部在外部RAM,MDK貌似可以分开,我在ON CHIP 和OFF CHIP里都填了对应的地址,然后定义了两个数组,结构发现一旦选了OFF CHIP后,变量全部放到外部RAM中,只有堆栈在内部ram中,我以为是没有沾满外部的RAM不会将变量编译到内部RAM中,加大数组空间后发现,超过外部RAM的容量,编译就出错了。现在就是不知道怎么才能将变量地址分开,也不知道变量声明时是否可以定义绝对地址,比如51的 XDATA 或者 _at_之类的定义方式。
感谢回复!

使用特权

评论回复
7
again_gyf| | 2010-1-18 20:39 | 只看该作者
汗!楼主你太懒了,IAR的手册里写的很详细的,我也提示你了,现在ICF定义变量放置的位置即section,再在定义的地方引用这个section,当然IAR也支持绝对地址定位@,详细去读手册!

使用特权

评论回复
8
koy917|  楼主 | 2010-1-19 08:31 | 只看该作者
谢谢提示,马上去看,有结果了马上上来做个总结

使用特权

评论回复
9
gxgclg| | 2010-1-19 20:53 | 只看该作者
楼主习惯很好,自己解决了就应该和别人分享

使用特权

评论回复
10
pkat| | 2010-1-19 22:05 | 只看该作者
总结的非常好

使用特权

评论回复
11
koy917|  楼主 | 2010-1-20 12:24 | 只看该作者
哈哈,谢谢大家,以后还请大家多多帮组。

使用特权

评论回复
12
abc532201460| | 2012-5-25 08:48 | 只看该作者
想请教一下楼主 IAR哪个名字的手册 翻查了很多 找不到

使用特权

评论回复
13
捡漏王子| | 2012-5-25 09:27 | 只看该作者
认真分析问题的人很好

使用特权

评论回复
14
(⊙o⊙)你| | 2014-6-2 10:50 | 只看该作者
koy917 发表于 2010-1-19 15:16
感谢again_gyf的提示,原来从来没有关心过编译器提供的文档,都是在网络寻找为主,结果这次找不到,才到bbs ...

LS你计算的好像不对,要减1才对

再者从你的map文件中定位语句看出也是不对的

[from mem:0x68000001 to mem:0x6800ffff]


正确的应该是: [from mem:0x68000000 to mem:0x6800ffff]


使用特权

评论回复
15
(⊙o⊙)你| | 2014-6-2 10:51 | 只看该作者

使用特权

评论回复
16
(⊙o⊙)你| | 2014-6-2 11:41 | 只看该作者
(⊙o⊙)你 发表于 2014-6-2 10:51

1、此方法计算原理还没有弄明白。
2、按照他的算法,实际测试后,查看
   map文件,地址分配的不对。
例如:正确的地址是
0x68000000~0x680FFFFF

----------------------------------'-' 方法扩展SRAM------------------------------
define region RAM_region   
= mem:[from 0x20000000   to 0x680FFFFE]
-mem:[from 0x2000FFFF   to 0x67FFFFFF];

对应的map文件:
"P3":  place in [from 0x20000000 to 0x2000fffe] |
                [from 0x68000000 to 0x680ffffe] { rw, block CSTACK, block HEAP };
               
               
define region RAM_region   
= mem:[from 0x20000000   to 0x680FFFFF]
-mem:[from 0x2000FFFF   to 0x67FFFFFF];;
对应的map文件:
"P3":  place in [from 0x20000000 to 0x2000fffe] |
                [from 0x68000000 to 0x680fffff] { rw, block CSTACK, block HEAP };

define region RAM_region   
= mem:[from 0x20000000   to 0x680FFFFF]
-mem:[from 0x2000FFFF   to 0x68000000];

对应的map文件:
"P3":  place in [from 0x20000000 to 0x2000fffe] |
                [from 0x68000001 to 0x680fffff] { rw, block CSTACK, block HEAP };

--------------改成这样才可以-------------               
define region RAM_region   
= mem:[from 0x20000000   to 0x680FFFFF]
-mem:[from 0x20010000   to 0x67FFFFFF];

对应的map文件:            
"P3":  place in [from 0x20000000 to 0x2000ffff] |
                [from 0x68000000 to 0x680fffff] { rw, block CSTACK, block HEAP };
               
               
-----------------------------------'|' 方法扩展SRAM-------------------------------
define region RAM_region   
= mem:[from 0x20000000   to 0x2000FFFF]
| mem:[from 0x68000000   size 0x100000];

对应的map文件:
"P3":  place in [from 0x20000000 to 0x2000ffff] |
                [from 0x68000000 to 0x680fffff] { rw, block CSTACK, block HEAP };

使用特权

评论回复
17
rainmans| | 2014-8-6 22:50 | 只看该作者
MARK

使用特权

评论回复
18
icecut| | 2014-8-6 23:21 | 只看该作者

使用特权

评论回复
19
zhangcy0217| | 2016-3-21 17:25 | 只看该作者
楼主,这个问题解决了没?我也碰到相同问题,我用的是MDK.

使用特权

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

本版积分规则

3

主题

19

帖子

1

粉丝