硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5064|回复: 7
收起左侧

[emWin] emwin回调函数中使用GUI_DispStringInRect的问题

[复制链接]

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2021-6-29 11:19:46 | 显示全部楼层 |阅读模式
本帖最后由 WSTON 于 2021-6-29 12:37 编辑

项目中在button中绘制内容,发现跑一段时间总会卡,用SERRGER Handler分析发现总是卡在 button回调函数中的GUI_DispStringInRect函数。然后自己另外创建一个新的测试窗口,发现还是会卡,不知道哪里写错啦,我这边用的是H7,裸跑,跑了不到一分钟就死机进入硬件中断了,还是卡在回调函数中的GUI_DispStringInRect函数。也试过把定时器时间改为100ms,问题依旧。请教各位好汉!

  1. #include "DIALOG.h"

  2. #define ID_WINDOW_0            (GUI_ID_USER + 0x00)
  3. #define ID_BUTTON_0            (GUI_ID_USER + 0x01)
  4. #define ID_BUTTON_1            (GUI_ID_USER + 0x02)
  5. #define ID_BUTTON_2            (GUI_ID_USER + 0x03)
  6. #define ID_BUTTON_3            (GUI_ID_USER + 0x05)

  7. #define ID_TIMER            (GUI_ID_USER + 0x06)



  8. int testCnt;


  9. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  10.   { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
  11.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 0, 0, 400, 240, 0, 0x0, 0 },
  12.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_1, 400, 0, 400, 240, 0, 0x0, 0 },
  13.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_2, 0, 240, 400, 240, 0, 0x0, 0 },
  14.   { BUTTON_CreateIndirect, "Button", ID_BUTTON_3, 400, 240, 400, 240, 0, 0x0, 0 },
  15. };

  16. static void _cbTBT(WM_MESSAGE * pMsg)
  17. {
  18.         char disbuf[50];
  19.         GUI_RECT rect = {0, 0, 0, 0};
  20.         rect.x1 = WM_GetWindowSizeX(pMsg->hWin);
  21.         rect.y1 = WM_GetWindowSizeY(pMsg->hWin);
  22.         
  23.         switch (pMsg->MsgId)  
  24.         {
  25.                 case WM_PAINT:
  26.                 {                                
  27.                         GUI_SetFont(GUI_FONT_32B_ASCII);
  28.                         switch(WM_GetId(pMsg->hWin))
  29.                         {
  30.                                 case ID_BUTTON_0:
  31.                                         memset(disbuf, 0, sizeof(disbuf));
  32.                                         sprintf(disbuf, "Button0 %d", testCnt);  
  33.                                         GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
  34.                                         GUI_SetFont(GUI_FONT_32B_ASCII); //test code  wait for breakpoint
  35.                                 break;        

  36.                                 case ID_BUTTON_1:
  37.                                         memset(disbuf, 0, sizeof(disbuf));
  38.                                         sprintf(disbuf, "Button1 %d", testCnt*2);  
  39.                                         GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
  40.                                         GUI_SetFont(GUI_FONT_32B_ASCII); //test code  wait for breakpoint
  41.                                 break;
  42.                                                 
  43.                                 case ID_BUTTON_2:
  44.                                         memset(disbuf, 0, sizeof(disbuf));
  45.                                         sprintf(disbuf, "Button2 %d", testCnt + 10);  
  46.                                         GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
  47.                                         GUI_SetFont(GUI_FONT_32B_ASCII); //test code  wait for breakpoint
  48.                                 break;        
  49.                                 
  50.                                 case ID_BUTTON_3:
  51.                                         memset(disbuf, 0, sizeof(disbuf));
  52.                                         sprintf(disbuf, "Button3 %d", testCnt + 20);  
  53.                                         GUI_DispStringInRect(disbuf,&rect, GUI_TA_VCENTER|GUI_TA_HCENTER);
  54.                                         GUI_SetFont(GUI_FONT_32B_ASCII); //test code  wait for breakpoint
  55.                                 break;        
  56.                         }
  57.                         
  58.                         break;
  59.                 }
  60.                
  61.                 default:
  62.                         BUTTON_Callback(pMsg);
  63.         }               
  64. }


  65. static void _cbDialog(WM_MESSAGE * pMsg) {
  66.   int NCode;
  67.   int Id;
  68.         GUI_HWIN hItem;

  69.   switch (pMsg->MsgId) {
  70.          
  71.         case WM_INIT_DIALOG:
  72.         {
  73.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
  74.                 WM_SetCallback(hItem, _cbTBT);
  75.                
  76.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1);
  77.                 WM_SetCallback(hItem, _cbTBT);
  78.                
  79.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2);
  80.                 WM_SetCallback(hItem, _cbTBT);
  81.                
  82.                 hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3);
  83.                 WM_SetCallback(hItem, _cbTBT);
  84.                
  85.                 WM_CreateTimer(pMsg->hWin, ID_TIMER, 100, 0);
  86.                 break;
  87.         }
  88.         
  89.         case WM_TIMER:
  90.         {
  91.                 int timerId = WM_GetTimerId(pMsg->Data.v);
  92.                
  93.                 if(timerId == ID_TIMER)
  94.                 {
  95.                         testCnt++;
  96.                         WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0));
  97.                         WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_1));
  98.                         WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_2));
  99.                         WM_InvalidateWindow(WM_GetDialogItem(pMsg->hWin, ID_BUTTON_3));
  100.                         WM_RestartTimer(pMsg->Data.v, 100);
  101.                 }               
  102.                  
  103.         break;
  104.         }
  105.          
  106.   
  107.   default:
  108.     WM_DefaultProc(pMsg);
  109.     break;
  110.   }
  111. }

  112. WM_HWIN CreateWindow(void) {
  113.   WM_HWIN hWin;

  114.   hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  115.   return hWin;
  116. }




  117. /*************************** End of file ****************************/
