硬汉嵌入式论坛

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

[μCGUI] 为什么随着控件的增多会导致界面刷新不完整呢?

[复制链接]

20

主题

92

回帖

152

积分

初级会员

积分
152
发表于 2018-8-28 21:47:15 | 显示全部楼层 |阅读模式
本帖最后由 tovax 于 2018-8-28 21:49 编辑

源码:ucgui3.98

主界面为DialogA;
按下“按键OK”后,创建DialogB;
DialogA和DialogB是一样大小的,铺满了整个屏幕;
创建DialogB后,DialogA并没有删除,而是靠新建的DialogB把DialogA遮盖住了;
当控件比较少时(经测试,分界点在157个控件),新建的DialogB显示正常;
当控件多到一定数量时(即超过157个控件),会出现DialogB不能完全遮盖DialogA的状况;
DialogB的各个控件都创建成功了,只是在屏幕最下边的小块矩形区域能看到DialogA,DialogB的某些控件是叠加在DialogA界面上的;

已经进行了以下测试:
1. 增大任务的堆栈尺寸
2. 把GUI_MAXBLOCKS宏定义由1024改为2048
3. 把GUI_ALLOC_SIZE由10MB改为15MB
4. 在创建DialogB前“GUI_Clear();”
5. 任务中的GUI_Delay(100)改为GUI_Delay(200)

以上的修改都对这个显示异常没有效果,请问是什么原因导致这种显示异常呢?是哪个GUI的配置不对了吗?谢谢先!

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-8-29 01:09:56 | 显示全部楼层
方便的话,提供下测试文件,仅需要对话框A和对话框B的界面文件即可,我测试下看看是否正常。
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-29 10:17:51 | 显示全部楼层
本帖最后由 tovax 于 2018-8-29 10:18 编辑
eric2013 发表于 2018-8-29 01:09
方便的话,提供下测试文件,仅需要对话框A和对话框B的界面文件即可,我测试下看看是否正常。

附件的源码是做了一些改动,适用于电脑模拟器的,主要是把"汉字"改成了“拼音”(没找到模拟器中的汉字字体);
模拟器MainTask.c的代码如下:

  1. #include <windows.h>
  2. #include <stdio.h>

  3. #include "GUI.h"

  4. #include "lcdisplay_main_Codes.h"
  5. #include "lcdisplay_f5_Codes.h"
  6. /*******************************************************************
  7. *
  8. *       MainTask
  9. *
  10. ********************************************************************
  11. */

  12. void MainTask(void) {
  13.   GUI_Init();
  14.   lcdisplay_main_initialize();
  15.   lcdisplay_f5_initialize();
  16.   while(1) {
  17.     GUI_Delay(100);
  18.   }
  19. }
复制代码


本来是首先创建main界面,然后通过“按键F5”按键创建“F5界面”的,不过在修改过程中发现,跟创建过程没关系,直接新建"F5界面"就会出问题;
附件的“143.png”是界面上有143个控件的模拟器显示效果,看上去是正常的;
附件的“144.png”是界面上有144个控件的模拟器显示效果,底部出现显示异常;

附件的源码是143个控件的版本,144个控件版本修改以下3个地方:
1. 打开lcdisplay_f5_Codes.c中第195行 ===》LCDISPLAY_WIDGET_INFO_BUTTON(F5, BUTTON42);
2. 打开lcdisplay_f5_Codes.c中第478行 ===》LCDISPLAY_WIDGET_INIT_BUTTON(F5, BUTTON42);
3. 把lcdisplay_f5_Codes.h中“_aDialogCreate_F5[143 + 0]”改为“_aDialogCreate_F5[143 + 1]”
重新编译即可看到显示异常的状况。


也就是说“main界面”的文件没什么影响,目前源码中没有创建“main界面”,在初始化过程中直接创建了“F5”界面;
当控件超143时,底部区域显示异常;(开发板上是超157个控件时出问题,多了14个,2排按键刚好14个,不知道这个信息有没有用);






143.png
144.png

lcdisplay.rar

20.26 KB, 下载次数: 34

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-8-29 12:25:18 | 显示全部楼层
帮你测试了,界面效果没问题
QQ截图20180829122714.png



回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-29 13:29:43 | 显示全部楼层
eric2013 发表于 2018-8-29 12:25
帮你测试了,界面效果没问题

谢谢!
好奇怪,模拟器模拟显示也出问题,一下就蒙圈儿了。。。
我的板子也是可以显示到157个,附件源码测试的是144个,要不您再把后边的BUTTON全打开试试;
后边还有5排,共35个;
我的板子是从显示最后3排开始出问题的。
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-29 20:30:07 | 显示全部楼层
eric2013 发表于 2018-8-29 12:25
帮你测试了,界面效果没问题

附件是所有控件都打开的源码,(143+35)个,模拟器上显示白屏了;
我的板上显示屏底部部分显示异常,帮忙试试你的能否正常显示,谢谢!


lcdisplay.rar

