分享

开源硬件平台全新简介 (2) Raspberry Pi “树莓派”(下): 问题与总评

 guitarhua 2016-09-23

我们在上篇《开源硬件平台全新简介 (1) Raspberry Pi “树莓派”(上): 概述与优势》中,介绍了Raspberry Pi的基本信息与竞争优势。当时留了个坑:“可以赞,就当然必须喷,没得喷不科学”。今天就填这个大坑。

(因为参加Maker Faire Shenzhen深圳制汇节造成的延期深感抱歉。欢迎您阅读我们对这场展会的所有原创报道!)

树莓派林林总总的所有问题

博通,你要摁着多少资源自己专属?

做为树莓派ARM核心的Broadcom BCM2835这个芯片是专供树莓派的。这就造成了事实上无法采购这个芯片,用于复制、仿制或定制基于树莓派的产品。

更为残忍的是,BCM2835的手册(Datasheet)也不向公众提供,必须由合作商签订保密协议(NDA)才能获得。这样就造成了就算得到树莓派的电路图(基金会开放电路图倒是真的),也不能完全理解图中涉及BCM2835的部分。

并且博通对其VideoCore IV显示核心的驱动程序,也采取了和很多驱动程序一致的闭源发布。这就造成了依赖树莓派显示核心的程序,很难迁移到使用其他显示核心(例如Mali)的ARM SoC上:

这两点都是在树莓派的热销压力之下才有所改变。博通对BCM2835,放出了一个部分的Datasheet描述了芯片的外部总线(但仍没有放全部的Datasheet)。而VideoCore IV显示核心的文档和相关代码,则一直让所有的开发者整整等待了两年,直到2014年的2月份才对外提供。而后还要树莓派基金会去填坑,举办竞赛号召爱好者去把这部分资料应用到树莓派上。

但根本的一点到现在仍然没有变:树莓派仍然难以仿制和改进,不可能对树莓派去实际执行开源项目的fork-republish机制。为了增强树莓派的定制性,树莓派基金会最近推出了一款笔记本内存大小的核心板,只包含BCM2835和内存,任何对外接口允许自己连接。——但在硬件设计没有变化的情况下,这种努力不过是一种临时手段(workaround),改变不了树莓派无法遵循开源模式的硬伤。

所以SUSE中国的一位资深工程师(恕我忘记尊姓大名)在2013年的一次线下聚会中,甚至不将Raspberry Pi列入开源硬件之列。这不是没有道理的——不能复制,不能改进,开源软件只运行在皮毛的层次上,这样和传统闭源的PC,在概念上又有什么区别?

更有极端的说法直接称博通为“开源的敌人”——其实认真审视一下,这个说法虽然激烈,但恐怕也并不特别过分。

基金会,你挖了多少坑没填?

树莓派基金会真的很努力,也促成了很多和树莓派有关的开发项目。但不得不说的是,树莓派至今为止,仍然有很大一部分工作仍然“挖坑不填”。

用最大的一个坑举例子:DSI显示接口DSI是连接液晶裸屏(或模块)的一个硬件接口,从使用情况来看极不流行,很难买到DSI接口的屏幕。在实用价值上,远远落后于常用于液晶电视、笔记本屏幕的LVDS接口。树莓派采用DSI也许有BCM2835硬件设计上的理由。但两年时间过去了,树莓派仍然没有拿出使用DSI接口实际驱动出一个屏幕的例子。

……这样问题就很简单了:那当初设计这个DSI口是做什么的?!


▲ 基金会,你为什么让所有树莓派的DSI接口一直吃灰?(图片协议:CC-BY-SA)

软硬件设计,还要弄出多少缺陷才算完?

树莓派的软硬件设计真的不怎么好,这一段要重点说。举3个例子。

怎么给电都不够的5V电源

树莓派使用单一5V供电,电源本身并不做任何处理,所有5V的设备直接取电,只有CPU的供电用数个低压差(LDO)单独提供。[注B]这本来是一种很简单、显然、低成本的无管理电源设计。但偏偏树莓派在电源上串联了一个自恢复保险(PTC)进去,试图防止出现短路、过流等故障。

PTC是一种简单的过流保护器件,过流时发热造成内阻上升抵抗过流,异常解除后可以冷却让内阻下降,恢复设备工作。但PTC简单就有简单的问题:PTC自身的电阻不低(实测很可能有0.2Ω以上),串接在电源上容易把电源电压拉下0.3-0.5V左右的程度。——对5V这个低压来说,电源跌落这个程度就很成问题了,极易造成依赖5V的USB等外设欠压异常。

事实上如果供电电压是5.2-5.4等比5V整数稍微高点的规格,那么树莓派得到的电压还可能在5V上。如果电源老老实实提供5V,那树莓派就麻烦了。这也就是许多人误解“树莓派对电源要求高”的原因——实际上要求高不是性能需要,只是一个设计错误使然。


▲ 一颗自作聪明的保险,搞坏了所有的事情。

塞车又缺电的USB接口

BCM2835处理器实际上只有1个USB主接口。这个接口也是树莓派唯一的高速数据通道。

常见的树莓派B型,虽然有两个USB和一个以太网接口,但这都是板载的LAN9512芯片的杰作[注C]。这三个接口实际上只是共享1个USB主端口的480Mbps带宽。所以树莓派的USB总线塞车,是每一个树莓派玩家心中的痛。只要图像采集、文件传输等有数据吞吐的任务稍微要求高一点,树莓派就必然的缴枪投降。

