硬汉嵌入式论坛

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

[emWin] 关于emwin中Edit等控件所谓的“实时”显示

[复制链接]

56

主题

907

回帖

1075

积分

至尊会员

积分
1075
发表于 2018-4-14 16:38:02 | 显示全部楼层 |阅读模式
本帖最后由 roguebear 于 2018-4-14 17:18 编辑

看到论坛上一个帖子  [求助]STemwin中实时显示数据 [color=rgb(153, 153, 153) !important][color=rgb(153, 153, 153) !important][复制链接]        http://www.armbbs.cn/forum.ph ... 5%CA%B1%CF%D4%CA%BE
硬汉在里面也回答了去39章看。

我刚好之前一个项目一模一样,感觉显示慢了一点想升级一下,其实AD得到的值很快。然后我百度了一下
https://blog.csdn.net/freiheit_zz/article/details/71055858    按照这个帖子stepbystep  测试了一下。

这个帖子说的就是在桌面窗口创建一个定时器消息,我看了39章,方法是一样的。硬汉例子用的是100ms。  

我用iTest1, iTest2 都从0开始++,  然后显示,很简单
1: 用这种定时器方法,我设置了period是20, 也就是20ms,显示iTest1。
2: iTest2 另外弄了一个单独的任务,OSTimeDlyHMSM(0,0,0,20 ,OS_OPT_TIME_PERIODIC,&os_err);  也是20ms,然后在任务里面Edit_SetText. 这个也是我之前常用的。这样结构清晰,但是感觉发出Edit_SetText后,还要等任务切换到真正的显示
才会显示,并不是前后台那种,接下来没有中断的话马上就执行了。

执行后肉眼观察 。 iTest1和2增加的速度只和20这个period的值有关,  都是20,那么增加并且显示出来速度基本一致, 哪一个是10,哪一个就快一倍,以此类推。反正测试了好几十分钟,基本如此。

那么我的理解是不是窗口创建定时器的方法其实还是等时间切换,本质和edit_settext在另外任务里20ms切换一次一样的,并不是那种真正的实时!!
也就是数据一得到,马上就显示。 如果隔20ms,估计黄花菜都凉了额, 难道把定时器设置了2ms?那么更快?会不会搞死机啊。。别的啥也不用干了。。。


请硬汉帮忙看看。。。 在这种RTOS中用emwin,怎么来得到一个数,不要用定时器,而是马上显示它呢?
这里我又想到了。如果这样干,是不是也是一样啥也不用干了,就不停得到数,马上显示。死循环。
但是我们可以20ms采集数据一次,得到后马上显示这个数值之间没有停顿这20ms?

然后看到论坛上另外一个   [STemWin]GUI_DispStringAt如何在窗口小工具上实时显示文本?          http://www.armbbs.cn/forum.ph ... 5%CA%B1%CF%D4%CA%BE
感觉他的需求和我一样,
硬汉提出了一个方法。
用  GUI_DispString  , 这个函数放在WM_PAINT里面,  然后用WM_InvalidXXXXX 这三个函数来处理。
感觉这个需求就是我说的得到数据马上显示,中间没有停顿。但是问题又来了。这样没有Edit_SetText方便。可以控制格式啥的。

我的总结。1:创建 timer和任务里面显示本质一样的。 得到数值和实际显示之间是有个一间隔的。伪实时
2: 如果要前后台一样马上实时显示,可以用GUI_DispStringAt,但是挺麻烦的。

请教硬汉我的总结有什么问题么?  如果用Edit_SetText想“真正实时”,有招不? 现在已经离不开emwin的API了。





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-16 01:18:08 | 显示全部楼层
不还意思楼主,刚回复

楼主方便的话,你在emWin模拟器上面做个简单测试,我给你修改下,这样效率高些
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2018-4-16 08:40:27 | 显示全部楼层
本帖最后由 novice 于 2018-4-16 08:42 编辑

