野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18528|回复: 8

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

[复制链接]
发表于 2014-7-22 21:12:26 | 显示全部楼层 |阅读模式
因为我将野火的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. }
复制代码
回复

使用道具 举报

发表于 2014-7-22 21:14:27 | 显示全部楼层
emWin的GUI_Delay函数会调用重绘操作的,你是不在某个任务把这个函数删除了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 21:15:32 | 显示全部楼层
房宜楠 发表于 2014-7-22 21:14
emWin的GUI_Delay函数会调用重绘操作的,你是不在某个任务把这个函数删除了?

可是在运行的过程中是没有这个函数的,你看上面的函数
回复 支持 反对

使用道具 举报

发表于 2014-7-22 21:16:03 | 显示全部楼层
GUI_Delay函数,emWin在这个时候会调用它的重绘进程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-22 21:19:12 | 显示全部楼层
巢易白 发表于 2014-7-22 21:16
GUI_Delay函数,emWin在这个时候会调用它的重绘进程

可是demo运行的过程还没有到达GUI_Delay这步,永远不会,因为里面是个循环。我放个LED灯亮在GUI_Delay前面,可是他没有亮,说明永远都不会达到这个GUI_Delay,难道里面有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. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-23 09:41:49 | 显示全部楼层
各位都理解错了,详细的答案看http://www.amobbs.com/thread-5588807-1-1.html
回复 支持 反对

使用道具 举报

发表于 2014-7-23 10:22:13 | 显示全部楼层
12ycli 发表于 2014-7-23 09:41
各位都理解错了,详细的答案看http://www.amobbs.com/thread-5588807-1-1.html

重绘就是在guidelay完成的,guidelay靠系统的systick实现,估计你是没有移植野火stm32f10xit.c文件里的中断服务函数~
回复 支持 反对

使用道具 举报

发表于 2014-7-23 10:28:51 | 显示全部楼层
12ycli 发表于 2014-7-22 21:19
可是demo运行的过程还没有到达GUI_Delay这步,永远不会,因为里面是个循环。我放个LED灯亮在GUI_Delay前面 ...

你要分清GUI_delay和os的delay,你帖出的这段程序while循环里的是os的delay,跟gui的不一样。

在GUIDEMO_MAIN函数里会有很多GUI_Delay函数,GUI_Delay函数会调用到GUI_Exec 进行重绘。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-23 15:15:30 | 显示全部楼层
红舒扬 发表于 2014-7-23 10:28
你要分清GUI_delay和os的delay,你帖出的这段程序while循环里的是os的delay,跟gui的不一样。

在GUIDE ...

谢谢,现在清楚了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-2 19:53 , Processed in 0.032689 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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