硬汉嵌入式论坛

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

[emWin实例] 定时器实时更新TXT越来越慢?

[复制链接]

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2017-7-3 16:12:36 | 显示全部楼层 |阅读模式
创建1个定时器用于新建子窗口的实时更新数据,但是大约30秒后,更新速度就会变慢,按键触摸反应也很慢,1~2秒更新一次数据,但是是定时器500mS更新1次数据,触摸点击反应迟钝。删除定时器后,按键反应是正常的。
这是哪里有问题呢?

void MainTask(void)
{
    /* 初始化 */
    GUI_Init();

    /*
     关于多缓冲和窗口内存设备的设置说明
       1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:
          WM_MULTIBUF_Enable(1);
       2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);
       3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用
          STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂
          感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。
       4. 所有emWin例子默认是开启三缓冲。
    */
    WM_MULTIBUF_Enable(1);                  /* 开启STemWin多缓冲,RGB屏可能会用到 */
    WM_SetCreateFlags(WM_CF_MEMDEV);        /* 启动所有窗口的存储设备 */
    GUI_SetBkColor(GUI_WHITE);                /* 设置当前背景色 */
    GUI_SetColor(GUI_BLACK);                /* 设置当前前景色 */
//    WM_SetDesktopColor(GUI_BLUE);           /* 调用此函数会自动的刷新桌面窗口 */     
    GUI_SetFont(&GUI_FontHZ24);                /* 设置当前字体 */
    GUI_Clear();                            /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */        

    GUI_DispStringAt("1. Please make sure the song.ttf is saved in NAND FLASH", 0, 0);
    GUI_DispStringAt("2. if the song.ttf is not saved in NAND FLASH, this lab will fail", 0, 24);

//    /* 等待3s后开始进行复制,方便客户看屏幕上的显示信息 */
//    for(i = 0; i < 3; i++){
//        sprintf(cDispBuf, "3. 3 seconds will start, %ds..  ", 3 - i);
//        GUI_DispStringAt(cDispBuf, 0, 48);
//        GUI_Delay(1000);
//    }
    GUI_DispStringAt("Loading song.ttf file from sdcard, please wait....", 0, 72);

    /*
       触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行
       此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。
    */
    //TOUCH_Calibration();

    /* 加载矢量字库到内部SDRAM中 */   
    GUI_UC_SetEncodeUTF8();                             /* 使能UTF-8编码 */         
    _LoadFontTTF("2:/SYSTEM/FONT/simhei.ttf");          /* 将字库从SD卡中加载到emWin动态内存,即SDRAM里面 */
       GUI_SetFont(&Font24);                                /* 设置当前矢量字体 */

      GUI_Clear();                                        /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */

    /* 加载桌面窗口的背景图片 */
    hMemBMP = BMPTask("2:/PICTURE/1.bmp", 0, 0);        /* 从NAND FLASH中加载图片 */           
//    GUI_MEMDEV_WriteOpaqueAt(hMemBMP, 0, 0);          /* 用到BMP图片的时候,调用此函数即可 */      
//    GUI_MEMDEV_Delete(hMemBMP);                       /* 释放存储设备使用的内存 */            

    /* 进入主界面 */
    hWinMain = _CreateFrame(&_WindowsMainDisplay);

    WM_CreateTimer(WM_GetClientWindow(hWinMain),        /* 接受信息的窗口的句柄 */
                     0,                                 /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                   500,                                 /* 周期,此周期过后指定窗口应收到消息*/
                     0);                                /* 留待将来使用,应为0 */   

    while(1){
        GUI_Delay(10);
    }
}


static WM_HWIN _CreateFrame(WM_CALLBACK* cb)
{   
    _hLastFrame = WM_CreateWindowAsChild(0, 0,800, 480, WM_HBKWIN, WM_CF_SHOW, cb, 0);

    return _hLastFrame;
}