复制代码



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-6-29 12:08:58 | 显示全部楼层
这个是什么情况
QQ截图20210629120852.jpg
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-6-29 12:39:09 | 显示全部楼层

哎呀,不好意思,后面修改的时候比较着急,写错了,改回来  { BUTTON_CreateIndirect, "Button", ID_BUTTON_3, 400, 240, 400, 240, 0x0, 0 },是可以跑的
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-6-29 16:00:51 | 显示全部楼层
不知道是不是底层的原因,有人跑一下吗,直接复制粘贴就可以跑, 看会不会出现跟我一样的问题,卡在GUI_DispStringInRect()这个函数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-6-30 09:50:04 | 显示全部楼层
WSTON 发表于 2021-6-29 16:00
不知道是不是底层的原因,有人跑一下吗,直接复制粘贴就可以跑, 看会不会出现跟我一样的问题,卡在GUI_DispS ...

昨天我就帮你测试了。

你楼主的代码复制就可以跑,修改下button3的坐标值就没问题
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-6-30 10:10:50 | 显示全部楼层
eric2013 发表于 2021-6-30 09:50
昨天我就帮你测试了。

你楼主的代码复制就可以跑,修改下button3的坐标值就没问题

噢噢,谢谢汉哥。我想,主要问题是跑一段时间会卡住。我想可能是底层的问题。我又测试了几次,本来的工程总是跑到计算800左右就卡住,后面我去掉emwin自带的横屏函数之后能够跑到一万+了。。。我本来的工程是需要用到emwin的GUI_SetOrientationEx()去设置横屏的(H7 ltdc RGB屏用SDRAM作为显存实在不知道如何通过底层修改为横屏,因为这里是直接提供整个屏幕从头到尾的显存,没有打点的操作)。这样就必须面临使用GUI_SetOrientationEx()带来的问题了

可以总结一下就是使用emwin的GUI_SetOrientation()设置横屏确实会带来一些意想不到的问题
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-7-1 08:35:27 | 显示全部楼层
我想我找到了卡住的原因,首先用了GUI_SetOrientation(),emwin增加了很大负担,刷频效率也肯定是打了个打折扣,然后在刷新界面的时候使用的刷新频率也就是无效化窗口的频率比较高,导致了emwin刷频负担更大。最终我是把项目里面的定时无效化频率调低了才能正常稳定运行,之后测试了几次能够跑很长时间都不出现死机的情况。(此外,发现之前的eminw死机仅仅是emwin自身死机,H7的硬件定时器仍在做指示灯的闪烁操作)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-7-1 10:40:40 | 显示全部楼层
WSTON 发表于 2021-7-1 08:35
我想我找到了卡住的原因,首先用了GUI_SetOrientation(),emwin增加了很大负担,刷频效率也肯定是打了个打折 ...

优化下程序实现也很有必要。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-20 16:08 , Processed in 0.380674 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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