OpenEdv-开源电子网

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

emwin多缓冲内存是在那里分配的,急急急??????

[复制链接]

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-12-31
在线时间
32 小时
发表于 2017-3-20 15:48:00 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 浪人望断了天涯 于 2017-3-20 15:50 编辑

官网例程中使用3缓冲,
#define XSIZE_PHYS 640
#define YSIZE_PHYS 480

#define NUM_BUFFERS  3 // Number of multiple buffers to be used
#define NUM_VSCREENS 1 // Number of virtual screens to be used

#define LCD_LAYER0_FRAME_BUFFER  ((uint32_t)0xC0200000)
#define LCD_LAYER1_FRAME_BUFFER  ((uint32_t)0xC0400000)
我不知道这些空间是怎么分配的,分配在SDRAM哪个位置?
STemwin 到底占用多大的SDRAM空间?

网上对多缓冲器是这样介绍的《由于多缓冲方法使用多个帧缓冲器,因此,即便绘图操作仍在进行中,屏幕画面也是完全渲染的结果。启动绘图过程时,前置缓冲器的当前内容会被复制到一个后置缓冲器中。在该操作完成后,所有绘图操作只对该后置缓冲器起作用。绘图操作完成后,后置缓冲器成为前置缓冲器。如果要使后置缓冲器成为可见的前置缓冲器,通常只需修改显示控制器的帧缓冲器起始地址寄存器即可。http://www.eefocus.com/lion187/blog/14-04/302718_37e68.html
而在另一个例程中看到以下

/*5. 设置图层 1 和图层 2 对应的显存地址
(1) EXT_SDRAM_ADDR 是 SDRAM 的首地址。
(2) LCD_LAYER0_FRAME_BUFFER 是图层 1 的显存地址。
(3) LCD_LAYER1_FRAME_BUFFER 是图层 2 的显存地址。
(4) 每个图层的显存大小比较考究,这里进行下简单的说明。
如果用户选择的颜色模式 = 32 位色 ARGB8888,显存的大小:
XSIZE_PHYS * YSIZE_PHYS * 4 * NUM_VSCREENS * NUM_BUFFERS
颜色模式 = 24 位色 RGB888,显存的大小:
XSIZE_PHYS * YSIZE_PHYS * 3 * NUM_VSCREENS * NUM_BUFFERS
颜色模式 = 16 位色 RGB566, ARGB1555, ARGB4444, AL88,那么显存的大小就是:
XSIZE_PHYS * YSIZE_PHYS * 2 * NUM_VSCREENS * NUM_BUFFERS
颜色模式 = 8 位色 L8, AL44,那么显存的大小就是:
XSIZE_PHYS * YSIZE_PHYS * 1 * NUM_VSCREENS * NUM_BUFFERS
这里为了方便起见,将开发板配套的 16MB 的 SDRAM 前 8MB 分配给 LCD 显存使用,后 8MB 用于 emWin 动态内存。
对于 24 位色, 16 位色, 8 位色,用户可以对其使能三缓冲,并且使能双图层。但是 32 位色也使能三缓冲和双
图层的话会超出 8MB,所以用户根据自己的情况做显存和 emWin 动态内存的分配调整。
举一个例子,对于 800*480 分辨率的显示屏,使能 32 位色,三缓冲,那么最终一个图层需要的大小就是
800 * 480 * 4 * 3 = 4.394MB 的空间,如果是双图层,已经超出 8MB 的分配范围。
(5)为了方便起见, 图层 2 的宏定义 LCD_LAYER1_FRAME_BUFFER 中的参数 4 是按照 32 位色设置的, 如果用户的图层 1
使用的是 8 位色,这里填数字 1,如果是 16 位色,这里填 2, 如果是 24 位色,这里填 3。
*/  》


所以我搞不懂定义了三个缓冲器,那么这3个缓冲器占用的内存肯定是3*XSIZE_PHYS *XSIZE_PHYS *每个像素点的字节数,但是我没有在官网例程中找它定义的位置疑惑。。。。。。。?????、???????


最佳答案

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

// GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y); GUI_TOUCH_Calibrate(GUI_COORD_X,0,479,0,479); GUI_TOUCH_Calibrate(GUI_COORD_Y,0,271,0,271); /*Initialize GUI Layer structure */ layer_prop[0].address = LCD_LAYER0_FRAME_BUFFER; #if (GUI_NUM_LAYERS > 1) layer_prop[1].address = LCD_LAYER1_FRAME_BUFFER; #endif 代码很明显是 LCD_LAYER1_FRAME_BUFFER是第2个层用的, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-12-31
在线时间
32 小时
 楼主| 发表于 2017-3-20 15:48:01 | 显示全部楼层
本帖最后由 浪人望断了天涯 于 2017-3-22 08:13 编辑
charlefu 发表于 2017-3-21 17:34
3个缓冲,有一个是ewwin本身默认分配的,然后再添加加两个图层。LAYER1的内存首地址是0xC0200000, LAYER ...

//        GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);
  GUI_TOUCH_Calibrate(GUI_COORD_X,0,479,0,479);
  GUI_TOUCH_Calibrate(GUI_COORD_Y,0,271,0,271);
        /*Initialize GUI Layer structure */
  layer_prop[0].address = LCD_LAYER0_FRAME_BUFFER;
#if (GUI_NUM_LAYERS > 1)
  layer_prop[1].address = LCD_LAYER1_FRAME_BUFFER;     
#endif

代码很明显是 LCD_LAYER1_FRAME_BUFFER是第2个层用的,你的回答很难让人信服啊
  /* At first initialize use of multiple buffers on demand */
#if (NUM_BUFFERS > 1)
  for (i = 0; i < GUI_NUM_LAYERS; i++)
  {
    GUI_MULTIBUF_ConfigEx(i, NUM_BUFFERS);
  }
#endif
  代码也很明显如果定义了两层就要6个缓冲区,定义了一层要3个缓冲区而明显是 LCD_LAYER1_FRAME_BUFFER是第2个层用的


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-3-21 00:38:55 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-12-31
在线时间
32 小时
 楼主| 发表于 2017-3-21 10:57:43 | 显示全部楼层

你要不帮我解释下,我看不动啊,到底是在那个位置设置的
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-21 14:05:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-12-31
在线时间
32 小时
 楼主| 发表于 2017-3-21 17:05:31 | 显示全部楼层
charlefu 发表于 2017-3-21 14:05
#define LCD_LAYER0_FRAME_BUFFER  ((uint32_t)0xC0200000)
#define LCD_LAYER1_FRAME_BUFFER  ((uint32_t ...

你的意思是三个缓冲器是在这个位置定义的??但是这个定义的内存大小明显是小于三个缓冲器加起来的大小啊?求解释
回复

使用道具 举报

10

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-12-31
在线时间
32 小时
 楼主| 发表于 2017-3-21 17:05:44 | 显示全部楼层
charlefu 发表于 2017-3-21 14:05
#define LCD_LAYER0_FRAME_BUFFER  ((uint32_t)0xC0200000)
#define LCD_LAYER1_FRAME_BUFFER  ((uint32_t ...

你的意思是三个缓冲器是在这个位置定义的??但是这个定义的内存大小明显是小于三个缓冲器加起来的大小啊?求解释
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-21 17:34:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-3-22 11:17:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 02:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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