|
STM32F407上跑了emwin裸机程序,使用的是XTP2046电阻触摸屏,每10毫秒采集一次。当在界面连续点击GUI_ID_BUTTON0,会出现界面刷新变慢现象。
一开始以为是触摸采集的问题,所以我干脆在while(1)循环中模拟了触摸,代码如下。
上电开始的时候,界面还是可以比较正常的刷新,与while(1)中的延时一致,但执行到60次左右开始,刷新就比较慢了,大概要3~5秒刷新一次。
调试发现主要是卡在了GUI_Exec()这个函数,它执行的时间比较久,程序中我也加入了查看当前GUI内存使用的代码,我设置的是50K静态数组,
大概只用了10K左右。
有知道这个是什么原因的吗?
void main()
{
/*
* 初始化相关代码
*/
int count = 0;
int touch_times = 0; // 记录触摸次数
int gui_used_memory = 0; // 记录GUI当前使用内存
int gui_max_used_memory = 0; // GUI最大使用的内存
GUI_PID_STATE State;
State.x = 695;
State.y = 175;
while(1)
{
GUI_Delay(100);
used_memory = GUI_ALLOC_GetNumUsedBytes();
if(used_memory > max_used_memory)
max_used_memory = used_memory;
count++;
if(count == 5) // 触摸按下
{
touch_times++;
State.Pressed = 1;
GUI_PID_StoreState(&State);
}
else if(count >= 6) // 触摸释放
{
count = 0;
State.Pressed = 0;
GUI_PID_StoreState(&State);
}
}
}
/*界面中的回调函数*/
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_PAINT:
PaintDialog(pMsg); // 主要是刷新几条直线
break;
case WM_INIT_DIALOG:
InitDialog(pMsg);
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (Id)
{
case GUI_ID_BUTTON0:
if(NCode==WM_NOTIFICATION_RELEASED)
{
PROGBAR_SetValue(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0),0);
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT2), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT3), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT4), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT5), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT6), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT11), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT12), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT13), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT14), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT26), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT27), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT28), " ");
TEXT_SetText(WM_GetDialogItem(hWin, GUI_ID_TEXT29), " ");
WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON0));
WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON1));
WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON2));
WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON3));
WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_EDIT0));
GUI_Exec();
Delay_ms(5); // 纯粹的使用了for循环延时5毫秒
BeepOn(300); // 蜂鸣器响300毫秒
WM_EnableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON0));
WM_EnableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON1));
WM_EnableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON2));
WM_EnableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON3));
WM_EnableWindow(WM_GetDialogItem(hWin,GUI_ID_EDIT0));
GUI_Exec();
}
break;
default:
break;
}
default:
WM_DefaultProc(pMsg);
}
}
|
|