另外树莓派对USB的供电,只是把+5V接了上去,根本没有为USB设备上电时的突波做去耦设计[注D]。这样造成的恶果是哪怕USB设备的工作电流本身不大,其插入时的瞬时大电流也会导致CPU供电不足而重启。这个问题不挑设备,社区使用U盘、USB无线网卡等实测都出现过。

(所以对树莓派而言,用一个有电源输入的USB HUB,把USB的供电单独解决掉是必须的。社区里每天都在讨论“有源HUB怎么选”的问题。)

这又是一个弱智的毛病。……基金会你们做出样板之后,难道不连接各种各样的USB设备测试一下吗?


▲ USB的热插拔本来应该无条件做到。为什么树莓派要我们自己花钱补充这种破烂才行?

让新手与老手一起头痛的NOOBS

树莓派的启动需要一个FAT32的Boot分区,和一个(或数个)Ext4的Linux主分区。这也是Linux系统的典型需求。树莓派原来的系统安装方式,是简单的用烧写工具,把.img系统镜像绕过分区表直接写盘。写好盘后分区表结构也就自动建立好了。但偏偏基金会认为这样还不够,“我们要直接把文件拷进SD卡里就能用”!于是基金会推出了官方的启动前运行环境“NOOBS”。(noob /nu:b/ n. 菜鸟、新手)

使用NOOBS需要把NOOBS软件包(内置数个系统的大压缩包)拷入SD卡。NOOBS允许用户选择一个系统,利用SD卡的剩余空间,在树莓派上现场解压并建立分区结构。NOOBS不是真正的系统多启动工具,一次只能在SD卡的剩余空间里装一个系统,不过倒可以随时把系统推掉换成别的。

NOOBS其实只是带来了许多的麻烦:

  • 拷贝NOOBS意味着要同时把多个系统拷入SD卡,复制时间浪费极其严重,对于Class4的低速SD卡尤其难以忍耐。
  • NOOBS带着好几个系统镜像常驻SD卡,浪费空间。4GB及以下卡实际上根本无法使用NOOBS。
  • 常驻就意味着陈旧。SD卡上NOOBS带的系统镜像,难以得到最新的更新。
  • 不能真正的多启动,那为什么还要在SD卡上常驻这么多系统?
  • 如果系统真要推掉重来,为什么不用电脑?

……所以这主意到底谁想出来的?!刷卡操作也许确实需要给新手些微的指导,但提出NOOBS这种一堆麻烦替代1个麻烦的方案,到底是一种什么样的做事哲学啊?!


▲ 系统刷写本该是计算机的任务。NOOBS如此越俎代庖是几个意思?

对树莓派的总评

综合社区这两年所有的抱怨,我们的批评大概也就以上这些了。

也许喷了树莓派很多,但请所有读者都不要忘记:这都只是硬币的另外一面

树莓派目前仍然是硬件条件相对成熟,软件资源最为完备,社区支持最为广泛,英文资料最为全面,方案参考最为充足的硬件。
树莓派也许不那么开源,但仍然是实践开源硬件工作的最好利器——也许是最好,不是也可以称为“最好之一”。

如果你是Linux和硬件开发的新手,那么树莓派目前肯定是不二之选。因为使用树莓派,意味着最大程度的保证成功,降低新手上路的挫折感。我们感觉对新手而言,也许其他的硬件也值得去尝试,但树莓派恐怕很大程度上还是必须的,同时也是很推荐放在第一个购买的。

当然,如果您已经是Linux/嵌入式/单片机/工控/通讯等任何一个领域的有经验人士,那么就未必需要一定去购买树莓派。您大可先了解树莓派的参数、能力、优点和问题,自行评估购买适合您的硬件平台。

关于树莓派,我们的介绍就是这些了。下集预告:pcDuino(全一篇),敬请期待。

声明

任何一篇文章,都无法完全覆盖每一个人各种条件的差异。对于部分人群,本文的参考一定会出现或多或少不适用的情况。
因此本文全部的学习与采购建议仅供参考。开发者请按照个人情况,综合各种观点自行决断

注解

[注A] 题外话——我们信奉这一点:厂商只要宣传了硬件的能力,就必须给出相应的证明
有许多硬件厂商,硬件参数叫得响,“超越×××”吹上天,却拿不出可以运行的程序代码去证明硬件的能力。
这种厂商和骗子没有区别。有句话就是送他们的:“Talk is cheap. Show me the code.” (Linus, 2000)
回头审视树莓派——说实话,树莓派虽然还有坑没填,但已经填好的坑,在数量和质量上都已经比其他厂商绝对优秀了。

[注B] 细节不完全准确,但基本上如此。

[注C] LAN9512芯片充当HUB将USB口1分为3,并在芯片内部,把其中一个USB口永久连接上了USB有线网卡。
因此对系统是HUB×1+USB网卡×1,对外是USB×2+以太网×1,所有设备分割1个Host端口的带宽。

[注D] 各种电子设备在上电(或工作负载突然增加,例如CPU压力测试)时总会出现电流(负载)突然增大的现象。
如果负载只是单纯连接电源,负载突变就必然导致电源电压突变,影响甚至危害连接同一电源的其他单元电路。
去耦就是使用必要器件吸收单元电路中负载的突变,让负载突变不反映到电源电压上。这个名称之意就是“去除单元电路与整体电路的耦合”。


SegmentFault原创文章,转载请遵守本站的有关声明。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多