硬汉嵌入式论坛

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

[emWin] 触摸到ucosiii到emwin的消息机制相关问题

[复制链接]

16

主题

45

回帖

93

积分

初级会员

积分
93
发表于 2017-3-2 17:13:43 | 显示全部楼层 |阅读模式
做了一段时间的ucosiii+emwin的代码。底层是原来别人移植的。自己由于时间关系一直都没有仔细去学习底层。一直把上层开发弄好。
直到最近才可以学习和分析这方面的问题。

看了和找了挺多资料,我们群里的,论坛的大神都在搞gui和ucos,就是没有找到这些资料。
1、当触摸按下的时候,我们通过Touch_SCAN进行扫描,这个可以放在1ms的任务当中进行处理。
2、当检测有效的触摸按下的时候,我们通过GUI_PID_StoreState();这个函数的调用将触摸的坐标,已经点击的消息传递过去。
3、查看了下GUI_PID_StoreState这个函数的源码发现。

/*********************************************************************
*
*       GUI_PID_StoreState
*/
voidGUI_PID_StoreState(const GUI_PID_STATE *pState) {
  _PID_Load();
  if (memcmp(&_State, pState,sizeof(_State))) {
    _State = *pState;
    GUI_X_SIGNAL_EVENT();
  }
}
做了一个比较赋值操作,另外还发送了一个事件的信号量。


直到这里,我们只是做了两个步骤。
a、检测到按下的坐标存放在_State里面。
b、发送了一个事件信号量进行同步。


可以想想得到这个时间信号量肯定是发送给GUI的显示任务的。
对于我们设计ucos+gui的方式的,一般触摸是一个快速的任务A,比如我这里是1ms的任务。显示刷新是一个低速的任务B,比如我们可以100ms设置更长,而且优先级还比较低。
这个事件的信号量肯定是从A发出,发送到B任务,相当于用来与B任务同步用的。
以上的过程简单的描述为以下几种状态。
A任务-----》检测到触摸按下有效---------》 发送事件信号量(触摸时间_WM_Touch) 《------------------B任务


那对应到GUI_X_OS这里面的文件的函数呢。
GUI_X_SignalEvent这个函数是用来发送或者释放事件的。也就是GUI_PID_StoreState内部调用的发送的函数。
那么可以猜想EMWIN内部肯定有个函数需要调用GUI_X_WaitEvent这个等待时间的函数用来等待信号量释放。


所以,我们在GUI_X_OS内部,定义了一个事件信号量。在GUI_X_SignalEvent里面发送了这个信号量
在GUI_X_WaitEvent中设置了挂起等待信号量。
有了上面的基础,我们接下来是否开始联想下,emwin当中肯定是调用了GUI_X_WaitEvent这个等待信号量的函数。
那么会在哪个函数调用呢。


从我自己的例子而言,我在gui里面只是执行了GUI_ExecDialogBox这个函数。
那就说明GUI_ExecDialogBox里面必须有等待信号量的函数。
问题①那么问题来了。接下来GUI_ExecDialogBox内部到底是怎么处理我们的界面,我们的回调,我们的各种事件呢?其实我也没有搞明白,所以来咨询各位大神了。


还有就是我们在GUI_X_OS内部,还定义了一个显示刷新的信号量,而且这个信号量的初值为1.
GUI_X_Lock就是对应的等待信号量的函数,GUI_X_Unlock就是释放或者发送信号量的函数。
对应于我的程序执行,我上电开机第一次的时候,发现其实没有触摸的时间,GUI也会刷新一次。那我再想是不是因为这个显示信号量为1的原因呢。
问题②那么问题来了。接下来如果是我想的这样,那么这个信号量与上面的信号量有什么区别呢。如果我想除了有触摸事件的时候刷新下或者响应下GUI的。我还想定时的去刷新gui
是否可以利用这个信号量呢?还请大神们指导











回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117617
QQ
发表于 2017-3-3 09:32:28 | 显示全部楼层
1.  这个早期的3.xx时代的代码对于这个GUI_PID_StoreState函数没有什么参考价值了,
      现在的GUI_PID_StoreState是个FIFO,底层没有调用到RTOS的signalevent,你可以在emWin的RTOS接口函数里面,这个地方加个断电测试下。

2。  这个比较好理解,就是二值信号量,起到互斥的作用,用于emWin多任务。
回复

使用道具 举报

16

主题

45

回帖

93

积分

初级会员

积分
93
 楼主| 发表于 2017-3-3 14:03:11 | 显示全部楼层

回 eric2013 的帖子

eric2013:1.  这个早期的3.xx时代的代码对于这个GUI_PID_StoreState函数没有什么参考价值了,
      现在的GUI_PID_StoreState是个FIFO,底层没有调用到RTOS的signalevent,你可以在emWin的RTOS接口函数里面,这个地方加个断电测试下。

2。  .. (2017-03-03 09:32) 
你好,其实我本来的出发点是想了解GUI_X_OS这里面的代码该怎么写的。
底层是别人移植好,我一直在用。所以,自己想摸索明白。

问题就是想:弄清楚,我检测到触摸后,通过GUI_PID_StoreState这个函数后,接下来是怎么动作的将消息通过ucosiii发送到显示的任务,然后显示任务又怎么处理这个消息然后开始刷新内容的。
另外就是,本身emwin回调函数内又是怎么刷新呢。比如我在回调函数内有个定时器100ms刷新以下数据,他这个100ms产生定时器时间与我触摸按下给他触发的时间是不是相同的机制。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-18 11:50 , Processed in 0.038309 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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