1. TwelveKeyDialer.java, onKeyUp() 2. TwelveKeyDialer.java, placeCall() 3. OutgoingCallBroadcaster.java, onCreate() sendOrderedBroadcast(broadcastIntent, PERMISSION, new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null); 4. OutgoingCallBroadcaster.java, OutgoingCallReceiver doReceive -> context.startActivity(newIntent); 5. InCallScreen.java, onCreate/onNewIntent 6. InCallScreen.java, placeCall 7. PhoneUtils.java, placeCall 8. GSMPhone.java, dial 9. GsmCallTracker.java, dial 10. RIL.java, dial RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); ... send(rr);
这世界真是疯了,貌似有人连FPGA原理是什么都不知道就开始来学习FPGA了。
DSP就是一个指令比较独特的处理器。它虽然是通用处理器,但是实际上不怎么“通用”。技术很牛的人可以用DSP做一台电脑出来跑windows,而实际上真正这么干的肯定是蠢材。用DSP做信号处理,比其他种类的处理器要厉害;用DSP做信号处理之外的事情,却并不见长。而且信号处理的代码一般需要对算法很精通的人才能真正写好。数据结构里面的时间复杂度和空间复杂度在这里是一把很严酷的尺子。
FPGA只不过披着软件的外衣,实际上是硬件。FPGA内部有两层相对独立的电路。使用者“编码->编译”后生成一个映像,这个映像作用于第一层电路。这层电路之际上就是一个0,1的开关矩阵,这个开关矩阵用来控制第二层工作电路,将第二层工作电路配置成一个相应的处理器。理论上FPGA可以配置成任何需要的处理器,而实际上为了尽量少出bug,FPGA开发都使用已经开发好的“库文件”,也就是把人家能稳定工作的电路图拿过来。因此,对大多数FPGA开发者来说,FPGA内部有几个核基本上只能从库文件里面选——除非你有能力自己设计核心内部的电路和核间总线——ram和rom也是用宏来配置,自己只需要改改外部的专用电路和接线方式等等。甚至外部的专用电路都有库文件,搭个积木就完事了。玩FPGA真正挣钱的人是做积木的人,你原创几个积木并且能申请专利,迫使人家给你交专利费,那你这辈子可以衣食无忧了。
FPGA 区别于ASIC设计 属于硬件设计的范畴 ASIC是硬件全定制 FPGA是硬件半定制
具体来说 ASIC整个电路都由设计师设计的 用多少资源设计多少资源 一般多用于产品设计
FPGA资源事先由厂商给定 例如Altera Xilinx等都提供不同系列的FPGA芯片 设计师可以在给定资源下做硬件设计开发
DSP 主要用于处理信号 事先算法 特点是多级流水 可以加快数据处理的速度 开发环境主要是C语言 可以说DSP应用的范围更专 DSP的设计
可以理解为软件设计 设计师不需要太了解DSP的结构
补充几个小概念
DSP愿意就是指数字信号处理 只不过DSP芯片由于主要功能是实现数字信号处理 实现各种算法 所以简称为DSP(数字信号处理器)
FPGA一样可以做DSP(数字信号处理),就意味着可以用FPGA做硬件设计来实现DSP芯片的功能,当然,相比较专业的DSP芯片 成本太高
现在除了FPGA和DSP之外还有一个近几年热门的产品 ARM
ARM主要应用与手持设备和嵌入式产品 几乎笼罩了90%的市场份额 可以说ARM开发也偏向于软件开发 设计者主要是讲wince系统或者
linux系统移植到ARM开发平台上,然后做各种软件应用开发
所以 这三个方向都有其不同的应用场合 很难讲谁更有前途 不过 作为我个人而言 更喜欢做硬件设计 所以我选择FPGA作为自己的方向 FPGA
主要是给设计者提供了一个硬件平台 开发的核心还是需要独立的应用设计和高效的算法设计 所以设计者应该处理好工具的掌握和具体设
计的区别
FPGA:
并行处理,内部资源多
DSP:成本低,低功耗,高性能的处理能力。具有强大的外部通信接口(SCI,SPI,CAN)便于构成大的控制系统。特点:(1)在一个指令周期内可完成一次乘法和一次加法; (2)程序和数据空间分开,可以同时访问指令和数据; (3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问; (4)具有低开销或无开销循环及跳转的硬件支持; (5)快速的中断处理和硬件I/O支持; (6)具有在单周期内操作的多个硬件地址产生器; (7)可以并行执行多个操作; (8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。
本人认为FPGA更有前途,DSP其实只是个特殊的处理器,有专用的硬件乘法器,有桶形移位器可以把数据从存储器移到ALU,还有流水线等技术。但FPGA同样可以完成这些功能,并且FPGA是并行工作的,现在很多FPGA内部可以使用软DSP或者硬核的DSP,当你的项目需要时序很严格的情况非FPGA莫属。比如说用DSP和USB芯片CY68013进行FIFO(同步传送)数据时,IFCLK可以是外部或内部,USB芯片在(IFCONFIG的IFCLKSRC里配置)。如果IFCLK使用内部的情况下,DSP根本无法知道我把数据送到FIFO数据端口后USB芯片内部时钟过了多少周期,但FPGA就可以,因为FPGA的时钟取自于USB芯片的48M输出,在FPGA内部做一个状态机,当数据送到USB芯片的FIFO数据端口时,下一状态把SLWR拉低,再下一状态拉高,就等于USB内部过了一周期,数据就写进USB芯片内部的FIFO了,我只是举个简单的例子,很多关于时序的案例非FPGA莫属,DSP做算法快速,成熟,FPGA更有挑战,据我的经验,FPGA现在内部起码有很多核是可以用的,这像一个可配置的单片机,不用的我就不放进项目。以ACTEL的FPGA来说,用的比较多的软核是:Core8051S、CoreABC、微处理器软核,特别说明CoreABC占用的空间非常少,可以裁减指令,可以配置数据宽度8,16,32,有1组通用输入端口和输出端口,可配置堆栈。有CoreDES,CoreAES128,CoreFROM,CoreI2C,CoreGPIO,CoreInterrupt,CoreLPC,CoreSDR,CoreUART,还有很多很多,看这些名字,很多人都知道干什么用的。
现在各大平台群雄逐鹿,推出各种让人炫目的feature,基于HTML5开发最大的弊病就是无法享受最新最炫的native feature和性能问题,而Phonegap的价值就在于此,它就是为了让你既能基于HTML5享受跨平台的便利,又能享受native的feature。因此,这里就通过对phonegap的分析,来看看如何能更好地让HTML5长在native上。
分析完phonegap在三大平台上的源码(phonegap源码分析(一)------ android,phonegap源码分析(二)------ Windows Phone和phonegap源码分析(三)------ IOS),会发现phonegap就是基于各大平台上的webview,把它作为跨平台的虚拟机,把HTML5作为字节码,以此打造Mobile上的Java。它那些所谓集成native的plugin实际上是苦力活,把各大平台共有的特性都包装了一遍,所以,它的未来寄希望于两点,一是各mobile平台能大力发展HTML5,提升其性能和功能。二是,能紧跟各平台的最新发布,尽快地把最新特性以plugin的方式include进来。因此phonegap不是一个什么很绝妙的框架,它是基于一个很简单的构想,但要做得尽可能的完善和细节,并且更新速度要快。
我前面也提到过,不是所有的应用都适合用phonegap来做,如何评估,关键要看这个webview是否能很好承载你的应用。这块我研究不多,但从网上的一些文章来看,webview的性能是存在问题的,很多人做过测试,拿同样的页面在webview和browser上跑,webview的性能是低于browser的,并且就算是不亚于browser,browser和原生应用也是没法比的,撇开JS的优化(这是一个很大的主题)不谈,phonegap相关的性能损耗主要是以下几点:
- JS与Native的互调
- HTML UI与native UI的差距
- 性能与跨平台间的平衡
对于第一点,其实这是最可以忽视的点,通过对phonegap源码的分析,损耗在JS与Native的互调上的代价其实并不大,除了Android取调用结果之外,其他都是直接的本地方法调用,并且JS与Native的互调并不是发生在每时每刻。
而对于HTML UI与native UI的差距,这个是性能问题体现得最为明显的地方。在桌面平台上尚且如此,更别提在mobile上,因此对UI交互要求很高的应用,得重点考察一下是否能容忍这块的差距。对于如何提升UI性能和流畅性,我还没来得及做很深入的研究,就目前的学习情况来看,可以朝以下几个方面来做:
- 通过template技术,把HTML打散,避免一个html太大,http://floatlearning.com/2011/05/how-well-does-phonegap-scale/,这篇文章介绍一些template solution
- 选择最合适的UI框架,就目前来看Jquery mobile在性能上我是不满意的,以后我会重点考察一下JQTouch
- 优化dom render,比如减少reflow的cost,http://floatlearning.com/2011/06/the-cost-of-reflows-on-a-web-app/
- 性能提升小tips,http://floatlearning.com/2011/03/developing-better-phonegap-apps/,这篇文章介绍了几个很关键的tips
对于性能与跨平台间的平衡,就是要考虑哪些点是需要通过plugin放在native端来做的,JS的执行性能虽然近年来有了明显的提升,但还是没法和native比的,所以如果存在cpu密集型的运算时,得考虑是否有必要牺牲跨平台性在native端来做块,不过,phonegap就是好在给了我们这个平衡的选择性,起码我们还是有路可走。
性能优化的工作对于跨平台mobile开发来说是非常关键的,绝不能以牺牲用户体验的代价来方便自己,虽然,不太可能做到与native app不相上下,但不断提升性能是我们不能忽视的工作。