野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17534|回复: 9

求助:请教一个使用SDRAM的问题

[复制链接]
发表于 2019-3-6 14:56:25 | 显示全部楼层 |阅读模式
5火花
求大侠指点:
使用挑战者核心板做实验,
需求:因为工程编译出来的文件过大,bin文件超过1M,所以需要将部分变量放到SDRAM里面。


参考《零死角玩转STM32—F429.pdf》 文档里45.4.5 章节修改,使用了一个FREERTOS的msgq例子工程做修改。
主要就修改了3部分:
1). startup_stm32f429_439xx.s文件中 函数 Reset_handler
2). 工程里修改分散加载文件,新添加RW_ERAM1
3). 从别的挑战者工程里,拷贝bsp_sdram.c,因为里面有函数 SDRAM_Init的实现。


工程附件: http://www.firebbs.cn/forum.php? ... request=yes&_f=.rar
1). 默认配置,选择Fire_FreeRTOS,重新编译,任务能正常启动,就能正常运行。
2). 选择Fire_FreeRTOS_SDRAM,重新编译,main函数启动成功,但是freertos系统里的,创建任务函数xTaskCreate均失败。
运行结果,参考修改前后的结果对比图片


对比.jpg
2.jpg
1.jpg

stm429_msgq-exram.rar

932.01 KB, 下载次数: 14

回复

使用道具 举报

发表于 2019-3-7 09:01:35 | 显示全部楼层
1M是flash的限制,你放到sdram也没用啊,看看工程是不是有很大的常量数组,把它从外部SPI flash加载,优化一两个就够了
回复

使用道具 举报

 楼主| 发表于 2019-3-7 09:36:55 | 显示全部楼层
flyleaf 发表于 2019-3-7 09:01
1M是flash的限制,你放到sdram也没用啊,看看工程是不是有很大的常量数组,把它从外部SPI flash加载,优化 ...

非常感谢管理员的及时回复哈。

是这样的,目前我们最终编译出来的bin会比较大,超过1M了。
现在想做的,就是按照你的思路,把部分东西挪出去,看到文档上有例子,可以移到SDRAM上。
就按照guide里的例子试一下
  修改sct文件里内容。
  RW_ERAM1 0xD0000000 0x00800000 {
    .ANY (+RW +ZI)
  }

而且附件中我做实验的例子,是下载资料里的一个freertos例子,才几十K。
就是想验证一下看能不能跑起来。结果就出现了上面的问题。
回复

使用道具 举报

发表于 2019-3-7 10:12:15 | 显示全部楼层
shengyp0929 发表于 2019-3-7 09:36
非常感谢管理员的及时回复哈。

是这样的,目前我们最终编译出来的bin会比较大,超过1M了。

bin比较大跟RW和ZI是没关系的,主要优化的还是code和rodata段的内容
回复

使用道具 举报

 楼主| 发表于 2019-3-7 15:04:44 | 显示全部楼层
flyleaf 发表于 2019-3-7 10:12
bin比较大跟RW和ZI是没关系的,主要优化的还是code和rodata段的内容

恩,谢谢您的建议,下一步我们会专注于code和rodata段的优化,
对了,就是我说的,附件中这个例子的问题,目前跟bin的大小还没有关系,才几十k。

不知道您之前有没有遇到过我现在的问题吗?
我是按照《零死角玩转STM32—F429.pdf》 文档里45.4.5 章节修改实验的。

如果是我工程问题还好,我自己学习了,经验贴出来,可以供新用户使用。
万一是文档描述问题,也好及时更正文档。防止继续给大家造成误解。
回复

使用道具 举报

发表于 2019-3-7 15:42:01 | 显示全部楼层
shengyp0929 发表于 2019-3-7 15:04
恩,谢谢您的建议,下一步我们会专注于code和rodata段的优化,
对了,就是我说的,附件中这个例子的问题 ...

我们的文档没有这样用啊,sdram初始化我们是放在main文件里的,而且文档也说明了这种方式可以使用ZI data在sdram,RW型data在sdram的初始值会有问题,除非用我上面说的方式,使用寄存器方式初始化sdram,并像你这里放到__main之前运行
回复

使用道具 举报

 楼主| 发表于 2019-3-7 17:37:54 | 显示全部楼层
flyleaf 发表于 2019-3-7 15:42
我们的文档没有这样用啊,sdram初始化我们是放在main文件里的,而且文档也说明了这种方式可以使用ZI data ...

哦。谢谢flyleaf耐心及时的指导!!!
大概明白你的意思了。如果只把ZI data放到SDRAM里面,就是不需要非得限制寄存器方式初始化SDRAM了。
例子中sct文件修改成下面这样,就可以了吧:

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
  *.o(STACK)
  stm32f4xx_rcc.o(+RW)
   .ANY (+RW)
  }  
  RW_ERAM1 0xD0000000 0x00800000 {
    .ANY (+ZI)
  }
}


回复

使用道具 举报

发表于 2019-3-7 17:49:57 | 显示全部楼层
shengyp0929 发表于 2019-3-7 17:37
哦。谢谢flyleaf耐心及时的指导!!!
大概明白你的意思了。如果只把ZI data放到SDRAM里面, ...

不是啊,这样做sdram init还是要放在main之后,不能放在启动文件的__main之前
回复

使用道具 举报

 楼主| 发表于 2019-3-7 18:13:14 | 显示全部楼层
本帖最后由 shengyp0929 于 2019-3-8 15:13 编辑
flyleaf 发表于 2019-3-7 17:49
不是啊,这样做sdram init还是要放在main之后,不能放在启动文件的__main之前

恩恩,我再试试。第一次碰挑战者的核心板,谢谢耐心指导,请多担待。

总结一下,就是要修改两处。
1).想把SDRAM_Init放在__main之后,就是要修改startup_stm32f429_439xx.s文件中 函数 Reset_handler=======================================
; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
        IMPORT SDRAM_Init

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 LDR     R0, =SDRAM_Init
                 BLX     R0   
              
                 ENDP

=======================================

2) 然后再在sct文件里面指定,把ZI data放到 SDRAM里面。
LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
  *.o(STACK)
  stm32f4xx_rcc.o(+RW)
   .ANY (+RW)
  }
  RW_ERAM1 0xD0000000 0x00800000 {
   .ANY (+ZI)
  }
}


我的理解没错吧。


回复

使用道具 举报

 楼主| 发表于 2019-3-11 12:21:00 | 显示全部楼层
@flyleaf  管理员大侠,
请问一下您的回复里,sdram初始化放在main文件里的,然后使用ZI data在sdram这种方式,

是不是在main()函数里直接调用SDRAM的初始化函数SDRAM_Init(),(在文件bsp_sdram.c里定义的);
int main(void)
{
...
SDRAM_inti();
...
}

然后怎么指定ZI data在sdram里面。是通过sct文件里的定义吗,还是其他的方式?
  RW_ERAM1 0xD0000000 0x00800000 {
   .ANY (+ZI)
  }

不知道有没有理解错您的意思。
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-1 13:24 , Processed in 0.043684 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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