MTK之event机制

合集下载

freertos event机制

freertos event机制

freertos event机制
FreeRTOS中的事件机制是一种多任务同步方法,用于一个任务依赖于另一个任务的完成。

该机制基于事件标志组(Event Flag Group),任务可以等待一个或多个事件标志的设置,并在某个或某些事件标志被设置时继续运行。

FreeRTOS中提供了以下API函数来实现事件机制:
1. `xEventGroupCreate()`: 创建一个事件标志组,返回一个事件标志组的句柄。

2. `vEventGroupDelete()`: 删除一个事件标志组。

3. `xEventGroupSetBits()`: 设置一个或多个事件标志的位。

4. `xEventGroupClearBits()`: 清除一个或多个事件标志的位。

5. `xEventGroupGetBits()`: 获取当前事件标志组中的位状态。

6. `xEventGroupWaitBits()`: 等待一个或多个事件标志的位被设置。

使用事件机制的步骤如下:
1. 创建一个事件标志组,并获取句柄。

2. 创建需要等待事件完成的任务。

3. 在任务中使用`xEventGroupWaitBits()`函数等待需要的事件标志位被设置。

4. 其他任务在适当的时候使用`xEventGroupSetBits()`函数设置事件标志位。

5. 当事件完成时,被等待的任务将继续运行。

需要注意的是,在使用事件机制时,任务需要在等待事件标志位被设置之前调用`xEventGroupClearBits()`函数以确保事件标志位的初始状态。

此外,事件标志组可以用于其他同步机制,如信号量和消息队列。

5、Android Event详解

5、Android Event详解
时间:2012/12/19 作者:汪文君
主要内容大纲
Handler消 息传递 响应系统 设置的事 件处理
基于回调 的事件处 理 基于监听 的事件处 理
Android 事件概述
Android事件机制概述
之前学习了很多关于Android的组件技术,但是所有的
组件必须有与之对应的动作,因此在本ppt中将重点讲 解一下android的事件机制 Android的事件机制大致可以分为如下几类
基于事件机制的事件处理(IV)
Java代码
基于事件机制的事件处理(V)
程序发布后的效果
程序的事件处理非常之简单,只不过是将TextView和
Button的Text进行了互换,通过这个简单的例子我们 可以得出如下几种角色的扮演
事件源:button
事件:点击 事件监听器:MyListener
内部类实现事件监听(I)
如下代码所示就是采用内部类的形式
匿名内部类实现事件监听(I)
如下代码所示就是采用匿名内部类的形式
外部类实现事件监听(I)
如下代码所示就是采用外部类的形式
直接绑定到标签方式(I)
这种方式使用也不是很多见,再说也不能将每个组件
的各种事件都涵盖,并且不够灵活,但是有些时候使 用它也不失为一种策略 组件配置文件:
直接绑定到标签方式(II)
Java代码
直接绑定到标签方式(III)
发布后的效果如下所示
使用Activity作为事件监听
Java代码
基于回调的事件处理(I)
真如前面所和事件处理是一个整体,也就是说没有了事件监 听器的存在,这种方式我本人非常的不喜欢,因为组 件本身所承担的事情着实有些太多,耦合度比较高, 因此大多数情况下还是使用事件监听的方式来进行事 件处理 实战回调事件处理

MTK工具开发简介

MTK工具开发简介

然后点Install…完成该控件的安装,之后 META就可以编译通过了。
DEBUG和RELEASE模式
在C++ Builder的“Project->Options>Compiler”下可以选择:
PhoneSuite的编译 1. 需要安装Visual C++ 6.0 SP6 以上版本。 2. 需要安装htmlhelp.exe。
2.2 与手机通信的底层库
BROM.DLL:负责与手机启动时的握手协议。 META.DLL:负责与手机通信。 META-LAB:TX/RX/AFC控制、NVRAM读写、铃声测 试;不需仪器支持,用于开发。 META-FACTORY:产线RF校准。 SLA_Challenge.dll:安全认证的库。
MTK工具开发简介
2010-1-21
提要
1. 2. 3. 4. 开发环境及编译 META及其通信原理 工具开发基础知识 PhoneSuite及通信原理
1.1 开发环境
Meta系列(包括META、Flash Tool、 Multiport Download Tool及其他):C++ Builder,使用META库来连接和通信。 串口工具(如Catcher和PhoneSuite): Visual C++,使用串口通信API和AT命令 开发。 InstallShieldXExpress:安装程序制作 Autoplay Media Studio:制作启动光盘
设置事件 p_WriteOver_Event
往手机里写入一项NVRAM值
1. 在按下“写入”键后,首先判断NVRAM是否已经初始化完成,如 果没有,则调用frmMainSel->mnuFDMDatabaseClick(Sender);如 果程序是先读后写,这步可以省略。 2. 使用META_NVRAM_SetRecFieldValue对m_pcsecBuf里的值进行 修改。 3. 定义回调函数NVRAMMan->ConfirmCallback。 4. 调用NVRAMMan的REQ_WriteNVRAM_Start ()函数从手机读数据, 并等待回调函数的writeover事件。 5. 如果writeover事件在预定时间内发生则读取成功,否则提示失败。

