搜索
bottom↓
回复: 5

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

[复制链接]

出0入10汤圆

发表于 2014-7-22 21:07:54 | 显示全部楼层 |阅读模式
本帖最后由 10xjzheng 于 2014-7-22 21:09 编辑

因为我将野火的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.   PROGBAR_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(0, 0);
  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. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-7-24 16:39:13 | 显示全部楼层
在GUI的task里面去
while(1)
        {
                OSTimeDly(1,OS_OPT_TIME_DLY,&err);
     }
其实没啥用处。GUI_Delay是回去调用用户porting的GUI_X_Delay函数,这个函数是你移植的时候要写的,如果你是os的,在里面可以执行os的delay,以达到os本身的delay效果。

出0入0汤圆

发表于 2014-7-24 16:35:06 | 显示全部楼层
GUI_Exec();这个函数,还有你使用GUI_Delay()的时候GUI也会去GUI_Exec()也能达到刷新的效果。

出0入34汤圆

发表于 2014-7-24 16:16:45 | 显示全部楼层
我估计您在这 emWin 或 uCGUI 中的 GUI_X.c 或 GUI_X_uCOS.c 内的一些定时任务函数接口没有 Porting 好,进而造成 emWin 或 uCGUI 没有运作起来的原故吧?!

出0入10汤圆

 楼主| 发表于 2014-7-23 09:33:52 | 显示全部楼层
本帖最后由 10xjzheng 于 2014-7-23 09:35 编辑

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入10汤圆

 楼主| 发表于 2014-7-22 21:17:14 | 显示全部楼层
有人说是在他的GUI_Delay里面,可是demo运行的过程还没有到达GUI_Delay这步,永远不会,因为里面是个循环。
  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. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 00:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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