找回密码
 注册
搜索
查看: 2449|回复: 17

[讨论] 影响手机菜单的反应速度的因素?

[复制链接]
发表于 2005-10-17 20:10:00 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2005-10-18 09:48:00 | 显示全部楼层
<P>我也觉得应该和时序没关系,因为时序时间都是nS级别,除非你中间的等待时间太长了。</P><P>这个速度是不是和cpu处理速度,或者RAM速度有关系呢?</P>
点评回复

使用道具 举报

发表于 2005-10-18 10:18:00 | 显示全部楼层
<P>和mmi的优先级低有关。如果有用Midi发按键声,会更慢!</P><P>解决办法:尽可能不做全屏刷新的动作。</P>
点评回复

使用道具 举报

 楼主| 发表于 2005-10-18 18:23:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复

使用道具 举报

发表于 2005-10-18 22:19:00 | 显示全部楼层
<b><FONT color=#000066>oldman说得对,一般都是尽量减少刷屏面积</FONT></b>
点评回复

使用道具 举报

发表于 2005-10-20 23:07:00 | 显示全部楼层
<P>C my code from some project many years age:-?</P>
<P>static void MenuOper(void)  
{
    INT16U t=0;
    CurrMenuId=0;
    CurrItemPos=0;
    CurrDispHeadPos=0;
    MenuDisp(0,0);
    LCMDispChar(0,0,"*");
    ;//开键盘中断
    while(1)
    {
        ;//关键盘中断
        if(!KeyProcess)
        {
            KeyProcess=1;
            switch(CurrKeyValue)
            {
                case UP:
                    if(!CurrItemPos)
                    {
                        CurrItemPos=MenuLvSize[CurrMenuId]-1;
                        if(CurrItemPos&lt;4) CurrDispHeadPos=0;
                        else CurrDispHeadPos=CurrItemPos-3;
                    }
                    else
                    {
                        CurrItemPos--;
                        if(CurrItemPos&lt;CurrDispHeadPos) CurrDispHeadPos--;
                    }
                    MenuDisp(CurrMenuId,CurrDispHeadPos);
                    LCMDispChar((CurrItemPos-CurrDispHeadPos),0,"*");
                    break;
                case DOWN:
                    if(CurrItemPos==MenuLvSize[CurrMenuId]-1)
                    {
                        CurrItemPos=0;
                        CurrDispHeadPos=0;
                    }
                    else
                    {
                        CurrItemPos++;
                        if(CurrItemPos&gt;CurrDispHeadPos+3) CurrDispHeadPos++;
                    }
                    MenuDisp(CurrMenuId,CurrDispHeadPos);
                    LCMDispChar((CurrItemPos-CurrDispHeadPos),0,"*");
                    break;
                case BACK:
                    if(!CurrMenuId) return;
                    IndexStkTop--;
                    CurrMenuId=IndexStkTop-&gt;MenuId;
                    CurrItemPos=IndexStkTop-&gt;ItemPos;
                    CurrDispHeadPos=IndexStkTop-&gt;DispHeadPos;
                    MenuDisp(CurrMenuId,CurrDispHeadPos);
                    LCMDispChar((CurrItemPos-CurrDispHeadPos),0,"*");
                    break;
                case OK:
                    if((*MenuLvPtr[CurrMenuId])[CurrItemPos].ChildMenuId!='?')
                    {
                        IndexStkTop-&gt;MenuId=CurrMenuId;
                        IndexStkTop-&gt;ItemPos=CurrItemPos;
                        IndexStkTop-&gt;DispHeadPos=CurrDispHeadPos;
                        IndexStkTop++;
                        CurrMenuId=(*MenuLvPtr[CurrMenuId])[CurrItemPos].ChildMenuId;
                        CurrItemPos=0;
                        CurrDispHeadPos=0;
                        MenuDisp(CurrMenuId,0);
                        LCMDispChar(0,0,"*");
                    }
                    else
                    {
                        (*ItemFuncPtr[(*MenuLvPtr[CurrMenuId])[CurrItemPos].FuncId])();
                        MenuDisp(CurrMenuId,CurrDispHeadPos);
                        LCMDispChar((CurrItemPos-CurrDispHeadPos),0,"*");
                    }
                    break;
                default: ;
            }
        }
        ;//开键盘中断
        t++;
        if((t==65535)&amp;&amp;KeyProcess) {;/*关键盘中断*/return;}
    }
}</P>
点评回复

