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

如何把外部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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版