楼主的思路不对。
你要求20ms的显示速度有什么用?人的眼睛能够分辨20ms的刷新率吗?还不是被后面的数值冲掉了前面的数值?
正确的方法是用一个变量或文本缓冲区接收你的最新数值,让后面更新的数值覆盖前面的数值,然后开一个定时器定时刷新。
如果想效果最好,可以自己定制一个控件在WM_PAINT里面把数值显示出来。
想简单就用EDIT_SetValue/EDIT_SetText之类的API,省事但是效率不是最高。
emwin的EDIT_SetValue/EDIT_SetText之类的API效率不高是因为每次调用它都要把内容格式化一次,效率当然低了。

回复

使用道具 举报

56

主题

907

回帖

1075

积分

至尊会员

积分
1075
 楼主| 发表于 2018-4-16 20:11:16 | 显示全部楼层
eric2013 发表于 2018-4-16 01:18
不还意思楼主,刚回复

楼主方便的话,你在emWin模拟器上面做个简单测试,我给你修改下,这样 ...

16. emWin Simulation OK.rar (2.53 MB, 下载次数: 49)


硬汉请看。。都在WindowDLG.c 这个文件里面 有三处代码。

这个是录制的屏幕,只有一点点。      Video_2018-04-16_200754.wmv (21.38 KB, 下载次数: 47)



// USER START (Optionally insert additional static code)
//在最简单的模板上,   一共有3个地方修改

//第一处地方, giCounter加1,然后显示在Edit框内,看速度。
//另外一个是写在另外一个任务里面, 因为是vc模拟emwin,没有把ucos一起弄进来,所以就没有。
//很简单就是一个任务 20ms切换一次。里面执行Display这个函数,将giCounter2++, 然后显示在Edit2里面,来比较Edit和Edit2的变化速度。

#define DISP_TIMER                        100   /*  单位是ms , 改成1000ms一秒改一次, 可以改成20ms , 10ms等等*/

static unsigned int giCounter;


static void DISPLAY(WM_MESSAGE *pMsg)  
{  
    char Buf[5 + 1];   
       
    sprintf( Buf, "%d", giCounter++ );


        /*   这里giCounter增加后, 用Edit_SetText显示,其实不是马上显示出来, 是要等Timer  DISP_TIMER ms过后才会显示,
        比如DISP_TIMER改成1000, 会看到1秒才变化一次。
       
        目的: 是想一旦giCount的值发生变化,马上就在屏幕上的Edit框里面显示出来,类似前后台程序顺序执行一样。可以每隔若干ms giCount++,
        但是一旦giCount++,马上要在屏幕上显示。
       
        */
    EDIT_SetText( WM_GetDialogItem(pMsg->hWin, ID_EDIT_0) , Buf );
       
}
















  //第二处地方  这个是人工加入WM_TIMER
  case WM_TIMER:   

          DISPLAY(pMsg);           //更新Edit中   
          WM_RestartTimer(pMsg->Data.v, DISP_TIMER );      //DISP_TIMERms 重开一次timer
        break;   











  //第三处地方 创建Timer
  WM_CreateTimer(WM_GetClientWindow(hWin), 0, DISP_TIMER, 0);        //添加此段  




回复

使用道具 举报

56

主题

907

回帖

1075

积分

至尊会员

积分
1075
 楼主| 发表于 2018-4-16 20:17:06 | 显示全部楼层
novice 发表于 2018-4-16 08:40
楼主的思路不对。
你要求20ms的显示速度有什么用?人的眼睛能够分辨20ms的刷新率吗?还不是被后面的数值冲 ...

hi novice. 原本这个项目是用的数码管。数值变化很快,但是人眼的确能够分辨。要的就是这种效果。。
你说的缓冲然后显示最新考虑过,但是这样会造成操作人员和实际有一个“延迟”,能用但是给人一种怪怪的感觉。。。

最省事当然是Edit,但是就是不是“实时,马上显示”。 跟格式化关系倒不大。是因为它的原理是靠定时器去刷。