使用道具 举报

发表于 2005-10-21 16:22:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>charles</I>在2005-10-17 20:10:00的发言:</B>
在整机调试LCD的时候,感觉手机菜单的反应速度不是很快,想调整一下.
请教各位,影响手机菜单的反应速度的因素是什么?有哪些?
我开始觉得与LCD的时序相关,但调整后好象没多大变化.
其实,在功能越来越多的今天,菜单的反应速度快不快,对评价一个机型的指标有重要因素.
所以在这里,大家可以根据经验,讨论一下遇到过的问题,解决的方法.</DIV>


<DIV class=quote><B>以下是引用<I>charles</I>在2005-10-17 20:10:00的发言:</B>
在整机调试LCD的时候,感觉手机菜单的反应速度不是很快,想调整一下.
请教各位,影响手机菜单的反应速度的因素是什么?有哪些?
我开始觉得与LCD的时序相关,但调整后好象没多大变化.
其实,在功能越来越多的今天,菜单的反应速度快不快,对评价一个机型的指标有重要因素.
所以在这里,大家可以根据经验,讨论一下遇到过的问题,解决的方法.</DIV>
<p>
在手机系统开发中,一般的做法是把MMI,DI等不同功能做为不同优先级别的task,菜单反应慢的原因有很多种:
1、跟你的系统task优先级别有关系,如果要使显示比较快的话,一般是把DI(显示task)的优先级别调高些;
2、显示的驱动要做到尽可能优化,要做到汇编级别的优化代码!
3、处理MMI的程序要尽量的精简些,因为有时候一个菜单切换到另外一个菜单过程中,花了很多时间来处理菜单界面,所以要等段时间才能刷新lcd,所以速度变慢了。
当然慢还有很多其它原因,不过楼主要把你的系统运行原理搞清楚,如果手机的时钟在26M以上,一般os设计合理的话,刷新速度都还可以。
有什么问题我们可以直接在这里研究,我对此比较有兴趣。

