OpenEdv-开源电子网

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

emWin/ucgui在ucos系统中的在什么地方进行重绘操作的?

[复制链接]

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-4-26
在线时间
1 小时
发表于 2014-7-22 21:14:34 | 显示全部楼层 |阅读模式
5金钱
因为我将emWin+ucos的例程拿去改成自己的东西,就是讲gui任务改了下,结果黑屏,我怀疑是没有进行更新操作的,然后我转向分析demo的代码。任务的伪代码如下,然后我在GUIDEMO_Main();里面一步步进行查找,始终找不到他进行更新的地方。里面老是一些操作,没有什么延时什么的。
所以我想请大家帮忙的就是:
帮忙分析下他的重绘机制,找出他在什么地方跳出去重绘了,谢谢大家。
普通浏览复制代码
  1. void Task_Start(void *p_arg)
  2. {
  3.         /* 板级初始化 */
  4.         //创建任务LED        
  5.         //创建任务GUI                                        
  6.         //创建任务GUI_Touch        
  7.        //任务删除自己        
  8.         OSTaskDel(&StartUp_TCB,&err);                                                         
  9. }
这个就是里面的gui任务
普通浏览复制代码
  1. void Task_GUI(void *p_arg)
  2. {
  3.   OS_ERR err;
  4.   (void)p_arg;                
  5.         
  6.         GUIDEMO_Main();
  7.         
  8.         //延时
  9.         while(1)
  10.         {
  11.                 OSTimeDly(1,OS_OPT_TIME_DLY,&err);
  12.   }
  13. }
GUIDEMO_Main();具体内容
普通浏览复制代码
  1. void GUIDEMO_Main(void) 
  2. {
  3.   OS_ERR err;
  4.   FRAMEWIN_SKINFLEX_PROPS Framewin_Props;
  5. #if GUIDEMO_USE_AUTO_BK
  6.   int                     NumFreeBytes;
  7.   int                     BitsPerPixel;
  8. #endif
  9.   GUI_MEMDEV_SetAnimationCallback(_cbEffect, (void *)&_Pressed);
  10.   WM_SetCallback(WM_HBKWIN, _cbBk);
  11.   BUTTON_SetReactOnLevel();
  12.   FRAMEWIN_GetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_ACTIVE);
  13.   Framewin_Props.Radius = 0;
  14.   FRAMEWIN_SetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_ACTIVE);
  15.   FRAMEWIN_GetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_INACTIVE);
  16.   Framewin_Props.Radius = 0;
  17.   FRAMEWIN_SetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_INACTIVE);
  18.   FRAMEWIN_SetDefaultSkin  (_FRAMEWIN_DrawSkinFlex);
  19.   ROGBAR_SetDefaultSkin   (PROGBAR_SKIN_FLEX);
  20.   BUTTON_SetDefaultSkin    (BUTTON_SKIN_FLEX);
  21.   SCROLLBAR_SetDefaultSkin (SCROLLBAR_SKIN_FLEX);
  22.   SLIDER_SetDefaultSkin    (SLIDER_SKIN_FLEX);
  23.   HEADER_SetDefaultSkin    (HEADER_SKIN_FLEX);
  24.   GUI_SetTextMode          (GUI_TM_TRANS);
  25.   GUIDEMO_Config(&_GUIDemoConfig);
  26.   #if GUIDEMO_USE_VNC
  27.     if (GUIDEMO_GetConfFlag(GUIDEMO_CF_USE_VNC)) {
  28.       _GUIDemoConfig.pGUI_VNC_X_StartServer(00);
  29.     }
  30.   #endif
  31.   #if GUIDEMO_USE_AUTO_BK
  32.     //
  33.     // Determine if HW has enough memory to draw the gradient circle as background
  34.     //
  35.     BitsPerPixel = LCD_GetBitsPerPixel();
  36.     if ((BitsPerPixel >= 16) && GUIDEMO_GetConfFlag(GUIDEMO_CF_USE_AUTO_BK)) {
  37.       NumFreeBytes = GUI_ALLOC_GetNumFreeBytes();
  38.       if (NumFreeBytes > NUMBYTES_NEEDED) {
  39.         _pfDrawBk = _DrawBkCircle;
  40.       } else {
  41.         _pfDrawBk = _DrawBk;
  42.       }
  43.     } else
  44.   #endif
  45.     {
  46.       _pfDrawBk = _DrawBkSimple;
  47.     }
  48.   GUIDEMO_SetDrawLogo(1);
  49.   while (1) 
  50.   {
  51.     _Main();
  52.   }
  53. }
