OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2695|回复: 5

调用GUI_Delay()后屏幕出现雪花

[复制链接]

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-6-19
在线时间
14 小时
发表于 2022-6-30 17:07:19 | 显示全部楼层 |阅读模式
1金钱
在探索者移植的STemWin下测试原子哥的存储设备实验例程(EMWIN实验8)时出现如图所示现象。经过跟踪发现是在第一次调用GUI_Delay()之后,整个屏幕即变成雪花屏,以后的则没有影响。
在操作系统RT-Thread和FreeRTOS下进行测试都得到同样结果。原子哥的uCOSIII例程运转正常。
使用操作系统的延时函数则不会出现问题。
在整个_DemoMemDev()的第一句添加一个GUI_Delay()后,由于出现雪花后紧接着就执行了清屏,以后的GUI_Delay()不会再出现这个现象,看起来像是正常了。
请教各位高手,这个现象的原因是什么?

xuehua.jpg

最佳答案

查看完整内容[请看2#楼]

可能你的屏幕初始化就存在异常,仿真找下问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-6-30 17:07:20 | 显示全部楼层
可能你的屏幕初始化就存在异常,仿真找下问题
回复

使用道具 举报

3

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2021-12-22
在线时间
34 小时
发表于 2022-7-2 12:10:02 | 显示全部楼层
待解!!!
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-6-19
在线时间
14 小时
 楼主| 发表于 2022-7-5 10:53:12 | 显示全部楼层
经过确认,屏幕初始化并无异常。

经过一系列的对比测试,发现雪花屏的出现是因为采用了静态内存分配的原因,除了出现雪花外,还可能出现上次程序的残留(不经断电刷程序)。如果采用MALLOC分配则出现纯黑背景。

经过这几天的学习,对GUI_Delay()和桌面窗口概念的理解,加之雪花的出现在执行了GUI_Delay()之后,我认为问题应该是出在了桌面窗口的刷新上,于是重写并替代了桌面窗口的回调函数:

static void _BkCallback(WM_MESSAGE *pMsg)
{

        switch(pMsg->MsgId)
        {
                case WM_PAINT:
                        GUI_SetBkColor(GUI_BLUE);
                        GUI_Clear();
                        GUI_SetColor(GUI_YELLOW);
                        GUI_SetFont(&GUI_Font24_ASCII);
                        GUI_DispStringHCenterAt("MEMDEV_MemDev - Sample", 400, 0);
                        GUI_SetFont(&GUI_Font20_ASCII);
                        GUI_DispStringHCenterAt("Shows the advantage of using a\nmemorydevice", 400,50);
                        GUI_SetFont(&GUI_Font16_ASCII);
                        GUI_DispStringHCenterAt("Draws the picture\nwithout a\nmemory device", 250, 100);
                        GUI_DispStringHCenterAt("Draws the picture\nusing a\nmemory device", 550, 100);
                        break;       

                default:
                        WM_DefaultProc(pMsg);
                        break;
        }       
}

另外,_Draw(int Delay)在此情况下需要设置蓝色背景,否则演示部分的背景会是纯黑。

这也解释了为什么使用操作系统的演示函数不会有问题,因为操作系统的演示函数并不进行刷新操作。

虽然程序运行起来没有问题,不过还是对于原子哥例程中没有改写桌面回调函数感到困惑,难道有什么开关可以改变GUI_Delay()的动作,让它不执行刷新,或者其他的什么原因?

回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-6-19
在线时间
14 小时
 楼主| 发表于 2022-7-10 14:18:40 | 显示全部楼层
在另一位网友的帖子里找到了最终的问题所在,原帖:http://www.openedv.com/forum.php?mod=viewthread&tid=84412
把下面两个函数的调用次序交换即可解决
WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init();
或者,在本例中,不调用WM_SetCreateFlags(WM_CF_MEMDEV); 也行。
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2019-6-19
在线时间
14 小时
 楼主| 发表于 2022-8-1 12:10:23 | 显示全部楼层
然而,在STM32F7的RGB的Lin方式移植过程中却发现,把WM_SetCreateFlags(WM_CF_MEMDEV);放在前面却会出现意想不到的问题。真是太神奇了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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