硬汉嵌入式论坛

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

[emWin] 按钮控件刷新慢

[复制链接]

31

主题

55

回帖

148

积分

初级会员

积分
148
发表于 2022-1-17 16:39:08 | 显示全部楼层 |阅读模式
描述在窗口上创建了两个button控件, 接收外部旋转编码器自定义消息
  1. #define GUI_USER_KEY_LEFT_ROTATE            (GUI_ID_USER + 0x02)
  2. #define GUI_USER_KEY_RIGHT_ROTATE          (GUI_ID_USER + 0x03)
复制代码


左右旋转编码器,发送消息,接收到消息后, 通过 BUTTON_SetPressed(hItem, 1) 使选中的button高亮。


现象:
button来回高亮,刷新的比较慢,大概高亮一次button就需要调用_DMA_Copy 几十次  但只有第一次调用 用时44ms
  1. static void _DMA_Copy(int LayerIndex, void * pSrc, void * pDst, int xSize, int ySize, int OffLineSrc, int OffLineDst)
  2. {
  3.         U32 PixelFormat;

  4.         /* Get the layer pixel format used */
  5.         PixelFormat    = _GetPixelformat(LayerIndex);

  6.         /* Setup DMA2D Configuration */  
  7.         DMA2D->CR      = 0x00000000UL | (1 << 9);
  8.         DMA2D->FGMAR   = (U32)pSrc;
  9.         DMA2D->OMAR    = (U32)pDst;
  10.         DMA2D->FGOR    = OffLineSrc;
  11.         DMA2D->OOR     = OffLineDst;
  12.         DMA2D->FGPFCCR = PixelFormat;
  13.         DMA2D->NLR     = (U32)(xSize << 16) | (U16)ySize;

  14.         /* Start the transfer, and enable the transfer complete IT */  
  15.         DMA2D->CR     |= (1|DMA2D_IT_TC);

  16.         /* Wait for the end of the transfer */
  17.         while (DMA2D->CR & DMA2D_CR_START) {}        
  18. }
复制代码


log
  1. bsp_GetEncoderValue: 2
  2. _DMA_Copy 44
  3. _DMA_Copy 0
  4. _DMA_Copy 0
  5. _DMA_Copy 0
  6. _DMA_Copy 0
  7. _DMA_Copy 0
  8. _DMA_Copy 0
  9. _DMA_Copy 0
  10. _DMA_Copy 0
  11. _DMA_Copy 0
  12. _DMA_Copy 0
  13. _DMA_Copy 1
  14. _DMA_Copy 0
  15. _DMA_Copy 0
  16. _DMA_Copy 0
  17. _DMA_Copy 0
  18. _DMA_Copy 0
  19. _DMA_Copy 0
  20. _DMA_Copy 0
  21. _DMA_Copy 0
  22. _DMA_Copy 0
  23. _DMA_Copy 0
  24. _DMA_Copy 0
  25. _DMA_Copy 0
  26. _DMA_Copy 0
  27. _DMA_Copy 0
  28. _DMA_Copy 1
  29. _DMA_Copy 0
  30. _DMA_Copy 0
  31. _DMA_Copy 0
  32. _DMA_Copy 0
  33. _DMA_Copy 0
  34. _DMA_Copy 0
  35. _DMA_Copy 0
  36. _DMA_Copy 0
  37. _DMA_Copy 0
  38. _DMA_Copy 0
  39. _DMA_Copy 0
  40. _DMA_Copy 0
  41. _DMA_Copy 0
  42. _DMA_Copy 0
  43. _DMA_Copy 0
  44. _DMA_Copy 0
  45. _DMA_Copy 0
  46. _DMA_Copy 0
  47. _DMA_Copy 0
  48. _DMA_Copy 0
  49. _DMA_Copy 0
  50. _DMA_Copy 0
  51. _DMA_Copy 0
  52. _DMA_Copy 0
  53. _DMA_Copy 0
  54. _DMA_Copy 0
  55. _DMA_Copy 0
  56. _DMA_Copy 0
  57. _DMA_Copy 0
  58. _DMA_Copy 0
  59. _DMA_Copy 0
  60. _DMA_Copy 0
  61. _DMA_Copy 0
  62. _DMA_Copy 0
  63. _DMA_Copy 0
  64. _DMA_Copy 0
  65. _DMA_Copy 0
  66. _DMA_Copy 0
  67. _DMA_Copy 0
  68. _DMA_Copy 0
  69. _DMA_Copy 0
  70. _DMA_Copy 0
  71. _DMA_Copy 0
  72. _DMA_Copy 0
  73. _DMA_Copy 0
  74. _DMA_Copy 0
  75. _DMA_Copy 0
  76. _DMA_Copy 0
  77. _DMA_Copy 0
  78. _DMA_Copy 0
  79. _DMA_Copy 0
  80. _DMA_Copy 0
  81. _DMA_Copy 0
  82. _DMA_Copy 0
  83. _DMA_Copy 0
  84. _DMA_Copy 0
  85. _DMA_Copy 0
  86. _DMA_Copy 0
  87. _DMA_Copy 0
  88. _DMA_Copy 0
  89. _DMA_Copy 0
  90. _DMA_Copy 0
  91. _DMA_Copy 0
  92. _DMA_Copy 0
  93. _DMA_Copy 0
  94. _DMA_Copy 0
