OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4472|回复: 5

如何将SDRAM用做系统堆栈

[复制链接]

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2015-7-16
在线时间
51 小时
发表于 2017-8-2 16:22:31 | 显示全部楼层 |阅读模式
1金钱
由于要做矢量字库,使得F429的内部空间不够用,所以希望使用板载的外部SDRAM作为系统堆栈。前期的工作如下所述。已经将8MB开始的1MB用做LCD的显存,代码如下:

[mw_shl_code=applescript,true]/*SDRAM起始地址;存储空间2的起始地址*/
#define SDRAM_BANK_ADDR     ((uint32_t)0xD0000000)

/* emWin动态内存首地址 */
#define SDRAM_APP_BUF     (SDRAM_BANK_ADDR + 1 * 1024 * 1024)[/mw_shl_code]
将8MB中间的6MB用作emwin的动态内存,代码如下:
[mw_shl_code=applescript,true]#define EX_SRAM   1/*1 used extern sram, 0 used internal sram */

#if EX_SRAM
#define GUI_NUMBYTES  (1024 * 1024 * 6)
#else[/mw_shl_code]
希望是将最后的1MB用做系统堆栈,在‘STM32F4xx_StdPeriph_Driver’中将以下代码1修改为代码2:

[mw_shl_code=applescript,true]//代码1
Heap_Size       EQU     0x00010000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
                PRESERVE8
                THUMB

//代码2
Heap_Size       EQU     0x00100000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base                EQU                0xD0700000
Heap_Mem        SPACE   Heap_Size
__heap_limit        EQU                0xD07FFFFF
                PRESERVE8
                THUMB[/mw_shl_code]
理论上讲应该是能实现的,但是只要修改了堆栈,程序就进入harddefault,完全懵逼。
不知道有没有大侠知道这个要怎么解决呢?先谢过!

最佳答案

查看完整内容[请看2#楼]

已经做成功了。其实并不是将堆栈全用sdram提供,只是将堆使用sdram,栈还是使用的是mcu的内部空间。 我这边将代码跟现象提供下,结下贴。 [mw_shl_code=applescript,true]Stack_Size EQU 0x00002000 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; Heap Configuration ; Heap Size (in Bytes) ; Heap_Size EQU 0x0020 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2015-7-16
在线时间
51 小时
 楼主| 发表于 2017-8-2 16:22:32 | 显示全部楼层
已经做成功了。其实并不是将堆栈全用sdram提供,只是将堆使用sdram,栈还是使用的是mcu的内部空间。
我这边将代码跟现象提供下,结下贴。
[mw_shl_code=applescript,true]Stack_Size      EQU     0x00002000

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


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

Heap_Size       EQU     0x00200000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base                EQU                0xD0600000
Heap_Mem        SPACE   Heap_Size
__heap_limit        EQU                0xD07FFFFF

                PRESERVE8
                THUMB[/mw_shl_code]
以上是我的.s文件的堆栈设置。

[mw_shl_code=applescript,true]#if EX_SRAM
#define GUI_NUMBYTES  (1024 * 1024 * 3)
#else
#define GUI_NUMBYTES  (100 * 1024)
#endif[/mw_shl_code]
以上是我的emwin动态内存设置。
[mw_shl_code=applescript,true]/*SDRAM起始地址;存储空间2的起始地址*/
#define SDRAM_BANK_ADDR     ((uint32_t)0xD0000000)
/* emWin动态内存首地址 */
#define SDRAM_APP_BUF     (SDRAM_BANK_ADDR + 3 * 1024 * 1024)[/mw_shl_code]
以上是LCD的显存以及SDRAM的起始地址。
另外矢量字库的其实用的是仿宋,但是自己裁剪到2MB(还可以继续减小),这样在矢量字库加载到sdram的时候可以少占用空间。
最后是现象:

矢量小字库的仿宋显示

矢量小字库的仿宋显示


回复

使用道具 举报

43

主题

481

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1352
金钱
1352
注册时间
2014-12-24
在线时间
321 小时
发表于 2017-8-2 19:38:29 | 显示全部楼层
要改启动文件,还是有点麻烦。过大的栈,不是合理的设计。
回复

使用道具 举报

11

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
627
金钱
627
注册时间
2016-2-5
在线时间
100 小时
发表于 2017-8-4 22:35:09 来自手机 | 显示全部楼层
我觉得会很慢,很麻烦
回复

使用道具 举报

5

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2014-3-16
在线时间
111 小时
发表于 2017-8-5 08:06:20 | 显示全部楼层
刚启动时,SDRAM还未初始化好,你就用它,肯定会harddefault。把1M的空间给堆就可以了,栈还是用MCU内部的RAM吧,那样速度快的多。同时栈用1M,有必要吗?试想一下:一个函数调用,要压1M的数据;退出时,要弹出1M的数据,要花多少时间?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-8-7 01:40:20 | 显示全部楼层
很蛋疼的用法。不建议。吃力不讨好
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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