野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12189|回复: 6

如何将SDRAM用做系统堆栈

[复制链接]
发表于 2017-8-2 16:02:52 | 显示全部楼层 |阅读模式
由于要做矢量字库,使得F429的内部空间不够用,所以希望使用板载的外部SDRAM作为系统堆栈。前期的工作如下所述。已经将8MB开始的1MB用做LCD的显存,代码如下:
  1. /*SDRAM起始地址;存储空间2的起始地址*/
  2. #define SDRAM_BANK_ADDR     ((uint32_t)0xD0000000)

  3. /* emWin动态内存首地址 */
  4. #define SDRAM_APP_BUF     (SDRAM_BANK_ADDR + 1 * 1024 * 1024)
复制代码
将8MB中间的6MB用作emwin的动态内存,代码如下:
  1. // Define the available number of bytes available for the GUI
  2. #define EX_SRAM   1/*1 used extern sram, 0 used internal sram */

  3. #if EX_SRAM
  4. #define GUI_NUMBYTES  (1024 * 1024 * 6)
  5. #else
复制代码
希望是将最后的1MB用做系统堆栈,在‘STM32F4xx_StdPeriph_Driver’中将以下代码1修改为代码2:
  1. //代码1
复制代码
  1. //代码2
复制代码
理论上讲应该是能实现的,但是只要修改了堆栈程序就进入harddefault,完全懵逼。
不知道有没有大侠知道这个要怎么解决呢?先谢过!






回复

使用道具 举报

 楼主| 发表于 2017-8-2 16:04:40 | 显示全部楼层
未知原因导致堆栈的代码1与代码2没添加成功,现写在此处。再次谢过!
代码1:
  1. Heap_Size       EQU     0x00010000

  2.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  3. __heap_base
  4. Heap_Mem        SPACE   Heap_Size
  5. __heap_limit
  6.                 PRESERVE8
  7.                 THUMB
复制代码

代码2:
  1. Heap_Size       EQU     0x00100000

  2.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  3. __heap_base   EQU                0xD0700000
  4. Heap_Mem        SPACE   Heap_Size
  5. __heap_limit    EQU                0xD07FFFFF
  6.                 PRESERVE8
  7.                 THUMB
复制代码
回复 支持 反对

使用道具 举报

发表于 2017-8-2 16:25:07 | 显示全部楼层
可以看看《零死角》的MDK文件详解章节啊,完全就是针对这个有讲解,通过修改sct文件实现
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-2 16:28:19 | 显示全部楼层
随风 发表于 2017-8-2 16:25
可以看看《零死角》的MDK文件详解章节啊,完全就是针对这个有讲解,通过修改sct文件实现


给力!简直是明灯!
回复 支持 反对

使用道具 举报

发表于 2017-8-8 18:17:40 来自手机 | 显示全部楼层
SDRAM系统内核无法访问,把地址映射到好像是BANK4就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-9 14:59:02 | 显示全部楼层
已经可以正常使用外部SDRAM作为堆区了,部分代码我贴在下方吧。以下是.s文件的部分程序:
  1. Stack_Size      EQU     0x00003000

  2.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  3. Stack_Mem       SPACE   Stack_Size
  4. __initial_sp


  5. ; <h> Heap Configuration
  6. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  7. ; </h>

  8. Heap_Size       EQU     0x00200000

  9.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  10. __heap_base                EQU                0xD0600000
  11. Heap_Mem        SPACE   Heap_Size
  12. __heap_limit        EQU                0xD07FFFFF

  13.                 PRESERVE8
  14.                 THUMB
复制代码
以下是SDRAM的.h文件部分程序:
  1. /*SDRAM起始地址;存储空间2的起始地址*/
  2. #define SDRAM_BANK_ADDR     ((uint32_t)0xD0000000)

  3. /*SDRAM大小,8M字节*/
  4. #define IS42S16400J_SIZE        8*1024*1024

  5. /* emWin动态内存首地址 */
  6. #define SDRAM_APP_BUF     (SDRAM_BANK_ADDR + 3 * 1024 * 1024)
复制代码
以下是GUIConfig.c的部分程序:

  1. #define EX_SRAM   1/*1 used extern sram, 0 used internal sram */

  2. #if EX_SRAM
  3. #define GUI_NUMBYTES  (1024 * 1024 * 3)
  4. #else
  5. #define GUI_NUMBYTES  (100 * 1024)
  6. #endif
复制代码
最终可以实现将sdram的一部分内存用做系统堆的,栈我还是用了mcu自带的内存。

回复 支持 反对

使用道具 举报

发表于 2020-10-22 14:16:32 | 显示全部楼层
笔记本的自嘲 发表于 2017-8-9 14:59
已经可以正常使用外部SDRAM作为堆区了,部分代码我贴在下方吧。以下是.s文件的部分程序:以下是SDRAM的.h文 ...

貌似感觉系统使用 sdram 作为系统堆栈,工作不怎么稳定,大神是如何做到稳定的啊 ?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 15:23 , Processed in 0.028525 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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