立即注册
查看: 708|回复: 9

[MTK软件经验分享] MTK平台架构分析:Framework启动流程/Queue/Event/History相关介绍

已绑定手机
发表于 2022-3-11 16:30:29 | 显示全部楼层 |阅读模式 来自 广东省深圳市
启动流程
●在InitApplication();函数中创建了几个线程,用这几个线程来模拟手机中的不同的任务线程。并且为这些任务创建了不同的消息队列。
●这些创建的线程中其中有一个是主要的,此线程的入口函数是MMI_task 。
●函数MMI_task主要完成的是不停的读取protocol task中的消息,然后根据消息和参数进行相应的处理函数 。
●在函数MMI_task里读取了消息后,用一个switch语句来选择处理方式 。
●当系统收到这个消息MSG_ID_MMI_EQ_POWER_ON_IND时候,系统根据当前系统的状态来决定启动的方式
●正常启动(用户按键盘启动)中首先调用了函数InitializeAll,这个是系统启动的初始化函数。
●接着函数InitNvramData,让一些需要读nvram的模块读出nvram中的数据,以此来初始化这些需要用到nvram中的数据来初始化的模块。
●初始化后调用函数fast_openscreen,这个函数就是系统启动后进入主屏幕的函数。
●在fast_openscreen里开始就播放开机动画及声音,点亮显示屏,并且设置好当开机画面播放完后需要执行的回调函数。当动画播放结束就直接调用此回调函数。
●最后进入EntryIdleScreen函数,这个函数就是程序的初始界面。并且在里面把左软键设置为进入主菜单,右软件设置为进入电话本
●到这里,一个启动过程总算结束了,以后的事情都交给注册好的事件响应函数和菜单响应函数去做。

Queue相关
●在InitApplication()时,我们创建不同的线程,同时创建不同的线程所对应的消息队列。
●全局数组task_info_g1是一个osl_task_info类型的数组,此类型有个成员变量task_ext_qid,它是oslMsgqid类型的。就是这个变量保存着消息队列指针。
●发消息函数OslIntMsgSendExtQueue向协议栈写入消息。这个函数向协议栈写入一个MYQUEUE类型的消息,这个消息是由用户自己定义的。
●操作接口函数:从队列中收消息OslReceiveMsgExtQ和向队列发消息OslMsgSendExtQueue,消息是一个MYQUEUE结构类型,它包含发出消息者和消息要到达的地方。
●一般来讲消息发起者和消息要到达的地方是Framework或者PROTOCO STACK/L4,前者发出消息让硬件执行某些操作,而后者的消息是硬件发出来的,需要软件来进行响应,比如按键按后需要执行的操作。
●MYQUEUE结构类型除了包含发起和接收者外,还包含消息类型号,用于指示消息的用途的,还有一个oslDataPtr指针,它是一些数据块的指针,指向响应函数需要用到的数据。

Event相关
●按照event对消息响应的不同,我们可以把它分为两大类:一类是对协议栈和硬件中断消息的响应,一类是对菜单高亮时和显示提示时进行消息响应。看这两类消息的来源,我们也可以说这两类事件分别响应的是硬件消息和软件消息。  
●协议栈和硬件中断event这类事件的管理主要是对两个结构数组的管理,也可以认为是两条链。它们的结构类型都只是包含了两个成员变量,一个是ID,一个是入口函数指针。这两个数组的名称分别是protocolEventHandler和interruptEventHandler。
●在发消息前往往常常会用到这个函数SetProtocolEventHandler。这个函数的作用是设置一个函数对某个硬件消息进行响应。
●道ExecuteCurrProtocolHandler函数完成了其响应过程。当有消息到时,有时还会有对应消息的ExecuteCurrProtocolHandler函数根据消息ID在两个数组中检索相应的响应函数指针,当检索得到函数指针后把参数MsgStruct传给函数指针让其去执行,这样就完成了对消息的响应过程。
●对菜单高亮和显示提示的消息响应的管理也是通过一个数组来完成的。这个数组是maxHiliteInfo,它是一个hiliteInfo结构类型,其中只包含两个响应函数入口地址,一个是菜单高亮显示时需要转到的入口,一个是提示出现时需要转入的入口。
●它和protocolEventHandler不同,它的结构里面不包含索引用的ID,而是以它的下标作为索引,而且都是以菜单资源的ID号来做下标。
●用SetHiliteHandler函数把菜单和菜单高亮显示执行的函数联系起来,这个函数就是这个作用,把自己定义的函数的地址赋值给以菜单ID为下标的项中的高亮显示入口地址。
●ExecuteCurrHiliteHandler(S32 hiliteid)函数完成了执行菜单高亮显示后的操作。不过,其参数不时菜单ID,而是当前菜单所在的兄弟菜单中的位置。

History相关
●History保存访问过的页面的信息。它保存的信息包括:访问过的屏幕的id,访问过屏幕的入口函数地址,访问过的屏幕的GUIBuffer,访问过的屏幕如果有输入框的话,还要保存输入框inputBuffer大小及内容。
●历史记录主要是靠数组historyData来管理的,它的类型是结构historyNode,这个结构包含了4个参数,屏幕ID,入口函数地址,GUIBuffer指针和InputBuffer指针。
●一般将要离开一个SCREEN的时候需要用到添加历史消息操作。
●在离开函数中添加历史记录常用函数是AddHistory,即AddHistoryReference函数,它把screenID,入口函数,GUIbuffer和Inputbuffer都保存起来 。
●在历史记录中还有个关键的东西,用来指示出当前最近的历史记录所在数组的下标。其实就是数组使用到的地方currHistoryIndex。这个全局变量起到很关键作用,在添加历史记录的时候这个全局变量+1。
●当程序要回到上一个屏幕时只要调用GoBackHistory,它调用ExecutePopHistory函数,此函数就执行把历史记录的currHistoryIndex-1,并且把保存的历史屏幕的入口函数再执行一遍。

游客,如果您要查看本帖隐藏内容请回复
已绑定手机
发表于 2022-3-11 18:26:45 | 显示全部楼层 来自 上海市
谢谢分享
发表于 2022-3-11 18:36:32 | 显示全部楼层 来自 上海市
谢谢分享
已绑定手机
发表于 2022-3-11 18:42:55 | 显示全部楼层 来自 上海市
谢谢分享
已绑定手机
发表于 2022-3-12 00:10:58 | 显示全部楼层 来自 广西梧州市
感谢分享
已绑定手机
已实名认证
发表于 2022-3-12 08:01:06 | 显示全部楼层 来自 广东省深圳市
多谢大老分享,学习一下。
已绑定手机
发表于 2022-4-16 12:09:56 | 显示全部楼层 来自 广东省深圳市
谢谢分享
已绑定手机
发表于 2022-4-16 13:54:51 | 显示全部楼层 来自 广东省深圳市
999999999999999999999
已绑定手机
发表于 2022-4-16 15:33:11 | 显示全部楼层 来自 山东省
感谢分享 嘻嘻
已绑定手机
发表于 2022-4-18 07:54:42 | 显示全部楼层 来自 北京市
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表