硬汉嵌入式论坛

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

[emWin] Button刷新不同的位图长时间以后内存耗尽屏幕闪烁

[复制链接]

11

主题

26

回帖

59

积分

初级会员

积分
59
发表于 2025-9-18 14:22:17 | 显示全部楼层 |阅读模式
本帖最后由 y309976659 于 2025-9-18 14:24 编辑

我在主界面有7个按钮,会根据需要每150ms刷新一次button要显示的位图(BUTTON_SetBitmap),显示一个上下跳动的效果,但18-20个小时之后,整个界面就开始闪烁,用GUI_ALLOC_GetNumFreeBytes检查发现内存几乎耗尽,请问有朋友遇到过这个情况吗,为什么BUTTON_SetBitmap会不停的消耗内存呢?有什么好的办法应对这种状况吗?
微信图片_20250918142339_18_19.jpg
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 2025-9-18 15:39:41 | 显示全部楼层
方便的话,分享emWin的配置代码看下。

另外你的emWin用的窗口存储设备模式还是三缓冲来防止闪烁的
回复

使用道具 举报

11

主题

26

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2025-9-18 15:54:38 | 显示全部楼层
eric2013 发表于 2025-9-18 15:39
方便的话,分享emWin的配置代码看下。

另外你的emWin用的窗口存储设备模式还是三缓冲来防止闪烁的


WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
GUI_Init();
这样用的应该是存储设备吧?


Config.rar

19.31 KB, 下载次数: 1

emWin配置代码

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 2025-9-18 15:58:04 | 显示全部楼层
y309976659 发表于 2025-9-18 15:54
WM_SetCreateFlags(WM_CF_MEMDEV);//开启STemWin存储设备
GUI_Init();
这样用的应该是存储设备吧?

然后你的应用代码我看下
回复

使用道具 举报

11

主题

26

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2025-9-18 16:21:55 | 显示全部楼层
eric2013 发表于 2025-9-18 15:58
然后你的应用代码我看下

static void Draw_Picture(WM_MESSAGE * pMsg,u8 old,u8 now)
{
    WM_HWIN hItem;
    u8 index = 0;
    u8 i = 0,j=0;

    GUI_RECT t;
    if(old > 7)
    {
        old = 7;
    }
    if(now > 7)
    {
        now = 7;
    }
    if(now == 0 && old == 0)
    {
        return;
    }

    if(now >= old)
    {
        u8 quality = Spo2_Para.signal_quality;
        index = now;
        for(i=0;i<index;i++)
        {

            hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE1+i);
            if(quality > 60)
            {         
                        BUTTON_SetBitmap(hItem,0,&bmvalue_green);
            }
            else if(quality >= 31&&quality<=60)
            {
                        BUTTON_SetBitmap(hItem,0,&bmvalue_yellow);
            }
            else
            {

                        BUTTON_SetBitmap(hItem,0,&bmvalue_red);
            }


        }
        for(j=i;j<7;j++)
        {
          hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE1+j);
          BUTTON_SetBitmap(hItem,0,&bmvalue_black);
        }
        t.x0=430;
        t.y0=95;
        t.x1=507;
        t.y1=323;
        WM_InvalidateArea(&t);

    }
    else
    {
        index = 7 - now;
        for(i=0;i<index;i++)
        {
            hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE1+7-i);
            BUTTON_SetBitmap(hItem,0,&bmvalue_black);


        }

    }

}


void Clear_Value(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE1);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE2);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE3);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE4);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE5);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE6);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_VALUE7);
    BUTTON_SetBitmap(hItem,0,&bmvalue_black);
}


void Value_Refrash(WM_MESSAGE * pMsg)
{
    //WM_HWIN hItem;
    u8 now = 0;
    u16 now_picture = 0;
    static u8 clear_flag = 0;
    static u16 old_picture;
    static u8 speak_flag = 0;
    static u8 min_record = 0;
    if(display_ok == 1)
    {
        clear_flag = 0;

        /***********************************************************************/
        // now_picture = Value_now/30;
        // Draw_Picture(pMsg,old_picture,now_picture);
        /***********************************************************************/
        
        if(Spo2_Para.Pi <= 10)
        {
            now_picture = Value_now/50;

            if(now_picture > 3)
            {
                now_picture = 3;
            }

        }
        else
        {
            now_picture = Value_now/30;
        }
        Draw_Picture(pMsg,old_picture,now_picture);
        /***********************************************************************/

        now = Value_now/30;



        
        if(now < old_picture)
        {
            speak_flag++;
            min_record = now;
        }
        else
        {
            if(now >= 4 && min_record <= 2)
            {   
                min_record = 0;
                if(speak_flag >= 1)
                {
                    if(Spo2_Para.spo2_status == Normal || Spo2_Para.spo2_status == Searching_for_pulse)
                    {
                        Sys_Status.speak_on = 2;
                    }
                }
                speak_flag = 0;
            }  
        }

        old_picture = Value_now/30;
        if(old_picture >= 8)
        {
            old_picture = 0;
        }
    }
    else
    {
        if(clear_flag == 0)
        {
            Clear_Value(pMsg);
        }  
        clear_flag = 1;
    }
}

主要是Value_Refrash函数,放在WM_TIMER里面150ms调用一次
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 2025-9-18 17:16:03 | 显示全部楼层
y309976659 发表于 2025-9-18 16:21
static void Draw_Picture(WM_MESSAGE * pMsg,u8 old,u8 now)
{
    WM_HWIN hItem;

动态内存不足,应该不是这部分代码导致的,你贴出来的,从代码来看只有或者句柄和设置位图
回复

使用道具 举报

11

主题

26

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2025-9-18 18:47:39 | 显示全部楼层
但是我实时打印剩余内存GUI_ALLOC_GetNumFreeBytes,一旦程序注释掉Value_Refrash函数,内存就不再减少,否则内存就持续减少。
你的意思是,BUTTON_SetBitmap函数切换显示不同的图片,并不会导致内存被消耗吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 7 天前 | 显示全部楼层
y309976659 发表于 2025-9-18 18:47
但是我实时打印剩余内存GUI_ALLOC_GetNumFreeBytes,一旦程序注释掉Value_Refrash函数,内存就不再减少,否 ...

这个函数不会的。
回复

使用道具 举报

11

主题

26

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 7 天前 | 显示全部楼层
BUTTON_SetBitmap确实不会导致内存减少。
原因已经找到了,BUTTON_SetBitmap操作了一个不是按键的句柄,导致内存一直泄漏。
感谢大佬支持。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 6 天前 | 显示全部楼层
y309976659 发表于 2025-9-19 09:14
BUTTON_SetBitmap确实不会导致内存减少。
原因已经找到了,BUTTON_SetBitmap操作了一个不是按键的句柄,导 ...

谢谢告知最终原因
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 15:11 , Processed in 0.055627 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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