20.23 KB, 下载次数: 49

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-8-30 01:02:00 | 显示全部楼层
也没问题,可以正常触摸使用

QQ截图20180830010130.png
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-30 09:04:43 | 显示全部楼层
本帖最后由 tovax 于 2018-8-30 09:06 编辑
eric2013 发表于 2018-8-30 01:02
也没问题,可以正常触摸使用

十分感谢eric2013!您的测试结果使我坚信附件的源码没有问题,于是重新思考了昨天那个“蒙圈儿”:为什么模拟器显示也出问题?既然代码没错,就只能是ucgui的配置问题了,配置文件中能配置的也就GUI_ALLOC_SIZE和GUI_SUPPORT_MEMDEV等几个选项,经过测试发现是GUI_SUPPORT_MEMDEV导致的,效果见附件图片,图片中的异常几乎和我板子上出现的异常完全一样。
其实之前在这个配置栽过跟头,主要是没理解这个配置的含义,前段时间看到例程中这个选项是打开的,我也不求甚解的去打开试试,但是arm-none-eabi-gcc编译报错了,因为当时的情况下这个配置并没有对显示界面有明显的影响,索性先不管了。。。
附件的图片是模拟器测试的,板子上的测试得等我找到为什么arm-none-eabi-gcc编译ucgui报错的问题,把GUI_SUPPORT_MEMDEV使能后才能确定,到时再回来回复给大家。

禁止_GUI_SUPPORT_MEMDEV.png
使能_GUI_SUPPORT_MEMDEV.png
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-30 21:09:46 | 显示全部楼层
神奇了,打开GUI_SUPPORT_MEMDEV后对板子上的显示效果没有任何改善,还是如楼上图片那样的异常。
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-30 21:09:59 | 显示全部楼层
神奇了,打开GUI_SUPPORT_MEMDEV后对板子上的显示效果没有任何改善,还是如楼上图片那样的异常。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-8-31 00:45:18 | 显示全部楼层
tovax 发表于 2018-8-30 21:09
神奇了,打开GUI_SUPPORT_MEMDEV后对板子上的显示效果没有任何改善,还是如楼上图片那样的异常。

如果要是这样的话,就不得不怀疑是UCGUI这个版本的问题了。

我这里还有一个4.x版本的模拟器,你试试看,算是比较接近的版本了。
http://www.armbbs.cn/forum.ph ... =377&extra=page%3D1
QQ截图20180831004451.png
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-31 11:43:59 | 显示全部楼层
同样的源码(lcdisplay.rar)
在模拟器3.98中显示正常;
在模拟器4.06中显示异常;
在我的板子上显示异常;
我板子上的异常与模拟器4.06保持一致,与模拟器3.98不一样;

模拟器3.98的GUIConf.h如下:
  1. #ifndef GUICONF_H
  2. #define GUICONF_H

  3. #define GUI_OS                                (1)  /* Compile with multitasking support */
  4. #define GUI_SUPPORT_TOUCH         (0)  /* Support a touch screen (req. win-manager) */
  5. #define GUI_SUPPORT_MOUSE         (0)  /* Support a mouse */
  6. #define GUI_SUPPORT_UNICODE      (1)  /* Support mixed ASCII/UNICODE strings */

  7. #define GUI_DEFAULT_FONT             &GUI_Font16_ASCII
  8. #define GUI_ALLOC_SIZE                   32000  /* Size of dynamic memory ... For WM and memory devices*/

  9. /*********************************************************************
  10. *
  11. *         Configuration of available packages
  12. */

  13. #define GUI_WINSUPPORT            1  /* Window manager package available */
  14. #define GUI_SUPPORT_MEMDEV                1  /* Memory devices available */
  15. #define GUI_SUPPORT_AA             1  /* Anti aliasing available */

  16. #endif  /* Avoid multiple inclusion */
复制代码


模拟器4.06的GUIConf.h如下:
  1. #ifndef GUICONF_H
  2. #define GUICONF_H

  3. /*********************************************************************
  4. *
  5. *         Configuration of desired functionality
  6. */

  7. #define GUI_OS                    (1)  /* Compile with multitasking support */
  8. #define GUI_WINSUPPORT            (1)  /* Use window manager if true (1)  */
  9. #define GUI_SUPPORT_MEMDEV        (1)  /* Support memory devices */
  10. #define GUI_SUPPORT_TOUCH         (1)  /* Support a touch screen (req. win-manager) */
  11. #define GUI_SUPPORT_MOUSE         (1)  /* Support a mouse */
  12. #define GUI_SUPPORT_UNICODE       (1)  /* Support mixed ASCII/UNICODE strings */
  13. #define GUI_SUPPORT_AA            (1)  /* Support for antialiasing */
  14. #define GUI_SUPPORT_BIDI          (1)  /* Support for bidirectional text */

  15. /*********************************************************************
  16. *
  17. *       Configuration of window manager
  18. */

  19. #define WM_SUPPORT_NOTIFY_VIS_CHANGED 1 /* Enable sending of WM_NOTIFY_VIS_CHANGED messages */

  20. /*********************************************************************
  21. *
  22. *         Configuration of dynamic memory

  23. Dynamic memory is used for memory devices and window manager.
  24. If you do not use these features, there is no need for dynamic memory
  25. and it may be switched off completely. (This section can be erased)
  26. */

  27. #define GUI_ALLOC_SIZE          500000  /* Size of dynamic memory */


  28. /*********************************************************************
  29. *
  30. *         Configuration of available fonts

  31. Dynamic memory is used for memory devices and window manager.
  32. If you do not use these features, there is no need for dynamic memory
  33. and it may be switched off completely. (This section can be erased)
  34. */


  35. #define GUI_DEFAULT_FONT    &GUI_Font6x8

  36. #endif /* GUICONF_H */