MTK_timer

MTK_timer

小结一:MTK timer 有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer 的身影。

一、KAL的timerKAL timer是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,也就是说,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service Routine)),这个中断会回调注册的回调函数。

所以这种timer 使用时,要比较小心,它的优先级很高,在回调函数运行时,其他事件是得不到处理的。

//创建一个timer,参数是timer的名字kal_timerid kal_create_timer(kal_char* timer_name_ptr); void//设置timer 超时时间, timer_id 是 create 返回值,handler_func_ptr是回调函数,handler_param_ptr 是回调函数返回的参数(一般回调函数都是这么设置,这样很灵活),delay,是超时时间,注意这个参数的单位是ticks 不是ms。

reschedule_time 表示是否循环使用timer,0 表示 timer 超时一次就停止,1 表示自动循环启动timer。

kal_set_timer(kal_timerid timer_id, kal_timer_func_ptrhandler_func_ptr, void* handler_param_ptr, kal_uint32 delay, kal_uint32 reschedule_time);二、stack timer这种timer 与 KAL timer 最大的区别是:stack timer 超时后,发送一个超时消息到相应task的消息队列,由task的消息队列来处理这个消息,而不像KAL timer,直接在中断状态回调注册函数。

C++Event机制的简单实现

C++Event机制的简单实现

C++Event机制的简单实现 C++ Event Model⼀事件模型 对发⽣的事件作出的响应——事件模型。

1 事件: 在⾯向对象中,就是对象的属性或者状态发⽣了变化,操作或者接收到了某些动作时,向外发出了这种变化或者动作对应的通知。