_Main();的内容
普通浏览复制代码
  1. static void _Main(void) 
  2. {
  3.   OS_ERR err;
  4.   int xSize;
  5.   int ySize;
  6.   WM_SelectWindow(WM_HBKWIN);
  7.   GUI_Clear();
  8.   #if (GUI_SUPPORT_CURSOR | GUI_SUPPORT_TOUCH)
  9.     GUI_CURSOR_Show();
  10.   #endif
  11.   //
  12.   // Create and configure Control and Information window
  13.   //
  14.   xSize           = LCD_GetXSize();
  15.   ySize           = LCD_GetYSize();
  16.   _hDialogControl = GUI_CreateDialogBox(_aFrameWinControl, GUI_COUNTOF(_aFrameWinControl)&_cbFrameWinControl, WM_HBKWIN, xSize - CONTROL_SIZE_X, ySize - CONTROL_SIZE_Y);
  17.   _hDialogInfo    = GUI_CreateDialogBox(_aFrameWinInfo,    GUI_COUNTOF(_aFrameWinInfo),    &_cbFrameWinInfo,    WM_HBKWIN, (xSize >> 1) - 1,       0);
  18.   WM_HideWindow(_hDialogInfo);
  19.   //
  20.   // Show Intro
  21.   //
  22.   WM_InvalidateWindow(_hDialogControl);
  23.   WM_DisableMemdev(WM_HBKWIN);
  24.   GUI_Exec();
  25.   WM_EnableMemdev(WM_HBKWIN);
  26.   GUIDEMO_Intro();
  27.   //
  28.   // Run the demos
  29.   //
  30.   for (_iDemo = 0; _GUIDemoConfig.apFunc[_iDemo]; _iDemo++)
  31.   {
  32.     _ClearHalt();
  33.     while(1)
  34.     {
  35.       OSTimeDly(1,OS_OPT_TIME_DLY,&err);
  36.     }
  37.     GUIDEMO_UpdateControlText();
  38.     (*_GUIDemoConfig.apFunc[_iDemo])();
  39.     _iDemoMinor = 0;
  40.     _Pressed    = 0;
  41.   }
  42.   _iDemo = 0;
  43.   //
  44.   // Cleanup
  45.   //
  46.   WM_DeleteWindow(_hDialogControl);
  47.   WM_DeleteWindow(_hDialogInfo);
  48.   #if (GUI_SUPPORT_CURSOR | GUI_SUPPORT_TOUCH)
  49.     GUI_CURSOR_Hide();
  50.   #endif
  51. }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-7-22 23:47:13 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-23 08:06:28 | 显示全部楼层
直接jtag硬件仿真,看是怎么工作的就知道了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-4-26
在线时间
1 小时
 楼主| 发表于 2014-7-23 08:06:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
恩,谢谢原子哥啦
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-7-23 09:22:20 | 显示全部楼层
和uC/GUI机制是一样的,可作参考。

编辑说明:补充
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-4-26
在线时间
1 小时
 楼主| 发表于 2014-7-23 09:35:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
看来gui、ucos还有很多人都不是很熟悉,居然没有人知道,后来找到水哥才知道原来是GUI_Exec  
可以看到在每个小demo中间的部分肯定会有这个GUI_Exec();,下面也有说, Allow short breaks so we do not use all available CPU time ...
  for (i = 0; ((GUIDEMO_GetTime() - TimeStart) < 5000) && (GUIDEMO_CheckCancel() == 0); i++) 
  {
    GUI_SetColorIndex(aColorIndex[i&7]);
    //
    // Calculate random positions
    //
    Rect.x0 = rand() % xSize - xSize / 2;
    Rect.y0 = rand() % ySize - ySize / 2;
    Rect.x1 = Rect.x0 + 20 + rand() % xSize;
    Rect.y1 = Rect.y0 + 20 + rand() % ySize;
    GUI_FillRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
    //
    // Clip rectangle to visible area and add the number of pixels (for speed computation)
    //
    if (Rect.x1 >= xSize)
之前很多人的错误答案是OSTIMEDLY,实际上这个在没有gui的时候是一样,只能起释放CPU使用权的作用!!没有重绘的功能。很多人会说他是在代替GUIDelay,实际上不是的,GUIDelay是有重绘功能的!
还有一个是一般GUI_Exec都会被放在一个单独的任务中,但是官方的例程没有!!
对此水哥是这样子说的:
官方提供的demo的演示流程就是轮流走一边 只不过把触屏处理放到了一个任务中。其实和落跑没什么关系 之所以每个demo中都有个GUI_Exec 是因为每个demo都可以单独使用。 
不管用不用OS 刷新任务一定要用到GUI_Exec 和应用放到一起还是单独任务 这个由开发者决定,另外 至于两个dly的作用, 和我之前说的一样  一个刷新加延时 一个单纯延时
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-7-23 23:29:45 | 显示全部楼层
回复【6楼】12ycli:
---------------------------------
谢谢分享.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-8-3 14:19:04 | 显示全部楼层
回复【6楼】12ycli:
---------------------------------
对的,在运行RTOS系统中一般是单独建立一个任务来执行GUI_Exec()和GUI_ExecIdle()函数,GUI_ExecIdle()里面是你移植的OS_TimeDly  
而且这个任务的优先级是所以用户级任务中优先级最低的,或者是处于倒数几个优先级内的,一定要确保等到其他调用GUI函数的任务执行完GUI的函数后才发生任务调度,否则当调用GUI_Exec()时会引起重绘混乱,执行重绘操作不应影响系统的实时性,因为GUI_Exec()实为一可重入函数,因此一般只有一个任务中有该函数被周期性执行。可以单独建立一个任务来执行GUI_Exec()或者将其放在一个最低优先级的任务中。
回复

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-2-19 10:29:44 | 显示全部楼层
本帖最后由 candylife9 于 2019-2-19 10:33 编辑

直接上图吧
其实emwin更新窗口有好几种方式1.回调函数  2.手动更新   3.使窗口无效,总的来说都是调用WM_EXEC1来的,GUI_Delay这个函数会调用WM_Exec(),WM_Exec()又反复调用WM_Exec1(),所以我们如果把例程里的GUI_Delay()干掉的话,就会发现无法刷屏

捕获.PNG
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-23 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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