复制代码

请问下 为什么会调用这个函数那么多次? 怎么样提高刷新的速度, 感觉有点慢 特别是刷新 大一点尺寸的控件 更加慢。 谢谢!





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2022-1-18 10:37:32 | 显示全部楼层
执行时间为0的,说明是正常的,也就是代入的刷新区域是长和宽都是0,也就是emWin裁剪区没有在这里,仅仅是执行了下。

另外方便的话,楼主发下你的测试代码,我看看多慢。
回复

使用道具 举报

31

主题

55

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-1-18 12:22:38 | 显示全部楼层
eric2013 发表于 2022-1-18 10:37
执行时间为0的,说明是正常的,也就是代入的刷新区域是长和宽都是0,也就是emWin裁剪区没有在这里,仅仅是 ...
  1. typedef struct tagBtnUser{
  2.     int Check;
  3.     GUI_COLOR colorPressed;
  4.     GUI_COLOR colorUnPress;
  5.         U32 pImage;
  6.     char btnText[25];   
  7.     char btnText1[20];
  8.         U16 btnPara;
  9.         char (*draw)(userPara_t *,struct tagBtnUser *, char *);
  10.         U8 currItem;
  11.         U8 spSonItem;
  12. } BTN_USER_SKIN;

  13. static int samplePageRetBntDrawCallBack(const WIDGET_ITEM_DRAW_INFO* pItem);

  14. #define SLEEP_RET_X          40
  15. #define SLEEP_RET_Y          12
  16. #define SLEEP_RET_WIDTH      120
  17. #define SLEEP_RET_HEIGHT     40
  18. #define SLEEP_RET_X_OFFSET   (SLEEP_RET_X + 560)
  19. #define SLEEP_RET_Y_OFFSET   (0)

  20. #define WIDGET_HIGHTLIGHT                (GUI_MAKE_COLOR(0X00AAB220))
  21. <blockquote>#define IMAGE_INVALID<span style="white-space:pre">                        </span>(0XFFFFFFFF)
复制代码
#define ID_WINDOW_SLEEP                             (GUI_ID_USER + 0x00)
#define ID_BUTTON_0                                            (GUI_ID_USER + 0x01)
#define ID_BUTTON_1                                            (GUI_ID_USER + 0x02)

#define GUI_USER_KEY_DOWN                                 (GUI_ID_USER + 0x20)
#define GUI_USER_KEY_UP                                 (GUI_ID_USER + 0x21)
#define GUI_USER_KEY_LEFT_ROTATE                 (GUI_ID_USER + 0x22)
#define GUI_USER_KEY_RIGHT_ROTATE                 (GUI_ID_USER + 0x23)



static const GUI_WIDGET_CREATE_INFO _aSleepDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window_sleep", ID_WINDOW_SLEEP, 0, 30, 800, 450, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, SLEEP_RET_X + SLEEP_RET_X_OFFSET * 0, SLEEP_RET_Y + SLEEP_RET_Y_OFFSET * 0, SLEEP_RET_WIDTH, SLEEP_RET_HEIGHT, 0, 0x64, 10 },
  { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, SLEEP_RET_X + SLEEP_RET_X_OFFSET * 1, SLEEP_RET_Y + SLEEP_RET_Y_OFFSET * 1, SLEEP_RET_WIDTH, SLEEP_RET_HEIGHT, 0, 0x64, 10},
};

static BTN_USER_SKIN s_sleepBtnSkinData[] = {
    {0, WIDGET_HIGHTLIGHT, GUI_MAKE_COLOR(0X001C1C1C), IMAGE_INVALID},
    {0, WIDGET_HIGHTLIGHT, GUI_MAKE_COLOR(0X001C1C1C), IMAGE_INVALID},
};

