OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12897|回复: 10

如何将变量定义到外部RAM

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-22
在线时间
3 小时
发表于 2015-12-26 10:28:07 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 chuangong 于 2015-12-26 10:33 编辑

如何将变量定义到外部RAM
正点原子探索者的STM32F407开发板,配置有1M的外部SRAM
本想基于例程的ucos+LWIP实验“网络实验8 NETCONN_TCP 客户端.rar”,加上老项目任务就OK,但多次编译编译失败;
查找问题:居然是ucos+LWIP例程中用来外部RAM和内存管理,使原本很充裕的192k的ram(老项目用一半不到),一下所

剩无几,稍加变量就编译出错。
做了个实验,定义一个全局变量test[6000]就能编译OK,test[7000]就出错.
由于旧工程都是采用这种定义方式,而且很多不同类型的变量,
该怎么实现将这些变量定义到外部ram里面,简化移植难度呢?谢谢各位!!
STM32 外部ramNG.JPG

编译通过

编译通过

最佳答案

查看完整内容[请看2#楼]

192K不是都能自动用的,正常只能用到128K,剩下64K需要指定地址。我记得指定地址好像是_atribute_类的字眼
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-26 10:28:08 | 显示全部楼层
192K不是都能自动用的,正常只能用到128K,剩下64K需要指定地址。我记得指定地址好像是_atribute_类的字眼
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-12-26 10:39:34 | 显示全部楼层
本帖最后由 xuande 于 2015-12-26 10:41 编辑

这似乎和开发平台有关。我只知道IAR平台的方法。
下面一串X表示地址,指向外部区域;a表示把该数组定位到X表示的地址。#pragma和location是关键字。

#pragma        location = 0xXXXXXXXX
u32                a[ 1000 ];

这些在平台的帮助手册可以查到。





回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-22
在线时间
3 小时
 楼主| 发表于 2015-12-26 11:07:50 | 显示全部楼层

你的意思:是手动分配地址,而不是编译器自动完成吗?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-12-26 11:26:08 | 显示全部楼层
chuangong 发表于 2015-12-26 11:07
你的意思:是手动分配地址,而不是编译器自动完成吗?


当然要手动,
你不是试过自动了吗?!


回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-22
在线时间
3 小时
 楼主| 发表于 2015-12-26 16:23:58 | 显示全部楼层
如果要手动指定,那么像这们多的变量我该怎么定义?
定义.JPG
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-12-26 20:02:27 | 显示全部楼层
chuangong 发表于 2015-12-26 16:23
如果要手动指定,那么像这们多的变量我该怎么定义?

是的,必须一个个指定。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-22
在线时间
3 小时
 楼主| 发表于 2015-12-26 22:31:55 | 显示全部楼层
正点原子 发表于 2015-12-26 20:02
是的,必须一个个指定。

如果真的是这样,对stm32有点无语,
之前做好的项目代码,全局变量上数千个,而且有些还很复杂的结构体等,如果每个变量都要手工指定,这样移植的风险,和工作量可想而知。
没有其他办法了吗??
回复

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2015-12-27 00:21:10 | 显示全部楼层
可以使用分散加载,把OS的堆栈放到CCM和其它大内存的数据放到CCM
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11541
金钱
11541
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-12-27 12:23:58 | 显示全部楼层
chuangong 发表于 2015-12-26 22:31
如果真的是这样,对stm32有点无语,
之前做好的项目代码,全局变量上数千个,而且有些还很复杂的结构体 ...


难道要把所有变量都移到外部ram吗?那就修改icf文件吧。
我只定位必要的变量,其他变量让编译器自己分配。

回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-22
在线时间
3 小时
 楼主| 发表于 2015-12-27 12:44:01 | 显示全部楼层
xuande 发表于 2015-12-27 12:23
难道要把所有变量都移到外部ram吗?那就修改icf文件吧。
我只定位必要的变量,其他变量让编译器自己分 ...

好的,谢谢!!
我明白你的意思了!!调些过大的变量,
这样用他们例程的内存管理函数也行了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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