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

如何把外部SRAM像内部RAM一样分配变量

[复制链接]
黑皮男 提问时间:2018-9-26 01:19 /
各位大神,外部SRAM怎样配置才能像内部SRAM一样分配变量,要编译器分配。我使用的是GCC,SRAM现在可以读写,但是就是不知道怎么修改链接脚本和启动文件。
收藏 评论14 发布时间:2018-9-26 01:19

举报

14个回答
shanji 回答时间:2018-9-26 09:12:14
看看能不能用

STM32外扩RAM做变量定义与内部RAM做堆栈的设置.pdf (95.81 KB, 下载次数: 296)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

黑皮男 回答时间:2018-9-26 13:15:00

非常感谢,目前是不知道gcc的配置该怎么弄
Dandjinh 回答时间:2018-9-26 13:17:45
找到工程中的.ld文件,添加类似下面的代码
  1. MEMORY
  2. {
  3. RAM (xrw)      : ORIGIN = 0x20010000, LENGTH = 240K
  4. DMARAM (rw)    : ORIGIN = 0x2004C000, LENGTH = 16K     
  5. FLASH (rx)     : ORIGIN = 0x8000000,  LENGTH = 1024K
  6. }

  7. SECTIONS
  8. {
  9.   /* DMA RAM SECTION */
  10.   .dmasec :
  11.   {
  12.     . = ALIGN(4);
  13.     *(.dmarss)
  14.     . = ALIGN(4);
  15.   } >DMARAM AT> FLASH
  16. }
复制代码


定义变量的时候加后缀 __attribute__((section(".dmarss"))),这样就可以把变量定义在指定内存地址里。
初始化要修改.s文件,比较麻烦,我都是自己写个Init函数解决的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

黑皮男 回答时间:2018-9-26 23:06:13
本帖最后由 黑皮男 于 2018-9-26 23:10 编辑
Dandjinh 发表于 2018-9-26 13:17
找到工程中的.ld文件,添加类似下面的代码

多谢指点,现在变量可以定位到SRAM,怎么想内部的RAM一样由编译器gcc来管理,应该怎么操作,请再指点一下
zjczm 回答时间:2018-9-27 12:21:00
学习一下。
00dd 回答时间:2018-9-29 14:09:51
解决没有?解决没有?解决没有?
黑皮男 回答时间:2018-9-29 17:14:12
00dd 发表于 2018-9-29 14:09
解决没有?解决没有?解决没有?

没有解决,等待大神来解答啊
Dandjinh 回答时间:2018-10-10 12:09:37
黑皮男 发表于 2018-9-26 23:06
多谢指点,现在变量可以定位到SRAM,怎么想内部的RAM一样由编译器gcc来管理,应该怎么操作,请再指点一下 ...

具体是什么意思?初始化问题?
黑皮男 回答时间:2018-10-11 13:16:24
Dandjinh 发表于 2018-10-10 12:09
具体是什么意思?初始化问题?

就是说再编译的阶段,编译器就自动把变量定义到外部ram,而无需在代码中指定
Dandjinh 回答时间:2018-10-12 13:29:35
黑皮男 发表于 2018-10-11 13:16
就是说再编译的阶段,编译器就自动把变量定义到外部ram,而无需在代码中指定 ...

1. 修改.ld文件
  1. MEMORY
  2. {
  3. RAM (xrw)    : ORIGIN = 0x20000000, LENGTH = 256K
  4. FLASH (xr)   : ORIGIN = 0x8000000,  LENGTH = 1024K
  5. SDRAM (rw)   : ORIGIN = 0xC0000000, LENGTH = 16M
  6. }

  7. SECTIONS
  8. {
  9.   .sdramsec :
  10.   {
  11.     . = ALIGN(4);
  12.         _start_sdram = .;
  13.         *(.sdramss)
  14.        
  15.         . = ALIGN(4);
  16.         _end_sdram = .;
  17.   } >SDRAM AT> FLASH
  18. }
复制代码
2. 在适当的地方调用以下函数
  1. extern uint32_t _start_sdram, _end_sdram;

  2. void InitExtraSections(void)
  3. {
  4.     uint32_t size = _end_sdram - _start_sdram;
  5.     memcpy((uint8_t *)_start_sdram, (uint8_t *)0xC0000000, size);
  6. }
复制代码



wujique 回答时间:2018-10-12 17:30:53
STM32 官方例子有,不过好像不是GCC的
黑皮男 回答时间:2018-10-13 13:38:00
Dandjinh 发表于 2018-10-12 13:29
1. 修改.ld文件
2. 在适当的地方调用以下函数

多谢指点,抽空试一下
rockzhouchina 回答时间:2018-10-16 15:03:31
多谢分享
林万山 回答时间:2021-2-20 11:39:14
Dandjinh 发表于 2018-10-12 13:29
1. 修改.ld文件
2. 在适当的地方调用以下函数

编译报region 'FLASH' overflowed by 122948 bytes

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版