你说的定制控件然后用WM_PAINT, 不知道是不是数值变化和实际显示还是靠“消息”来驱动的。如果是靠消息,很有可能不能实时。

最终需求就是:  Edit_SetText能够像前后台那样马上就显示出来。
回复

使用道具 举报

6

主题

231

回帖

249

积分

高级会员

积分
249
发表于 2018-4-16 22:44:53 | 显示全部楼层
本帖最后由 novice 于 2018-4-16 22:47 编辑

我给你一些建议:
1、人机界面是极少需要实时性的,因为刷新太快了人眼分辨不出,在你的例子里面你无需太过在意实时性,更新速度可以在40ms-100ms之间。
2、在你的例子里面如果仅仅是显示文本而不需要编辑,你应该使用Text控件(TEXT_Create/TEXT_SetText之类的API),TEXT控件比EDIT控件速度快多了。
3、在ucgui/emwin里面用定时器要小心,因为ucgui/emwin没有消息队列,定时器消息是硬件中断直接call过来的,事务处理耗时太长的话会导致中断不能及时重开。
static int s_value = 0;
void UpdateValue(int value)
{
        // 利用变量缓存数值,不用每次更新数值的时候都立即反映到界面上。
        // 在利用定时器定时把这个数值刷新到界面上,让用户感受到数值在不断变化就行了,无需在意是不是实时。
        s_value = value;
}

static void DISPLAY(WM_MESSAGE *pMsg)  
{  
        static HWND hText = NULL;
        char buf[16];   
        // 简单整数转换成文本用itoa比sprintf的速度快多了。
        //    sprintf(buf, "%d", s_value);
        itoa(s_value, buf, 10);
        if (hText == NULL)
        {
                // WM_GetDialogItem是性能杀手,因为它搜索子窗口的时候会在内存不同的位置跳跃,
                // 有可能会迫使MCU内部的D_CACHE重载,从而损失性能。
                // 而且搜索是线性的,耗时是O(n),要优化这种搜索操作。
                hText = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
        }
        // 用TEXT_SetText比EDIT_SetText更快。
        TEXT_SetText(hText, buf);
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-17 00:48:56 | 显示全部楼层
roguebear 发表于 2018-4-16 20:11
硬汉请看。。都在WindowDLG.c 这个文件里面 有三处代码。

这个是录制的屏幕,只有一点点。      ...

不要用emWin的多任务,也就是在另一个任务里面调用EDIT的API进行更新。
你想另一个任务里面的数据发生变化后立即能够在GUI上得到响应的话,给emWin任务发送emWin的自定义回调消息即可,非常方便。
回复

使用道具 举报

56

主题

907

回帖

1075

积分

至尊会员

积分
1075
 楼主| 发表于 2018-4-18 19:09:14 | 显示全部楼层
novice 发表于 2018-4-16 22:44
我给你一些建议:
1、人机界面是极少需要实时性的,因为刷新太快了人眼分辨不出,在你的例子里面你无需太 ...

收到!细节非常干货!
回复

使用道具 举报

56

主题

907

回帖

1075

积分

至尊会员

积分
1075
 楼主| 发表于 2018-4-18 19:10:04 | 显示全部楼层
eric2013 发表于 2018-4-17 00:48
不要用emWin的多任务,也就是在另一个任务里面调用EDIT的API进行更新。
你想另一个任务里面的数据发生变 ...

不是很懂  帮忙给点关键字或者哪一章可以不。我目前找都不知道该找什么关键字。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107439
QQ
发表于 2018-4-19 02:17:26 | 显示全部楼层
roguebear 发表于 2018-4-18 19:10
不是很懂  帮忙给点关键字或者哪一章可以不。我目前找都不知道该找什么关键字。。。

新版emWin教程的自定义回调函数章节:
http://www.armbbs.cn/forum.ph ... 9834&extra=page%3D1

QQ截图20180419021446.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 19:25 , Processed in 0.268290 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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