打印

keil 下无法定义片外RAM

[复制链接]
1173|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
syney11|  楼主 | 2014-4-10 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位好, 我在keil下把off-chip的SDRAM地址定义了之后,程序就无法仿真了,总是提示could not stop cotex-m device。
如果在设置里不定义这个配置的话,我的全局变量就不会被编译器分配到片外地址,这样程序就无法编译了。 不知道大家遇到过这个情况没有。


相关帖子

沙发
jplzl| | 2014-4-10 23:57 | 只看该作者
片外SDRAM要用的话,首先要初始化哟。。。通常是用DEBUG选项里的那个.init选择初始化文件的
在编译的时候,只要地址范围什么的符合就行,不分内外的

使用特权

评论回复
板凳
lr2131| | 2014-4-11 09:19 | 只看该作者
在boot程序中初始化好SDRAM,但不要使用SDRAM,不要在编译和运行时用到SDRAM。
在APP的程序中配置off-chip的SDRAM地址,让静态变量、堆、栈可以分配到SDRAM中。

boot跳转到SDRAM后,由于已经初始化好了,所以APP可以把SDRAM当内部RAM一样来使用。

使用特权

评论回复
地板
syney11|  楼主 | 2014-4-11 10:44 | 只看该作者
我比较了一下两种方式的map文件,发现在配置了外部ram后, 会把堆栈自动分配到0xA000 0000的外部内存空间去。 但我初始化SDRAM的代码是在S文件里添加的。在进main之前,SDRAM已经初始化好了的。
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                                IMPORT  SystemInit
                IMPORT  EMC_init
                IMPORT  __main
                                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =EMC_init
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

使用特权

评论回复
5
jplzl| | 2014-4-11 11:10 | 只看该作者
syney11 发表于 2014-4-11 10:44
我比较了一下两种方式的map文件,发现在配置了外部ram后, 会把堆栈自动分配到0xA000 0000的外部内存空间去 ...

居然会把堆栈放在外部空间去?
这个是不是要结合具体的芯片来看呀,貌似一般情况不会这样吧。
除非是在初始化了SDRAM之后,再把堆栈设置为外部的地址
要不然的话,在SDRAM还不能工作之前,要用到堆栈的话应该怎么办呢

使用特权

评论回复
6
jplzl| | 2014-4-11 11:12 | 只看该作者
syney11 发表于 2014-4-11 10:44
我比较了一下两种方式的map文件,发现在配置了外部ram后, 会把堆栈自动分配到0xA000 0000的外部内存空间去 ...

估计要结合具体的芯片来看了,一般在SDRAM未初始化之前,是不会把堆栈设置在SDRAM中的
除非是初始化之后再将堆栈设置在外部空间中

使用特权

评论回复
7
syney11|  楼主 | 2014-4-11 11:19 | 只看该作者
jplzl 发表于 2014-4-11 11:12
估计要结合具体的芯片来看了,一般在SDRAM未初始化之前,是不会把堆栈设置在SDRAM中的
除非是初始化之后 ...

编译器就这么干了。。 很头疼啊。

使用特权

评论回复
8
jplzl| | 2014-4-14 18:05 | 只看该作者
syney11 发表于 2014-4-11 11:19
编译器就这么干了。。 很头疼啊。

是不是链接地址就是写的外部SDRAM的地址哦

使用特权

评论回复
9
syney11|  楼主 | 2014-4-15 09:42 | 只看该作者
jplzl 发表于 2014-4-14 18:05
是不是链接地址就是写的外部SDRAM的地址哦

是的。 4.22a版本可以调试。 高级版本就不能调试了。 程序直接跑飞了。

使用特权

评论回复
10
lr2131| | 2014-4-15 10:39 | 只看该作者
syney11 发表于 2014-4-11 11:19
编译器就这么干了。。 很头疼啊。

这不是编译器的错,你的设置或分散加载脚本给出的堆栈区域在那个位置,编译器当然会在吧堆栈放到那个地方,只要在用到那个外部区域之前,你已经初始化好了SDRAM,不就可以了吗?

使用特权

评论回复
11
jplzl| | 2014-4-15 15:46 | 只看该作者
syney11 发表于 2014-4-15 09:42
是的。 4.22a版本可以调试。 高级版本就不能调试了。 程序直接跑飞了。

这个的话,要分情况来看了
如果是在调试阶段的话,用INI脚本先初始化SDRAM,这个就没问题了
如果要烧录到FLASH当中的话,那在初始化SDRAM之前是不能操作SDRAM地址了

使用特权

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

本版积分规则

2

主题

14

帖子

0

粉丝