附:aquasnake 仁兄的代码在手机里基本是不能用的。键盘处理还是要讲究的些。[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

 楼主| 发表于 2005-10-21 20:00:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复

使用道具 举报

发表于 2005-10-22 00:25:00 | 显示全部楼层
<P>hehe ,MIKAL看出来了,我这个是2年前做的代码,不是键盘扫描啊,是一个菜单操作函数,纯标准C,不是for ARM的代码</P>
点评回复

使用道具 举报

发表于 2005-10-22 00:39:00 | 显示全部楼层
<P>写MMI的不会涉及到底层中断的</P>
<P>调用OS的一些函数的时候如果关中断是在整个函数前写关中断代码,整个函数执行时间内是不响应键盘中断的(中断请求被压栈,待函数执行完毕开中断后再次响应),手机现在是13M外部clk,内核频率到2百多M(ARM7 TDMI CORE),关键是RTOS代码质量的优劣,关中断指令相差一行代码就有相当大的差别</P>
[此贴子已经被作者于2005-12-1 17:07:21编辑过]
点评回复

使用道具 举报

发表于 2005-10-24 11:03:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2005-10-22 0:25:24的发言:</B>
<P>hehe ,MIKAL看出来了,我这个是2年前做的代码,不是键盘扫描啊,是一个菜单操作函数,纯标准C,不是for ARM的代码</P></DIV>


不好意思啊,我没有细细看,不过请问下:
    MenuDisp(0,0);
    LCMDispChar(0,0,"*");
这两个函数是同步的吗?就是立即去刷屏还是后台刷屏?
点评回复

使用道具 举报

发表于 2005-11-13 16:03:00 | 显示全部楼层
音乐数据本身影响播放期间的资源占用,会影响速度,还有就是LCD的刷屏,和任务的优先级
点评回复

使用道具 举报

发表于 2005-11-27 17:51:00 | 显示全部楼层
<P>一般来说和以下几个因素有关西:</P>
<P>  1.是否在每次按键后,整屏刷屏,如果是的话,代码如果没有做过优化,一般是要先清屏,然后再显示下一屏的数据,这样当然导致向LCD送数据的次数增加,影响显示效果。所以建议,MMI的显示函数要有所优化.</P>
<P>  2.和MMI的程序架构有关系,象Agere平台MMI 架构,它的MMI是基于窗口的消息派发机制,按键消息是先被转换为各个窗口的事件,然后每个窗口的处理函数再来处理这些窗口事件,而且Agere大部分平台是26M时钟。这样显示上是会有所滞后。</P>
<P>  3.和楼上有人提到的按键音的处理有关西,如果播放MIDI按键音,而且MIDI任务的优先级比较高,也会有影响。</P>
<P>  4.和整个手机软件系统的各个相关任务的优先级及调度都有关系,比如这个问题会涉及到MMI任务,KPD任务,DI任务,MIDI任务,怎么样合理安排任务优先级也至关重要。一般而言,我认为优先级应该按照从高到低安排如下:KPD&gt;MIDI&gt;MMI&gt;DI.</P>

[br]<p align=right><font color=red>+5 RD币</font></p>
点评回复

使用道具 举报

发表于 2005-11-28 11:28:00 | 显示全部楼层
<P>我认为主要是CPU的主频太低,还有字库的读取速度太低,其次是显示屏的数据总线有的是8位的有的是16位,当然16位的比8位的快啊!这是我的一点拙见,见笑了</P>
点评回复

使用道具 举报

发表于 2005-12-2 13:16:00 | 显示全部楼层
一般的手机菜单显示快慢,应该同lcd的刷新显示的快慢的关系最大。还有可能的是菜单的形成机制,执行刷新任务的优先级。[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-1-18 21:28:00 | 显示全部楼层

一些不同的看法

在一般的中低端手机中,RTOS的功能都不是很强。 MMI程序员可以很随意的调用一些关键的OS函数或者是驱动模块中的函数。 这样就导致了CPU在task 间反复的切换和函数重入的问题。而且如上文有兄弟说有midi的按键音时会更慢, 那时应为这时多半这个midi播放的功能主要在比较高优先级的task中执行。这些task会将mmi的任务挂起。所以屏幕的刷新就停顿了。
应该说在CPU比较慢的情况下,快速 的按键响应比较难做到。还有刚才有兄弟说ARM7 TDMI 能跑到200M, 不知道是那个公司的,小弟看到过90M的ARM7.[br]<p align=right><font color=red>+5 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-1-23 18:09:00 | 显示全部楼层
LCD数据线是8位的还是16位的?若是8位的当然很慢,接下来就是全屏刷新的部分刷新的问题了,尽量减少刷新区域节省时间,然后是同步操作的问题,按键发音和按键事件的处理上可能也可以优化,cpu频率的高低了,不过我们原来用的39.2的ARM7TDMI,高通msm6025照样刷洗不慢![br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-1-26 17:37:00 | 显示全部楼层
<P>大家讨论的都比较全面了,我再补充一下,还要考虑系统和LCD的速率匹配,尽可能提高传输速率,也就是说要控制CPU的插入的等待周期数。再有就是LCDdriver 的优化,传送的数据块分割要合适,在恰当大小数据块传输时可以采用关闭系统中断来提高传输速度(小心)</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-23 15:07 , Processed in 0.049959 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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