嵌入式学习小组
直播中

贵奂

8年用户 211经验值
私信 关注

请问emWin/ucgui在ucos系统哪里进行重绘操作的?

因为我将emWin+ucos的例程拿去改成自己的东西,就是讲gui任务改了下,结果黑屏,我怀疑是没有进行更新操作的,然后我转向分析demo的代码。任务的伪代码如下,然后我在GUIDEMO_Main();里面一步步进行查找,始终找不到他进行更新的地方。里面老是一些操作,没有什么延时什么的。
所以我想请大家帮忙的就是:
帮忙分析下他的重绘机制,找出他在什么地方跳出去重绘了,谢谢大家。普通浏览复制代码
  • void Task_Start(void *p_arg)
  • {
  •         /* 板级初始化 */
  •         //创建任务LED
  •         //创建任务GUI
  •         //创建任务GUI_Touch
  •        //任务删除自己
  •         OSTaskDel(&StartUp_TCB,&err);
  • }
这个就是里面的gui任务普通浏览复制代码
  • void Task_GUI(void *p_arg)
  • {
  •   OS_ERR err;
  •   (void)p_arg;
  •         GUIDEMO_Main();
  •         //延时
  •         while(1)
  •         {
  •                 OStimeDly(1,OS_OPT_TIME_DLY,&err);
  •   }
  • }
GUIDEMO_Main();具体内容普通浏览复制代码
  • void GUIDEMO_Main(void)
  • {
  •   OS_ERR err;
  •   FRAMEWIN_SKINFLEX_PROPS Framewin_Props;
  • #if GUIDEMO_USE_AUTO_BK
  •   int                     NumFreeBytes;
  •   int                     BitsPerPixel;
  • #endif
  •   GUI_MEMDEV_SetAnimationCallback(_cbEffect, (void *)&_Pressed);
  •   WM_SetCallback(WM_HBKWIN, _cbBk);
  •   BUTTON_SetReactOnLevel();
  •   FRAMEWIN_GetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_ACTIVE);
  •   Framewin_Props.Radius = 0;
  •   FRAMEWIN_SetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_ACTIVE);
  •   FRAMEWIN_GetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_INACTIVE);
  •   Framewin_Props.Radius = 0;
  •   FRAMEWIN_SetSkinFlexProps(&Framewin_Props, FRAMEWIN_SKINFLEX_PI_INACTIVE);
  •   FRAMEWIN_SetDefaultSkin  (_FRAMEWIN_DrawSkinFlex);
  •   ROGBAR_SetDefaultSkin   (PROGBAR_SKIN_FLEX);
  •   BUTTON_SetDefaultSkin    (BUTTON_SKIN_FLEX);
  •   SCROLLBAR_SetDefaultSkin (SCROLLBAR_SKIN_FLEX);
  •   SLIDER_SetDefaultSkin    (SLIDER_SKIN_FLEX);
  •   HEADER_SetDefaultSkin    (HEADER_SKIN_FLEX);
  •   GUI_SetTextMode          (GUI_TM_TRANS);
  •   GUIDEMO_Config(&_GUIDemoConfig);
  •   #if GUIDEMO_USE_VNC
  •     if (GUIDEMO_GetConfFlag(GUIDEMO_CF_USE_VNC)) {
  •       _GUIDemoConfig.pGUI_VNC_X_StartServer(0, 0);
  •     }
  •   #endif
  •   #if GUIDEMO_USE_AUTO_BK
  •     //
  •     // Determine if HW has enough memory to draw the gradient circle as background
  •     //
  •     BitsPerPixel = LCD_GetBitsPerPixel();
  •     if ((BitsPerPixel >= 16) && GUIDEMO_GetConfFlag(GUIDEMO_CF_USE_AUTO_BK)) {
  •       NumFreeBytes = GUI_ALLOC_GetNumFreeBytes();
  •       if (NumFreeBytes > NUMBYTES_NEEDED) {
  •         _pfDrawBk = _DrawBkCircle;
  •       } else {
  •         _pfDrawBk = _DrawBk;
  •       }
  •     } else
  •   #endif
  •     {
  •       _pfDrawBk = _DrawBkSimple;
  •     }
  •   GUIDEMO_SetDrawLogo(1);
  •   while (1)
  •   {
  •     _Main();
  •   }
  • }
_Main();的内容普通浏览复制代码
  • static void _Main(void)
  • {
  •   OS_ERR err;
  •   int xSize;
  •   int ySize;
  •   WM_SelectWindow(WM_HBKWIN);
  •   GUI_Clear();
  •   #if (GUI_SUPPORT_CURSOR | GUI_SUPPORT_TOUCH)
  •     GUI_CURSOR_Show();
  •   #endif
  •   //
  •   // Create and configure Control and Information window
  •   //
  •   xSize           = LCD_GetXSize();
  •   ySize           = LCD_GetYSize();
  •   _hDialogControl = GUI_CreateDialogBox(_aFrameWinControl, GUI_COUNTOF(_aFrameWinControl), &_cbFrameWinControl, WM_HBKWIN, xSize - CONTROL_SIZE_X, ySize - CONTROL_SIZE_Y);
  •   _hDialogInfo    = GUI_CreateDialogBox(_aFrameWinInfo,    GUI_COUNTOF(_aFrameWinInfo),    &_cbFrameWinInfo,    WM_HBKWIN, (xSize >> 1) - 1,       0);
  •   WM_HideWindow(_hDialogInfo);
  •   //
  •   // Show Intro
  •   //
  •   WM_InvalidateWindow(_hDialogControl);
  •   WM_DisableMemdev(WM_HBKWIN);
  •   GUI_Exec();
  •   WM_EnableMemdev(WM_HBKWIN);
  •   GUIDEMO_Intro();
  •   //
  •   // Run the demos
  •   //
  •   for (_iDemo = 0; _GUIDemoConfig.apFunc[_iDemo]; _iDemo++)
  •   {
  •     _ClearHalt();
  •     while(1)
  •     {
  •       OSTimeDly(1,OS_OPT_TIME_DLY,&err);
  •     }
  •     GUIDEMO_UpdateControlText();
  •     (*_GUIDemoConfig.apFunc[_iDemo])();
  •     _iDemoMinor = 0;
  •     _Pressed    = 0;
  •   }
  •   _iDemo = 0;
  •   //
  •   // Cleanup
  •   //
  •   WM_DeleteWindow(_hDialogControl);
  •   WM_DeleteWindow(_hDialogInfo);
  •   #if (GUI_SUPPORT_CURSOR | GUI_SUPPORT_TOUCH)
  •     GUI_CURSOR_Hide();
  •   #endif
  • }

回帖(6)

邓罕攀

2019-3-13 09:41:01
不懂,帮顶。。。。
举报

王洋

2019-3-13 10:06:30
恩,谢谢原子哥啦
举报

李梓

2019-3-13 10:21:23
和uC/GUI机制是一样的,可作参考。
编辑说明:补充
举报

康沧鹤

2019-3-13 10:39:07
看来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的作用, 和我之前说的一样  一个刷新加延时 一个单纯延时
举报

更多回帖

发帖
×
20
完善资料,
赚取积分