2 事件模型包括的元素:3 事件模型过程:⼆代码实现1 EventManager/*----------------------------------------------------------------*//* class Object 响应事件函数的类必须是从Object派⽣下来 *//*----------------------------------------------------------------*/class Object{};/*----------------------------------------------------------------*//* class Event 模板参数为返回类型和响应函数参数类型 *//* 仅实现⼀个参数的事件响应函数 *//*----------------------------------------------------------------*/template<typename rtnTtpe,typename ArgType>class Event{//使每个事件最多关联响应的函数个数#define EVENT_LIST_MAX_NUM (10)typedef rtnTtpe (Object::*pMemFunc)(ArgType arg);public:Event(){m_totalFunc = 0;m_obj = NULL;for (int i = 0; i < EVENT_LIST_MAX_NUM; i++){m_func[i] = NULL;}}//关联回调成员函数template <class _func_type>void associate(Object *obj, _func_type func){m_obj = obj;m_func[m_totalFunc] = static_cast<pMemFunc> (func);m_totalFunc++;}//删除事件关联回调成员函数template <class _func_type>void disAssociate(Object *obj, _func_type func){if (obj != m_obj){return;}//查找for (int i = 0; i < m_totalFunc; i++){if (m_func[i] == func){break;}}//移动删除for (i ; i < m_totalFunc - 1; i++){m_func[i] = m_func[i + 1];}m_func[i] = NULL;m_totalFunc --;}//执⾏关联的回调函数void sendEvent(ArgType arg){for (int i = 0; i < m_totalFunc; i++){if (m_func[i] != NULL){((m_obj->*pMemFunc(m_func[i])))(arg);}}}private:Object* m_obj;pMemFunc m_func[EVENT_LIST_MAX_NUM];int m_totalFunc;};2 测试代码/*----------------------------------------------------------------*/ /* class TestEvent *//*----------------------------------------------------------------*/ class TestEvent{public:void test(){//do somsthing//……//触发事件myEvent.sendEvent(100);myEvent.sendEvent(200);}public://定义事件Event<bool,int> myEvent;};/*----------------------------------------------------------------*/ /* class TestClass *//*----------------------------------------------------------------*/ class TestClass:public Object{public:TestClass(){//关联事件m_event.myEvent.associate(this,&TestClass::executeCb1); m_event.myEvent.associate(this,&TestClass::executeCb2); }//事件响应函数bool executeCb1(int result){cout<<"executeCb1 result = "<<result<<endl;return true;}//事件响应函数bool executeCb2(int result){cout<<"executeCb2 result = "<<result<<endl;return true;}void execute(){m_event.test();}void stop(){//删除事件关联函数m_event.myEvent.disAssociate(this,&TestClass::executeCb1); }private:TestEvent m_event;};int main(){TestClass testObj;testObj.execute();testObj.stop();testObj.execute();return0;}3 输出结果<---------------first begin---------------executeCb1 result = 100executeCb2 result = 100executeCb1 result = 200executeCb2 result = 200---------------after delete---------------executeCb2 result = 100executeCb2 result = 200。

thinkphpevent原理

thinkphpevent原理

thinkphpevent原理ThinkPHP是一个基于PHP开发的轻量级、简单易用的开发框架,提供了丰富的功能和灵活的扩展机制。

其中一个重要的扩展机制就是事件(Event)。

事件(Event)是一种在特定情况下触发和响应的机制。

ThinkPHP的事件机制允许我们在特定的时间点触发事件,并在事件发生时执行注册的事件监听器(Listener)。

事件机制的原理主要涉及三个主要组件:事件(Event)、事件管理器(EventManager)和事件监听器(Listener)。

1. 事件(Event):事件是指在特定条件下发生的动作或状态变化,它是整个事件机制的核心。

在ThinkPHP中,事件通常以字符串表示,整个应用程序中的事件都会触发相应的事件。

2. 事件管理器(EventManager):事件管理器是整个事件机制的核心组件,它负责管理和调度事件的触发和监听。

ThinkPHP的事件管理器提供了事件的注册、触发和监听功能。

当事件触发时,事件管理器会根据注册的事件监听器,依次执行相应的事件监听器。

事件管理器主要提供以下方法:- register(:注册事件监听器。

- trigger(:触发事件。

- listen(:监听事件。

- hasListener(:判断是否有对应的事件监听器。

3. 事件监听器(Listener):事件监听器是实际执行事件响应逻辑的地方。

每个事件可以有多个事件监听器,事件管理器会根据注册的顺序依次执行事件监听器。

事件监听器可以是一个回调函数,也可以是一个类的方法。

当事件触发时,事件监听器将按照注册顺序依次执行。

通过上述三个组件的配合,ThinkPHP的事件机制实现了事件的触发和监听。

可以简单地描述为以下几个步骤:1.注册事件监听器:在应用程序中,我们需要注册事件监听器,告诉事件管理器当特定事件发生时应该执行的行为。

2.触发事件:当特定情况下,我们可以通过事件管理器触发相应的事件。

3.执行事件监听器:事件管理器会根据注册的事件监听器的顺序依次执行相应的事件监听器。

RIL层源码分析

RIL层源码分析

RIL层源码分析@杜少峰写在前面 (1)从Main函数开始的故事 (1)一、Event机制 (3)1.1、Event框架 (3)1.2、EventLoop的搭建过程 (5)1.2.1、Event初始化过程 (5)1.2.2、Event循环的过程 (5)二、reference库的加载 (7)2.1、reference中readerLoop建立和循环过程 (7)2.2、URC消息处理流程 (9)2.3、非URC消息处理流程 (12)三、一个完整的过程 (14)3.1、Eventloop把RILJ命令发送给reference库 (14)3.2、reference将Eventloop的数据发送到Modem (18)3.3、reference通过readerLoop得到Modem回应后把数据返回给Eventloop (22)3.4、Eventloop把数据返回给RILJ (26)四、一些重要概念 (29)4.1、s_commandcond (29)4.2、s_unsolResponses (30)4.3、RequestInfo (30)写在前面1、本文是基于Android原生代码展开的分析。

而MTK只是在此框架上做了双卡的补充(差别不大)。

2、本文从宏观的角度去分析问题,因此忽略了一些非主线的函数。

3、同理,对于函数内部非主要的逻辑部分,也采取了省略。

4、受限于知识的积累和理解能力,文中描述如有分析不妥之处,希望能够得到大家更正。

从Main函数开始的故事Android的智能机架构是应用处理器+基带芯片,也就是AP+Modem的模式,AP部分相当于CPU,Modem相当于网卡,而且每个厂商使用的Modem都有可能不一样。

每种通讯协议如GSM/CDMA又有很大的不同,为了将所有的Modem抽象为统一的模式,因此Android搭建了RIL(Radio Interface Layer)层。

在这个层的下面,每个厂商可以有自己不同的实现方式,但是经过RIL层协议的转换,就将所有的Modem抽象为统一的对象向上层负责。

androidonTouchEvent处理机制总结(必看)

androidonTouchEvent处理机制总结(必看)

androidonTouchEvent处理机制总结(必看)项⽬中总会⽤到⼀些触摸事件,每次使⽤都是百度各种资料,看各种⼤神的分析笔记。

这次我⾃⼰总结下关于触摸事件的⼀些知识点。

⼀来可以让⾃⼰对触摸事件印象更加深刻,也给以后的项⽬做⼀个参考。

最难理解的其实是onTouchEvent⽅法。

⼀、概述1.只有view,ViewGroup,Activity 具有事件分发和消费的功能。

2.Activity因为上最先接触到触摸事件,因此Activity没有事件拦截⽅法。

即没有dispatchTouchEvent⽅法。

3.对于不能添加⼦控件的view,不能对事件进⾏分发和拦截,它只有onTouchEvent事件。

⼆、三个⽅法1.public boolean dispatchTouchEvent(MotionEvent ev)当触摸事件发⽣的时候,⾸先会被当前的activity进⾏分发,即当前activity的dispatchTouchEvent⽅法会被执⾏。

这个时候,该⽅法有三种返回的情况:return false:表明事件不会被进⾏分发。

事件会以冒泡的⽅式被传递给上层的view或activity的onTouchEvent⽅法进⾏消费掉。

return true:表明该时间已经被处理。

事件会被当前view或activity的dispatchTouchEvent给消费掉。

不会再进⾏传递,事件到此结束。

return super.dispatchTouchEvent(ev):表明该事件将会被分发。

此时当前View的onIntercepterTouchEvent⽅法会捕获该事件,判断需不需要进⾏事件的拦截。

2.public boolean onInterceptTouchEvent(MotionEvent ev)该⽅法⽤户拦截被传递过来的事件,⽤于判断被传递过来的事件是否需要被当前的view进⾏处理。

return false :不对事件进⾏拦截,放⾏该事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MTK之event机制
event机制是mtkfeaturephone平台10a代码里面的最重要的机制之一.当某一个函数或者功能模块post或者send一个event之后,相关的就收函数就会去接收这个event然后做出相关的动作。

问题是:我们自己如何使用事件机制?如何定义事件并使其得到认可(即有效)?如何传递和接收?您可以通过以下步骤自己定义事件:首先,定义事件
在相关的.h文件中枚举自己的event例如:
#ifdef_uu____;hq______________{
fmradio_widget_state_external_none=0,fmradio_widget_state_external_play}fmradi o_widget_state_external_event;#endif
定义了两个事件,一个是FMradio_uuwidget_uu状态uuu外部uu无,一个是FMradio_uuwidget_uuuu状态uuuuu外部uuu播放,一般
fmradio_widget_state_external_none=0作为默认的event枚举的第一个,是无效的event,在此event枚举中有效的event是fmradio_widget_state_external_play。

二、事件验证
通过以下方式,主要是函数mmi_frm_init_event,来合法化自己定义的event。

例如如下代码:
mmi_uu事件uu结构事件;//定义事件结构
mmi_frm_init_event(&event,fmradio_widget_state_external_play);//将自己定义的event初始化到event结构体中,是自己定义的event得到有效化。

三、event的发送
自定义事件的目的是传递和接受功能所需的响应。

您可以通过以下方式将自己的事件传递给指定的接受函数:MMI_frm_uuupost_u事件((MMI_event_struct*)(&event),
wgui_fmply_widget_event_handler,null);//event的发出。

将event结构体的地址传给函数wgui_fmply_widget_event_handler,该函数就是event的接受函数,(可以自己实现)。

其中event结构体是第二步中的结构体,该结构体中有自己定义的event。

也可以发送MMI_uFRM_uu发送_uu事件(MMI_事件_结构*EVT、MMI_程序_funcproc、void*用户数据)。

Send和post只是两种不同的事件发送方法
所以第二步第三步的代码应该写在一起,如下所示:mmi_event_structevent;
mmi_uFRM_uu初始_uu事件(&event,fmradio_widget_state_external_play);
mmi_frm_post_event((mmi_event_struct*)(&event),wgui_fmply_widget_event_handler
,null);//或者用函数
mmi_frm_uuu发送_uuu事件,根据实际情况使用哪一个(post或send)。

关键之处就在于:寻找到合适的event发出点,也就是说在哪个地方发出自己需要的event,这是很重要的,否则达不到自己期望的效果。

也就是说以下代码
mmi_uu事件uuu结构事件;
mmi_frm_init_event(&event,fmradio_widget_state_external_play);
mmi_frm_uuu后事件((mmi_事件_结构*)(&event),wgui_fmply_uuu小部件uu
事件uu处理程序,null);//或者使用函数
mmi_frm_send_event,用哪一个根据实际(需要post还是send)情况决定。

添加到哪里很重要。

4、接受事件
第三步中函数wgui_fmply_widget_event_handler为接收函数,该函数可以自己定义。

mmi_uuWgui_uFmply_Uwidget_Uevent_Uhandler(mmi_Uevent_struct*evt){
switch(evt->evt_id){
casefmradio_uUwidget_Ustate_UExternal_UPlay:{
wgui_widget_fm_button_draw(&button[power_button]);//接收到
fmradio_widget_state_external_play之后要做出的动作,该函数也可自己实现
break;}default:break;}returnmmi_ok;}。

相关文档
最新文档