static BTN_USER_SKIN* pSleepBtnUser[GUI_COUNTOF(s_sleepBtnSkinData)];
static U8 s_iSleepCurPos = 0;

static void sampleSleepCallBack(WM_MESSAGE* pMsg) {
    WM_HWIN hItem;

        switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:
        {
                WINDOW_SetBkColor(pMsg->hWin, MAIN_BACKGROUND);
               
                for (int i = 0; i < GUI_COUNTOF(s_sleepBtnSkinData); i++)
                {
               
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + i);
                    BUTTON_SetSkin(hItem, sampleSleepPageRetBntDrawCallBack);
                        pSleepBtnUser = &s_sleepBtnSkinData;
                        BUTTON_SetUserData(hItem, &pSleepBtnUser, sizeof(pSleepBtnUser));
                }

                hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + s_iSleepCurPos);
                BUTTON_SetPressed(hItem, 1);       
                WM_SetFocus(pMsg->hWin);
        }
    break;
    case WM_PAINT:
    {
                //sampleDrawImage(BK, 0, 0);
        }
        break;
        case WM_KEY:
        {
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                {
                        case GUI_USER_KEY_UP:
                        {                               
                        }
                        break;
                        case GUI_USER_KEY_LEFT_ROTATE:
                        {
                                if (s_iSleepCurPos == 0)
                                {
                                        s_iSleepCurPos = 0;
                                        break;
                                }
                                else if (s_iSleepCurPos > 0)
                                {
                                        s_iSleepCurPos--;
                                }
                               
                    for (int i = 0; i < 2; i++)
                    {
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + i);
                                        BUTTON_SetPressed(hItem, 0);
                    }       
                               
                hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + s_iSleepCurPos);
                                BUTTON_SetPressed(hItem, 1);
                        }
                        break;
                        case GUI_USER_KEY_RIGHT_ROTATE:
                        {
                                if (s_iSleepCurPos == 1)
                                {
                                        s_iSleepCurPos = 1;
                                        break;
                                }
                                else
                                {
                                        s_iSleepCurPos++;
                                }
                               
                    for (int i = 0; i < 2; i++)
                    {
                        hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + i);
                                        BUTTON_SetPressed(hItem, 0);
                    }       
                               
                hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0 + s_iSleepCurPos);
                                BUTTON_SetPressed(hItem, 1);
                        }
                        break;
                }
        }
        break;               
    default:
    {
        WM_DefaultProc(pMsg);
        }
    break;
    }
}

WM_HWIN CreateWindow_sleepReport(void) {
    WM_HWIN hWin;

    hWin = GUI_CreateDialogBox(_aSleepDialogCreate, GUI_COUNTOF(_aSleepDialogCreate), sampleSleepCallBack, WM_HBKWIN, 0, 0);
    return hWin;
}


static int samplePageRetBntDrawCallBack(const WIDGET_ITEM_DRAW_INFO* pItem)
{
    BTN_USER_SKIN* pUsr;
    GUI_RECT rect;

    switch (pItem->Cmd)
    {
        case WIDGET_ITEM_DRAW_TEXT:
            break;
        case WIDGET_ITEM_DRAW_BACKGROUND:
        {
            BUTTON_GetUserData(pItem->hWin, &pUsr, sizeof(pUsr));
            if (BUTTON_IsPressed(pItem->hWin))
            {
                GUI_SetColor(pUsr->colorPressed);                       
                                GUI_AA_FillRoundedRect(pItem->x0, pItem->y0, pItem->x1, pItem->y1, 0);
            }
         
            rect.x0 = pItem->x0;
            rect.x1 = pItem->x1;
            rect.y0 = pItem->y0;
            rect.y1 = pItem->y1;

                        rect.x0 += rect.x1 / 4;
           // rect.y0 += rect.y1 / 5;

                        if (pUsr->pImage != IMAGE_INVALID)
                        {
                                //sampleDrawImage(pUsr->pImage, rect.x0, rect.y0);
                        }
                }
        break;
        default:
        {
            return BUTTON_DrawSkinFlex(pItem);
        }
    }

    return 0;
}
这是项目中 按键选中高亮部分的代码, 我用的平台是GD32F450,SDRAM是16bit 8M   

谢谢!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 09:26 , Processed in 0.040179 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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