复制代码


请问使能GUI_SUPPORT_MEMDEV后,只要调用WM_SetCreateFlags(WM_CF_MEMDEV)就自动使用MEMDEV了吗?
我看手册上还有那么多API,新建、选择、拷贝、删除之类的,模拟器中也没有调用这些API,我的代码中也没有这些函数的调用。
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-31 14:19:47 | 显示全部楼层
eric2013 发表于 2018-8-31 00:45
如果要是这样的话,就不得不怀疑是UCGUI这个版本的问题了。

我这里还有一个4.x版本的模拟器,你试试看 ...

如图是模拟器V4.06的显示效果,确实跟模拟器V3.98不一样。

模拟器V4.06.png
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-8-31 14:43:18 | 显示全部楼层
模拟器V3.98在重新编译的过程中编译了UCGUI的源码,修改GUIConf.h后对应的配置能起作用;
模拟器V4.06在重新编译的过程中没有编译UCGUI的源码,只是编译了用户自己的源码,所以修改GUIConf.h里的配置是不起作用的。
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-9-1 00:04:49 | 显示全部楼层
这代码就什么都不显示了:
  1.         hMem = GUI_MEMDEV_Create(0, 0, 800, 480);
  2.         GUI_MEMDEV_Select(hMem);
  3.         handle_F5 = GUI_CreateDialogBox(_aDialogCreate_F5, GUI_COUNTOF(_aDialogCreate_F5), &_cbCallback_F5, 0, 0, 0);
  4.         GUI_MEMDEV_CopyToLCD(hMem);
复制代码
回复

使用道具 举报

20

主题

92

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2018-9-1 15:23:34 | 显示全部楼层
eric2013 发表于 2018-8-31 00:45
如果要是这样的话,就不得不怀疑是UCGUI这个版本的问题了。

我这里还有一个4.x版本的模拟器,你试试看 ...

问题解决了,谢谢您的测试和讨论!
解决方法:
当控件过多导致如上图所示的显示异常时,在初始化函数即InitDialog_F5的主界面FRAMEWIN初始化之后添加一段延时就可以了,我添加的是“GUI_Delay(100)”。
原因分析:
由于UCGUI使用的是外部SDRAM,在读取过多的控件并创建之后,立即发送了WM_INIT_DIALOG消息,触发了初始化函数InitDialog_F5,怀疑是与SDRAM的数据交换过多,导致异常;
只是怀疑而已,要么是SDRAM配置不合理,要么是SDRAM硬件不合理,还有可能是LTDC的时钟配置不合理,具体原因还不是很确定。
解决思路:
由eric2013的测试反馈可以断定F5界面显示的“功能”是没有问题的,于是尽量精简代码,只留了F5界面的创建,但还是显示异常;
那么异常肯定出在F5界面的创建函数了,只有一个GUI_CreateDialogBox而已,打开UCGUI3.98的源码,看到这个函数只是循环调用控件resource后建立控件,然后发送WM_INIT_DIALOG消息,整个过程的逻辑还是挺清晰的;
为了追踪到异常是发生在哪个阶段,就适当修改了UCGUI3.98的源码:在GUI_CreateDialogBox的执行过程中添加延时,看对话框是怎么一步一步建立起来的。结果发现,在发送WM_INIT_DIALOG消息之前,显示是正常的,只是控件大小、位置、字体等没有初始化而已;
这样看来,是InitDialog_F5执行出了问题,于是同样的方法:每个控件初始化后都添加延时,看是哪一步初始化导致了异常;
初始化代码中添加延时后,显示正常了,一步一步删除延时发现,最终有效的延时是FRAMEWIN创建的那几句代码之后的延时;
总结:
延时起作用,说明很可能是“数据速率”的问题,相关关键点涉及:SDRAM软件配置,SDRAM硬件设计,LTDC时钟配置,具体原因有空再深入分析,遇到同样问题的朋友们可以参考一下。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2018-9-1 15:31:28 | 显示全部楼层
tovax 发表于 2018-9-1 15:23
问题解决了,谢谢您的测试和讨论!
解决方法:
当控件过多导致如上图所示的显示异常时,在初始化函数即 ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 16:25 , Processed in 0.345939 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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