OpenEdv-开源电子网

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

stm32 怎么实现外部ram加载 内部ram堆栈

[复制链接]

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
发表于 2013-8-8 18:05:44 | 显示全部楼层 |阅读模式
     由于我的内部ram不够用,所以想使用外部ram做rw+zi,内部ram做堆栈,所以我在汇编里面初始化了外部ram,mdk设置为(ram1:ox68080000  80000;iram1:0x20000000  0x10000)然后编译也能通过,但是程序运行的时候,我的ucos只有一个优先级最高的任务执行,其他任务不运行,然后我调试,发现延时函数初始化中,fac_US=sysclk/8;执行后发现fac_us=0;这个和正常的结果不一致,sysclk的地址是0x044aa200,按照道理,sysclk的地址应该是使用堆栈区的吧(我的堆栈定义在内部ram,即0x20000000~0x20001000),这个真是把我搞晕了!!好痛苦
    请问有没有大哥使用过外部ram做rw+zi区,内部ram做堆栈,求帮助,感激不尽
    此外,我想用分散加载文件实现,可是针对原子的开发列程,汇编部分应该怎么改??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 18:17:41 | 显示全部楼层
这个不知道哦...帮顶下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-8-8 23:20:29 | 显示全部楼层
分散加载就可以了.在进入__main前先初始化FSMC,都是标准工作.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-8 23:48:56 | 显示全部楼层
回复【3楼】shihantu:
---------------------------------
分散加载试过了,在进main之前 我已经初始化了fsmc,然后程序编译没问题,问题是我的ucos2只有一个优先级最高的任务在运行,原因是delay函数没有调用ucos的延时,我怀疑是堆栈空间不够,可是我在启动文件里面已经扩大了堆栈,可是还是没有用,我在分散加载文件里面设置启动文件放置在内部ram,也就是堆栈里面,真的不知是为什么,求指导,请问有没有相关的设置文件,能不能共享一下,多谢
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-8-9 00:38:05 | 显示全部楼层
没有调用系统延时估计和你的os有关,和FSMC无关.

启动文件扩大栈只会扩大非系统的栈,对任务栈没有影响.

启动文件加载到RAM能用么??

还有,mdk的话,栈管理是有bug的,不知道其他编译器有没有对应的问题.本身也不是编译器的问题,只是编译器可以做好而已.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-9 13:19:05 | 显示全部楼层
回复【5楼】shihantu:
---------------------------------
首先 谢谢你的回答,我今天查看了一下函数里面的参数地址,按照道理,参数地址以及函数里面局部变量的地址,应该在我定义的堆栈里面,即0x20000000~0x20001000),可是查看后发现,参数地址跑到了0x027637fe,而局部变量在堆栈里面,0x027637fe应该在stm32的未定义的code区,因为stm32使用的code区是0x08000000开始的啊,这个我真的不明白
    此外,我的全局变量都是定义在外部ram里面的,当我在函数中对全局变量赋值的时候,全局变量的值居然不可控,就是没法赋值,这是为什么啊,百思不得其解,求指导啊,谢谢
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-9 14:00:16 | 显示全部楼层
你是怎么给任务分配栈空间的?干脆不要定义内部RAM空间,这样所有的变量就保存到外部RAM了。这一部分你得先确保外部RAM的硬件地址和你工程设置的一致,并保证FSMC初始化在RW和ZI数据的初始化之前。

然后写个内部RAM的分配函数,给os动态分配栈空间。 数据范围就是就是系统栈的末尾至内部RAM的末尾,或许还得留出一定的空间用于内存控制块。
业余程序玩家。
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2013-8-9 19:18:06 | 显示全部楼层
实参根据调用函数的分配,可能在栈,可能在全局内存区.形参在栈.确认地址没有错吗?
外部内存区无法赋值,要检查是否初始化正确并且读写正常.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-16 17:39:18 | 显示全部楼层
回复【8楼】shihantu:
---------------------------------
你好,实参不也是在外层函数里面吗,那么它不就是应该在堆栈里面吗,而形参是实参的拷贝,其地址应该存在被调函数的堆栈里面吧,实参怎么会在全局变量区域呢,变量是否初始化跟后面的赋值有关系吗,求解释!
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-16 17:50:18 | 显示全部楼层
回复【7楼】ofourme:
---------------------------------
你好,一直在解决这个问题中,现在只是暂时解决了,可是根本解决方案还没找到,就是我测试了原子哥的开发战舰列程,从map文件中发现他通过_at_方式定义在外部ram中的数组的运行域还是在内部ram中,还是占用内部ram空间,所以,我通过分散加载文件把数组所在的.o文件分配在外部ram加载域,这样数据就不会占用内部ram运行域了,可是这样那个数组占用了两份外部ram,即加载和运行空间,这样可以节约内部ram了,可以使用!
    问题:1、为什么at方式申请的空间需要load加载域?程序和数据的加载域不是在flash里面吗
          2、之前把全局变量定义在外部ram,为什么不能赋值?
求高手指点!
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-16 19:27:27 | 显示全部楼层
我也认为加载域应该是在ROM中。能否把Scatter文件和MAP文件传上来看看。
业余程序玩家。
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-17 14:53:18 | 显示全部楼层
下面是我的sct和map文件,这是我修改通过的版本,有一个缓存数组是定义在sramlcd里面的,然后我通过分散文件把改数组运行域定义在外部ram里面,但是还需要attr方式把他定义在外部ram地址,那个区域在map中是load加载域,这样,这个数组即占用了外部ram两个区域了。请高手指点迷津

MAIN.map

1.66 MB, 下载次数: 674

MAIN.sct

544 Bytes, 下载次数: 559

回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-17 14:53:44 | 显示全部楼层
回复【11楼】ofourme:
---------------------------------
已经上传 请查看
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-19 23:12:17 | 显示全部楼层
大神在哪里 ,求指导啊!
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-8-19 23:23:46 | 显示全部楼层
从启动代码的角度,你应该将FSMC初始化置于RW和ZI段初始化之前。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
 楼主| 发表于 2013-8-20 09:08:42 | 显示全部楼层
回复【15楼】styleno1:
-------------------------------
是的  启动代码在进入_main函数之前就fsmc初始化了,在reset_handler 里面。
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2012-5-31
在线时间
71 小时
发表于 2013-11-27 12:54:52 | 显示全部楼层
回复【楼主位】summer:
---------------------------------
请问你的问题解决了吗,我现在遇到的问题是外扩了SRAM后,程序在中断里死循环
回复 支持 反对

使用道具 举报

15

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2013-11-11
在线时间
0 小时
发表于 2014-10-30 16:29:17 | 显示全部楼层
回复【16楼】summer:
---------------------------------
同样分散加载的问题,我的现状是,RW和ZI全部放到外部sram 硬件错误,我想把堆栈部分放到内部ram试试,可是不会写sct

我是这样做的:修改启动文件 定义使用外部sram  修改外部sram初始化函数  修改sct
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-1-19
在线时间
1 小时
发表于 2016-1-22 09:53:04 | 显示全部楼层
蘑菇 发表于 2014-10-30 16:29
回复【16楼】summer:
---------------------------------
同样分散加载的问题,我的现状是,RW和ZI全部放到 ...

能分享下你的程序吗,我是初学者,这个问题困扰我很多天了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 11:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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