硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4555|回复: 9
收起左侧

[emWin] WM_MULTIBUF_Enable(1)和WM_SetCreateFlags(WM_CF_MEMDEV)到底怎么用?

[复制链接]

16

主题

31

回帖

79

积分

初级会员

积分
79
发表于 2019-10-14 15:50:53 | 显示全部楼层 |阅读模式
本帖最后由 lyw851230 于 2019-10-14 15:52 编辑

在论坛里看到WM_MULTIBUF_Enable(1)和WM_SetCreateFlags(WM_CF_MEMDEV);二选一即可
所以在工程里试了一下,发现仅用WM_MULTIBUF_Enable(1)时出现了问题,于是我提出第一个问题:


什么原因导致了我的图像失真有毛刺?

我在这个页面中用了GUI_ALLOC_GetNumUsedBytes();将已使用的GUI内存显示出来,

仅用WM_MULTIBUF_Enable(1)时只有5K多

用WM_SetCreateFlags(WM_CF_MEMDEV);时内存为158.6K之多

我有了第二个问题:


这个内存是怎么计算的?是LCD_PIXEL_HEIGHT * LCD_PIXEL_WIDTH * LCD_BYTES_PER_PIXEL估算出来的么?

我的分辨率是320*240,每个像素2byte(用的图是png 16bit),这样估算约是153.6K

两幅图的内存之差约是153K

这是巧合还是内存就应该这么估算?

我看到硬汉的好多移植工程里都是只有WM_MULTIBUF_Enable(1)


第三个问题:


emwin自身需要的内存怎么计算?


前置缓冲+后置第一缓冲+后置第二缓冲?


当前页的值应该就是前置缓冲GUI_ALLOC_GetNumUsedBytes()显示出来的值,两个后置冲的值如何估算?


其也是背景图片的大小+所有控件大小之和么?




欢迎大家讨论指正




回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2019-10-14 16:02:31 | 显示全部楼层
图片咋没法出来呢?上了好几遍了
回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2019-10-14 16:33:59 | 显示全部楼层
附件没上传上去原来是名字太长了,这次行了,望坛友对照上面的帖子一起看
s2.png
s1.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2019-10-14 17:14:39 | 显示全部楼层
lyw851230 发表于 2019-10-14 16:33
附件没上传上去原来是名字太长了,这次行了,望坛友对照上面的帖子一起看

1   这两个是不同的实现机制,必须是二选一。如果你那里开多缓冲没有效果,说明你的程序有问题,多缓冲没有正确实现。
2   对于多缓冲方式,是在底层接口文件里面已经开了整个显示屏大小的双缓冲或者三缓冲
回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2019-10-14 17:34:57 | 显示全部楼层
eric2013 发表于 2019-10-14 17:14
1   这两个是不同的实现机制,必须是二选一。如果你那里开多缓冲没有效果,说明你的程序有问题,多缓冲没 ...

GUI_MULTIBUF_Config(GUI_BUFFERS);//设置3缓冲区

void APP_LCDIF_IRQHandler(void)
{
    uint32_t intStatus;

    intStatus = ELCDIF_GetInterruptStatus(LCDIF);//获得中断状态,响应中断

    ELCDIF_ClearInterruptStatus(LCDIF,intStatus);//清中断状态

    if (intStatus & kELCDIF_CurFrameDone)
    {
        if (s_LCDpendingBuffer >= 0)
        {
            /* Send a confirmation that the given buffer is visible */
            GUI_MULTIBUF_Confirm(s_LCDpendingBuffer);//应在挂起的前置缓冲器成为可见之后立即调用
            s_LCDpendingBuffer = -1;
        }
    }
    __DSB();
}


      case LCD_X_SHOWBUFFER:
        {
            pData = (LCD_X_SHOWBUFFER_INFO *)p;
            /* Calculate address of the given buffer */
            addr = VRAM_ADDR  + VRAM_SIZE * pData->Index;//此处的地址应该是显示的地址,显存
            /* Make the given buffer visible */
            ELCDIF_SetNextBufferAddr(LCDIF, addr);//将显存中的数据显示出来
            //
            // Remember buffer index to be used by ISR
            //
            s_LCDpendingBuffer = pData->Index;
            while (s_LCDpendingBuffer >= 0)
                ;
            return 0;
        }

除了这些语句外,还有哪些呢?请指导
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2019-10-15 00:13:33 | 显示全部楼层
lyw851230 发表于 2019-10-14 17:34
GUI_MULTIBUF_Config(GUI_BUFFERS);//设置3缓冲区

void APP_LCDIF_IRQHandler(void)

看来的确是你的程序有问题。
回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2019-10-15 05:46:51 | 显示全部楼层
eric2013 发表于 2019-10-15 00:13
看来的确是你的程序有问题。

老大,问题在哪,给指一下
回复

使用道具 举报

5

主题

244

回帖

259

积分

高级会员

积分
259
发表于 2019-10-17 14:13:28 | 显示全部楼层
emwin的内存大小就是GUIConf.c文件里分配的大小,用GUI_ALLOC_GetNumUsedBytes()获取到的就在这部分,多帧缓冲实际上是跟LCD显存放一起的,和emwin自用的内存是两个独立的区域。
回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
 楼主| 发表于 2019-10-17 18:16:14 | 显示全部楼层
DX3906 发表于 2019-10-17 14:13
emwin的内存大小就是GUIConf.c文件里分配的大小,用GUI_ALLOC_GetNumUsedBytes()获取到的就在这部分,多帧 ...

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2019-10-18 05:50:52 | 显示全部楼层
lyw851230 发表于 2019-10-15 05:46
老大,问题在哪,给指一下

在你的另一个帖子回复了:WM_MULTIBUF_Enable(1);三缓冲图像不清晰
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95320&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-18 18:28 , Processed in 0.288359 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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