static void _WindowsMainDisplay(WM_MESSAGE* pMsg)
{     
int id,notifyId;
char buf[12];

    WM_HWIN hWin = pMsg->hWin;

    switch (pMsg->MsgId){
        /* 窗口创建后立即发送,使窗口可以初始化并创建任何子窗口。 */
        case WM_CREATE:        
            /* 设置聚焦 */
            WM_SetFocus(hWin);

            /* 创建按钮 */
       _CreateButton(hWin, "重量1(吨)", ID_BUTTON_WEIGHT_1      , 10, 50,180, 40);
            _CreateButton(hWin, "重量2(吨)", ID_BUTTON_WEIGHT_2      ,210, 50,180, 40);


            _CreateText(hWin  , "0.0"   , ID_TEXT_WEIGHT_1        , 10, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
            _CreateText(hWin  , "0.0"   , ID_TEXT_WEIGHT_2        ,210, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
            break;        
        /* 窗口变为无效并应重绘时,发送到窗口。 */
        case WM_PAINT:
            GUI_Clear();                                    /* 清除活动窗口(如果背景是活动窗口,则清除整个显示。) */               
            /* 显示背景图片 */
            GUI_MEMDEV_WriteOpaqueAt(hMemBMP, 0, 0);        /* 用到BMP图片的时候,调用此函数即可 */

            /* 填充顶部和底部创建2条黑色背景状态栏 */
            GUI_SetColor(GUI_BLACK);                        /* 设置当前前景色 */
            GUI_FillRect(0,   0, 800, 40);
            GUI_FillRect(0, 440, 800,480);
            break;

        /* 告知父窗口,其子窗口中发生了某些改变。 */
        case WM_NOTIFY_PARENT:
            id    = WM_GetId(pMsg->hWinSrc);
            notifyId = pMsg->Data.v;
            switch(id){
                case ID_BUTTON_WEIGHT_1:                     
                    switch(notifyId){
                        case WM_NOTIFICATION_CLICKED:       /* 按钮被按下 */
                            break;
                        case WM_NOTIFICATION_RELEASED:      /* 按钮被按下并释放 */                        
                            break;   
                    }
                    break;
                case ID_BUTTON_WEIGHT_2:                  
                    switch(notifyId){
                        case WM_NOTIFICATION_CLICKED:       /* 按钮被按下 */
                            break;
                        case WM_NOTIFICATION_RELEASED:      /* 按钮被按下并释放 */
                            break;
                    }
                    break;                                                                        
            }
            break;   
        /* 刷新界面数据 */
        case WM_TIMER:
            if(WM_GetTimerId(pMsg->Data.v) == 0){
                              WeightCh1 ++;
                             sprintf(buf, "%.1f", (float)((float)WeightCh1 / 10));/* 字符缓冲区,浮点数保留1位小数,除10转成浮点数(1位小数) */               
                           _CreateText(hWin  , buf   , ID_TEXT_WEIGHT_1        , 10, 90,180, 60, &Font48, GUI_WHITE, GUI_BLACK);
                /* 重启定时器 */
                WM_RestartTimer(pMsg->Data.v, 500);
            }   
        break;
        default:
            WM_DefaultProc(pMsg);
    }
}


static WM_HWIN _CreateText(WM_HWIN hParent, const char* pText, int id, int x, int y, int w, int h,
                            GUI_FONT * font,int blackColor,int color)
{
WM_HWIN hText;

    hText = TEXT_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, id, pText);

    TEXT_SetFont        (hText, font);
    TEXT_SetBkColor     (hText, blackColor);
    TEXT_SetTextColor   (hText, color);
    TEXT_SetTextAlign   (hText, GUI_TA_HCENTER | GUI_TA_VCENTER); /* 居中、在Y轴方向对中 */   
    WIDGET_SetEffect    (hText, &WIDGET_Effect_3D2L);             /* &WIDGET_Effect_3D      将默认效果设置为“3D”。
                                                                     &WIDGET_Effect_None    将默认效果设置为“无”。
                                                                     &WIDGET_Effect_Simple  将默认效果设置为“简单”。    */   
    return hText;
}


static WM_HWIN _CreateButton(WM_HWIN hParent, const char* pText, int id, int x, int y, int w, int h)
{
WM_HWIN hButton;

    hButton = BUTTON_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, id);

    BUTTON_SetText      (hButton,    pText);
    BUTTON_SetFont      (hButton,    &Font24);
    BUTTON_SetBkColor   (hButton, 0, 0xB8B8B8);             /* 0:BUTTON_CI_DISABLED ,设置按钮禁用时要使用的颜色。  */
    BUTTON_SetBkColor   (hButton, 1, 0xE0E0E0);             /* 1:BUTTON_CI_PRESSED  ,设置按钮按下时要使用的颜色。  */
    BUTTON_SetBkColor   (hButton, 2, 0xC0C0C0);             /* 2:BUTTON_CI_UNPRESSED,设置按钮未按下时要使用的颜色。*/
    BUTTON_SetTextColor (hButton, 0, 0x000000);             /* 0:BUTTON_CI_DISABLED ,设置按钮禁用时要使用的颜色。  */
    BUTTON_SetTextColor (hButton, 1, 0x000000);             /* 1:BUTTON_CI_PRESSED  ,设置按钮按下时要使用的颜色。  */
    BUTTON_SetTextColor (hButton, 2, 0x000000);             /* 2:BUTTON_CI_UNPRESSED,设置按钮未按下时要使用的颜色。*/
    WIDGET_SetEffect    (hButton, &WIDGET_Effect_3D2L);     /* &WIDGET_Effect_3D      将默认效果设置为“3D”。
                                                               &WIDGET_Effect_None    将默认效果设置为“无”。
                                                               &WIDGET_Effect_Simple  将默认效果设置为“简单”。    */
    /* 设置接收输入焦点的能力 */
    BUTTON_SetFocussable(hButton,    1);

    return hButton;
}
回复

使用道具 举报

4

主题

23

回帖

35

积分

新手上路

积分
35
发表于 2017-7-3 19:22:54 | 显示全部楼层
你在WM_TIMER定时创建文本,内存消耗越来越大,直至内存溢出导致死机。不要在定时器里面创建文本,定时器里面只需要更新文本显示就行。
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
 楼主| 发表于 2017-7-4 08:15:51 | 显示全部楼层
原来如此,谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 01:02 , Processed in 0.159176 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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