嵌入式新闻
电子发烧友网讯:自上次在本站独家报道的《单片机“低能”,请不要诋毁操作系统!》,得到大家的积极认可与热烈反响。部分电子发烧友网读者纷纷来邮件表示意犹未尽,要求再次深入浅出地对单片机与OS进行探讨。在此,电子发烧友网编辑部再次邀请音视频技术专家及芯片设计专家潘昶,以最擅长的音频领域为例(本文主要涉及嵌入式播放系统),为各位读者分享技术心得,以飨读者。
单片机”低能”后续
本文相对有一定的专业性,如果非理工科的读者看起来会很费工夫,笔者尽量深入浅出的进行分析,希望让大部分读者能看明白。
目前针对部分厂家混淆概念的说法,这里从理论上分析一下单片机(或者说裸奔)和操作系统的区别。从网络的宣传上看,无非单片机族的理论根据是单片机可以“单线程”进行播放和解码。从而杜绝jitter(时基抖动)的问题。以笔者从事单片机/嵌入式系统设计超过15年的经验,从理论上分析一下,这个Jitter是如何产生的,是否多线程会产生Jitter呢?
何谓线程?
因为一个CPU只有一个ALU(算术逻辑单元),因此要同时响应不同的事件,就要引进“线程”的概念,所谓线程就是CPU针对多个任务,实行分时分段执行多个任务的一个机制。举个很简单的例子,假如有10个任务,完成每个任务的执行时间都是10个时间单位,理论上总执行时间就是10x10=100个时间单位,如果单线程执行,就是顺序执行这些任务,第一个任务在10的时间单位完成,第二个在20的时间单位完成,如此类推,最后一个在时间点100的时间单位完成,而分时执行,就是每个任务都执行1个时间单位,然后切换到另外一个任务执行,那么在最后的时候,第一个任务在91的时间点完成,第二个任务在92的时间点完成,最后一个任务在100的时间点完成。我们举的例子比较特殊,运行时间都一样,但实际上,绝大部分的程序运行时间都不一样,因此,如果最短运行时间的程序最后一个执行,等待的时间就会很漫长,线程的概念因此而来,如果有一个运行时间为2 的线程替换刚刚的执行队列中的一个任务,那么就会在20-30之间完成那个最短的程序,节省了用户等待的时间,线程因此得到迅速的发展。
何谓Jitter?
数字电路为了防止“竞争冒险”,引进了边缘触发的概念,通过时钟沿进行信号的读取以及输出。而信号沿和信号沿之间的时间如果固定的话,就不会有Jitter的存在,所谓jitter就是时钟沿之间产生的稍微的不同,一般在纳秒(1x10-9秒)甚至皮秒(1x10-12秒)这个数量级。而音频信号需要严格根据时钟沿恢复采样的信号,因此,Jitter在数字音频里面的影响是至关重要的。
单线程播放是否可能?
我们可以说,单线程播放,对播放器来说,理论上是完全不可能的。从文件到i2s输出,中间的环节我们列举一下:
1. 读文件(4)
2. 显示(2)
3. 解码(10)
4. 连续的数字信号输出(2)
5. 等待客户操作(1)
以上的任务后面括号里面的数字表示需要的时间,红色的字代表要求实时性最高的一个环节,而在这个环节里面产生的Jitter都会严重影响输出的质量,那么我们如何进行单线程播放呢?
读文件-》显示-》解码-》输出-》判断用户操作-》读文件。
这就是我们需要做的。注意,我们的输出是需要连续输出的,也意味着,44.1KHz的采样率下面,每个位输出是 44.1KHzx2(2声道)x24(24位采样数据)= 2.116800MHz的速率,而时间就是其倒数,一般目前的芯片在输出端有FIFO(先进先出缓冲器),如果FIFO的深度是64的话,供给I2S的数据间隔就必须小于2.1168M/64=33.075KHz。因为中断响应是有时间要求的,实际上和44KHz差不多的数据频率是可以让FIFO保持不拉空。
咱就说说这些数据是通过什么方式进FIFO的吧,FIFO是硬件做的,耗用资源以及芯片面积较大,因此一般都不会很大,而APE/FLAC解码是根据一个个的“包”来的,也就是你不能想要多少就要多少,必须得解码好的数据放在内存里面等待 FIFO,以保证FIFO不被拉空,这样才能保持播放的连续性,因为FIFO响应是通过中断方式的,响应速度是微秒级别(CPU要进行压栈等处理才能切换过来),因此可以说数据送FIFO和其他几个任务肯定就是并发多线程的,那何来单线程?在44.1KHz的间隔,是不可能完成读文件-》解码的过程的,这是事实。
所以如果谁说单线程能进行解码,请给出一个完整的理论模型,否则都是空谈。
再者,一个Linux操作系统,参与开发的都是顶尖的高手的大团队过10年的维护,国内一个山寨厂几个技术人员短短两三年的时间就能比别人的操作系统更好,反正我是不相信这样的神话。
操作系统是否可以实时?
实时操作系统基本上满足实时的需求,这里所谓的实时,并不是0响应时间,而是在一定的响应时间内做出反应就算实时。实时的定义笔者没有看到过有很严格的要求。操作系统需要处理的事情很多,比如任务调度,MMU管理等等。这里我们需要重点说说MMU(内存管理单元)在现代嵌入式芯片的举足轻重的作用,MMU是协助嵌入式CPU的一个重要的辅助管理系统,有了MMU才能够让CPU不介入而让内存的数据自由存储。而单片机族所瞄准的Jitter主要就针对内存的延时。的确,Microsoft的不开放的操作系统,内部的管理我们不得而知,但是Linux开源的系统来说,要怎么优化就可以怎么优化,只要把音频播放的通道提高到最高优先级,那么就不会对Jitter有太大的影响。针对解码的动作,操作系统会预先把文件读取了,然后解码后放在内存某一个地方,MMU会在不影响任何应用程序的情况下自动往FIFO派送数据,这个动作因为MMU的存在,而完全实现了“并行”执行,从而可以做到“实时”。所以现代的CPU有多强,并不是看其运算速度有多高,而是其协处理单元有多少,能解决什么问题。说个题外话:全志的A10芯片,虽然才1G的运算速度,但是以其低功耗,也能完成Intel X7800 CPU对1080p电影的解码,就是因为有解码的硬件协处理器协助完成的。
PC HIFI的特点
·不开放的系统(多是Windows的系统),内部操作不的而知
·较大的电源噪音(都是用DC-DC的电源模块)
·输出通道过长(CPU+MEMORY+北桥+声卡)
·风扇噪音大
·CPU速度很高
·内存很大
以上特点,黑色部分是PC HIFI的绊脚石,而红色部分是PC HIFI的优势。因此PC HIFI只要能够通过外置的解码器,适当的进行FIFO的扩大就可以解决PC系统的弊端,还是可以做好的,当然了,在环保和易用性的方面,还是没有专用播放器方便罢了。
嵌入式播放系统和普通CD对比的不足以及优势
从上表可以看到,CD的优势就是牌子响,客户群体高,新的播放器容易被老的消费群体所排斥,使用方便性也不如CD机。同时因为播放器的设计复杂,还在发展的阶段,所以不容易做好。
如何才能做好一个播放器?
但是不容易做好,并非不能做好,市面上不乏比CD做得好的播放器。这个要从理论模型、理论基础、软件、硬件、PCB布线、器件选型、调音等各个环节进行精心调整才能做好。而并非选择什么单线程就能做到极限,随便可以和某个价位的CD机叫板。
影响嵌入式播放器性能的瓶颈,的确如单片机族描述的:Jitter,但是降低Jitter并非通过单线程就能彻底解决,而是要从所选择的芯片,软硬件的架构,优化的方式,对系统的了解程度综合考虑的。
其次,必须要有足够的设备作为参数的测试基准,虽然说参数好听感不一定好,但是参数不好听感一定不好。要有参考对比的器材,否则做出来的产品,什么定位都说不清楚,如何可以大言不惭可以和中高端CD机抗衡?如果真的标榜能够和中高档的器材比较,请给出一个机器的测试参数以及测试图,测试的对比环境,A/B对比盲听的结果,同时要有行家认可,这样才是真正过关的产品,而不是踩低别人抬高自己。
深耕技术是一个很漫长很痛苦的过程,只有熬过这段时间才能收获真正的成果。
——电子发烧友网版权所有,转载请注明出处!
全部0条评论
快来发表一下你的评论吧 !