楔子
我时常在想, 现代社会发展变化速度之快超越了很多人的认知. 罗胖子说跟不上时代要交认知税, 很有道理. 半导体和 IT 行业又是旋涡中心, 发展更加快, 其实想想其他行业的创新 (美团外卖, 滴滴打车, 微信社交, 淘宝京东电商, 以及最新的新零售自动售货机, 自动驾驶汽车等) 本质上都是半导体行业的创新驱动的, 都要靠先有芯片, 先有配套的软件资源和开发人才, 才能有人在这些行业创新.
入坑嵌入式开发多年的我, 面对芯片及其相关的软件开发技术的快速发展变化, 经常会去思考, 这些发展变化的内在推动力和外在合理性在哪里, 这些发展变化对我们有哪些启发和引导, 身处旋涡中心应该何去何从, 才能保证自己不被历史洪流冲走, 才能不断提升自己的价值.
单片机
单片机是中文名, 对应的英文名称是 "Single Chip Microomputer", 很多人可能奇怪平时不是都说 MCU(Micro Control Unit)吗? 其实 MCU 准确翻译过来应该叫微控制器, 现在很多中文书籍都用这个词, 不用单片机了. 因为单片机这个词是很多年前的概念了, 在那个年代半导体工艺还在起步阶段, 集成能力很差, 往往是 CPU 一个芯片, SRAM 一个芯片, Flash 一个芯片, 需要中断的话又得有个专门处理中断的芯片, 所以一个完整可用的计算机系统是很多个芯片 (Chip) 做在一个 PCB 板上构成的.
单片机呢? 就是在一个芯片 (Chip) 上集成了 CPU,SRAM,Flash 及其他需要模块, 在一个 Chip 上实现一个微型计算机系统, 所以就叫 Single Chip Microcomputer, 也就是单片机了. 其实从这个角度来讲, 单片机这个词现在已经没意义了, 因为现在的半导体工艺早就很厉害了, 现在你买到的所有都是 "单片机", 根本不存在分离式的所谓 "多片机". 而且现代的单片机不但集成了 CPU,SRAM,Flash 等微型计算机不可少的部件, 而且大多集成了很多内部外设, 如 Nand 控制器, LCD 控制器, 串口通信, 定时器, RTC 等等, 所以现在的单片机其实应该叫 SoC(System on Chip).
英文是很准确的. 这里有好几个词你可以体会下各自含义: microcomputer,computer,system,microcontroller. 不严格区分的话这些词很多时候可以互相替换和通用的, 但是严格说其实各自有不同代指的. 譬如 computer, 指的就是电脑, 你可以理解为就是电脑, 譬如笔记本, 台式机这些. 当然很多年前的电脑很庞大很笨重, 所以 computer 就是指的这种有机箱外壳, 有键盘鼠标, 很庞大笨重, 通用性强的电脑. 而 microcomputer 指的就是单片机这类东西, 它也是一个独立的电脑系统, 有 CPU 和内存和外设这些, 能跑计算机程序. 但是他相对于 computer 来说体积很小, 而且不是通用的而是专用的, 所以叫 microcomputer.system 呢? 更倾向于整个系统, 也就是说 system=microcomputer + 各种外设. 简单理解就是, 当串口, LCD 控制器等模块进入了 Chip 内部时, 整个 microcomputer 就成为 system 了. 所以其实 system 才是更有意义, 更适合现代单片机芯片的一个名字. 所以现在我们都把芯片叫 SoC, 这个名字更有价值. 那 microcontroller 呢? 现在很多单片机厂商都把自己的单片机叫 microcontroller(微控制器), 其实我个人理解, 觉得 microcontroller 的重点在于 controller, 也就是说他们想强调这个 chip 中集成的 system 是一个 controller, 擅长控制. 而不是一个 DSP(擅长运算).
嵌入式
嵌入式的全称是嵌入式系统, 英文是 Embeded system, 所以可以看出嵌入式是一个 system. 为什么叫嵌入式呢? 这里的嵌入指的是我们把这个 system(硬件上表现为一个 Chip)嵌入到某个设备中去. 譬如冰箱的板卡上的芯片就是一个嵌入到冰箱中的 system, 负责控制用户按键, 冰箱照明灯, 制冷系统等. 可以看出, 嵌入式系统这个名字主要是从芯片在使用时的组织形态来命名的. 所以从这个角度讲, 只要是被嵌入到设备中的芯片都可以被叫做嵌入式系统.
那这个范围太宽了, 说真的你很难找到不属于嵌入式的 system...... 所以我经常觉得嵌入式这个名词根本是废话, 根本没意义. 好在这个理解只是广义上的嵌入式的定义, 但是我们平时讲嵌入式大多时候是从狭义上理解的.
狭义上讲, 嵌入式是为了区别于单片机. 我们经常把芯片中不带 MMU(memory management unit)从而不支持虚拟地址, 只能跑裸机或 RTOS(典型如 ucos, 华为 LiteOS,RT-Thread,freertos 等)的 system 叫单片机(典型如 STM32,NXP LPC 系列, 新的 NXP imxRT1052 系列等), 而把芯片自带 MMU 可以支持虚拟地址, 能够跑 Linux,Vxworks,WinCE,Android 这样的操作系统的 system 叫嵌入式. 所以 linux WinCE 等也常被叫做嵌入式操作系统, 就是这么回事. 你仔细回顾下, 其实大部分人在讲单片机和嵌入式时都是从狭义角度出发的, 并非广义.
单片机的技术和市场状况
单片机是出货量最大的一类计算机. 这个很好理解, 因为单片机用途太广泛了, 所有家电内置的控制系统几乎都是单片机的, 这个数目就很惊人了. 还有各种公共设施, 工厂自动化设备等几乎也都是单片机控制的. 单片机的厂商和品类也是非常多, 我下面列举几类常用的.
8 位和 4 位机. 这类单片机性能低配置低, 但是优势是价格便宜. 所以很多低端家电产品都会用到, 小家电是这类单片机最大的市场. 为了降低成本, 这类单片机很多只能用汇编编程(当然近几年很多也提供了 C 编译器), 很多芯片采用 bounding 封装(就是芯片内核直接贴在 PCB 上然后用黑乎乎硬胶黏住, 大家玩过 LCD1602 的看那后面那个圆盘型黑色的就是). 做这类产品的以前都是台湾一些小芯片厂商. 这些年中国大陆也涌现了很多这类芯片厂商, 这些单片机行业大多对标某个具体应用领域, 对行业需求很熟悉, 直接推出适用这个行业的解决方案. 外行的人可能根本都没听说过这种单片机的型号和相关信息. 总的来说, 这属于比较低端的行业, 不太建议大家学习和进入. 尤其现在中国在搞产业升级, 落后的传统家电产品不断降价还卖不出去, 相反各种高端功能和外观的 "产业升级" 型家电产品利润很高. 所以这种适用于传统老旧电子产品的芯片和技术其实并不值得去投入.
51 单片机. 其实 51 单片机也是 8 位机, 之所以单独拿出来说是因为 51 单片机实在太出名了. 实际上当年单片机百家争鸣的时候 (大约 1980 年代吧)51 单片机只是其中一种, 还有很多其他很厉害的, 可惜都被时间给雨打风吹去了. 51 单片机之所以出名并活到现在, 是因为 Intel 后来开放了 51 内核的版权, 所以很多公司很多人可以毫无顾忌的使用它而不担心付费或版权风险. 实际上到了现在(2018 年),51 单片机已经是很老很没有技术优势的解决方案了, 但是为什么还在大量使用? 主要有以下几个原因: 一是大量存量项目和存量开发者, 这些人很熟悉 51 单片机, 甚至很多老工程师可能只会 51 单片机, 很多老的项目也不可能再去重新开发所以沿用了 51 单片机. 二是 51 单片机也够便宜, 很多对性能没有过多要求的产品干脆就用 51 也挺好. 三是 51 内核开放, 所以很多需要内置单片机核的 SoC(譬如很多电容触摸屏芯片, 很多指纹识别芯片等) 就会选择用 51 核, 不要钱还够用嘛, 不选这个选谁. 很多同学问我还要不要学 51 单片机? 我认为还是要学. 一个原因是 51 单片机的开发用到的技术技能在开发别的单片机时照样有用, 所以学了 51 将来再学其他的也会快很多, 时间不会白花的. 另一个原因是确实有时候实际开发也会遇到用到 51 单片机的, 所以学会了也算是个拿得出手的技能. 所以如果你要学习单片机开发, 从 51 单片机入手绝对不会错. 但是要记得不要沉迷于 51 了, 要迅速学会 51 单片机后, 迅速继续学习更现代更实用的其他单片机(譬如 stm32). 很多人学会 51 后就不动了, 这就好像幼儿园毕业就不继续读书了一样, 是不对的.
STM32 单片机. 终于到了 STM32 这个当红辣子鸡了, ST 于 2007 年发布了第一款 STM32, 至今已经 11 年了. STM32 是 ARM Cortex-M 内核的单片机, 实际上同样使用 ARM Cortex-M 系列内核的单片机还有很多 (譬如 NXP 的 LPC 系列, 原 Freescale 的 K60 系列, 台湾新唐的 M051 系列, 国内如兆易创新的 GD32 系列等),STM32 只是其中的代表作而已. ARM 这些年风头很强, 在 application 级别的 SoC 中大胜 Intel, 现在手机行业的芯片都被 ARM 吃掉了, MIPS 之类的更是被压的生不如死. 在单片机领域, ARM 的 Cortex-M 系列(M0,M3,M4,M7) 也是大获全胜, 很多半导体厂商都放弃了自己原来的架构转而做 ARM 内核的单片机了. 怎么说呢, 个人觉得 ARM 内核的单片机很适合当前时代, 尤其 STM32 这种, 不管硬件配置还是开发工具都深得市场认可, 普及度越来越高. 强烈建议大学学单片机就学 STM32, 会玩 STM32 很有价值. 至于 GD32 之类国产的类似 STM32 的单片机, 我认为后面会越来越强, 甚至会主导市场把洋品牌赶出中国. 这些芯片的开发方式也很类同于 STM32, 所以会了 STM32 开发很容易切过去, 不用担心.
其他单片机. 我指的是 PIC,ATmega,MSP430,STM8 之类的, 这些不是很熟悉所以不予详细论述. 总的来说, 这些单片机性价比都不错, 在各自领域都有一定竞争力, 但是还是不如 STM32 使用领域宽广. 所以除非是公司研发用到, 否则不建议主动学习.
高性能高价格单片机. 这里我特指的是如 STM32F7,STM32H7,NXP imxRT1052 之类的单片机. 这类虽然是单片机, 但是性能比一般单片机强劲很多, 外设也复杂很多, 甚至需要外接 SDRAM 来提供更大内存, 外接 SLC Nand 或 Spiflash 来提供存储. 同时从价格角度讲这些单片机大多在人民币 30 元以上, 甚至高达 100 多元. 这些真的是单片机中的战斗机, 价格都能吓死人了. 对于这类单片机, 我个人其实很不看好. 其实写这篇长文, 就是想解释我为什么不看好这类单片机. 感兴趣的同学可以继续看下文分析.
嵌入式的技术和市场状况
嵌入式领域目前最火的就是 ARM+linux 和 ARM+android.
芯片都是基于 ARM 的, 低端的有 ARM9,ARM11, 高端的有 Cortex-A7,Cortex-A8,Cortex-A9,Cortex-A53,Cortex-A57 等. 从单核心到双核心, 四核心, 八核心都有. 厂商也一大堆, 国产进口台产等都有. 覆盖面也广, 消费级, 工业级, 车规级都有.
嵌入式级别的 ARM 因为有 MMU 所以可以很好的跑复杂 OS, 因此虽然芯片本身也可以裸机运行, 但是基本没有人用这类芯片来跑裸机或者 RTOS 的. 都会上操作系统. 简单说, 如果产品不需要华丽美观的人机界面就上 linux(譬如路由器, 网络摄像机), 如果需要人机界面但是界面简单注重功能和稳定性, 那就上 linux+QT(譬如工控 HMI, 电动车充电桩, 停车场显示), 如果产品很注重人机交互的用户体验, 那就上 Android(譬如智能手机, 智能电视机, 游戏机等).
总的来说, 嵌入式系统的复杂性高, 开发难度大, 学习曲线长. 因为软件上的复杂性, 导致出 bug 的可能性大. 一旦出 bug 查找起来也更加需要技巧和经验. 所以很多公司用嵌入式 linux 或 android 做产品问题很多, 这一方面和开发者的技术能力有关, 另一方面和公司不能花时间和成本去潜心把产品做稳定做成熟有关.
嵌入式和单片机的真正区别
其实分析到这里, 大家也知道了嵌入式和单片机的真正区别, 那就是有没有 linux 或 android 这类复杂操作系统.
单片机不是裸奔就是 RTOS, 其实玩过 RTOS 和 linux 的同学都知道, RTOS 虽然也叫操作系统, 但是和 linux 这种根本不是一个级别. 差远了, 更不用说 android 了, android 里随便拿出来一个模块代码量都比一个完整的 RTOS 都庞大, 都要复杂. 所以有没有 linux/android 这类复杂 OS 对开发来说真的很不一样.
譬如从 C 语言角度来讲, 我的嵌入式 linux 核心课程第 4 部分4.C 语言深度解析这个课程, 就是专门针对嵌入式 linux 开发中 C 语言功力不足的人推出的. 很多做了多年单片机的同学看了后都感慨, 真的是不做 linux 不知道 C 语言水深. 结构体和指针这些元素在单片机编程中完全体现不出来魅力, 但是在 linux 内核中却得到了完美的发挥和释放. 不去真正研究, 实在很难体会出那种美感和震撼.
嵌入式和单片机的交集
嵌入式和单片机有没有交集呢? 这里说的交集意思是: 某些产品既可以用嵌入式来解决, 也可以用单片机来解决.
以前是没有的. 你想想一般单片机几块钱十几块钱, 而嵌入式系统 SoC 加上 DDR 和 Flash 至少几十块, 怎么可能有交集. 就算单片机能做的事你嵌入式也能做, 但是我十几块钱能搞定的工作凭什么要花几十块上嵌入式呢? 所以以前这 2 者没交集. 根本不是一个档次范围内的事儿.
但是近两年情况发生了变化. 首先是很多高端单片机的配置和价格越来越高. 譬如 2017 年 10 月发布的 NXP imxRT1052 系列单片机, 号称跨界处理器. 为什么叫跨界? 跨的是哪两界?
我们知道单片机嘛, 就要单芯片提供整个 system, 简单说至少 cpu,sram,flash 这三大件不能少, 要不然根本无法独立运行嘛. 所以你看不管是 51 单片机还是 STM32 都是内部有 CPU, 有 SRAM, 有 Flash 的, 这就是典型的单片机. 而嵌入式 SoC 不同, 譬如 S5PV210 内部只有 CPU 和少量 SRAM, 它要正常工作需要外部集成 DDR SDRAM 和 Flash(EMMC). 所以嵌入式的 system 不能在一个 chip 上, 一般典型的嵌入式系统的 system 由一块核心板构成, 这块核心板上集成了 SoC,DDR SDRAM,Flash, 电源模块等, 这叫嵌入式系统. 而所谓跨界处理器, 跨的就是单片机和嵌入式这两界. 这个 imxRT1052 内部集成了 CPU 和 SRAM, 但是没有 Flash, 它需要外部提供独立的 Flash 芯片才能组成一个 system. 所以这东西既不是典型的单片机也不是典型的嵌入式, 但是既像单片机, 又像嵌入式, 所以 NXP 说这个是跨界处理器. 甭管好不好用, 名字听起来酷酷的.
顺便多说一句, NXP 为什么这么设计? 其实是因为单片机内置 Flash 都很贵, imxRT1052 为什么能比同样性能的 STM32 便宜那么多, 主要原因就是因为他没有内置 Flash. 所以很多人都说 ST 落后于 NXP 了, 其实没有. 只能说 NXP 这个设计在单片机界是一种创新, 对比来看显得 STM32F7,STM32H7 性价比太差了. 不过实话实说, STM32 的 F7 和 H7 确实性价比很垃圾, 我都不知道就一个单片机卖一百多是准备上天? 谁给 ST 的勇气这么定价的, 梁静茹吗?
算了, 懒得吐槽 F7 和 H7 了. 就说这个跨界处理器 imxRT1052 吧, 这东西主频有 600MHz, 有消费级和工业级, 带各种外设(反正你能用到的基本都有了), 可以带最大分辨率 1024*768 的 TFT LCD(当然了需要外接 SDRAM 作为显存). 这东西相对于普通单片机来说就是神一般的存在啊, 一般玩单片机的看到这个数据吓得直接就跪下叫爸爸了. 再说价格, 这东西官方公布的批量价格是人民币 30 元左右. 想一想感觉性价比爆棚啊. 其实 STM32 也没那么弱, F7 和 H7 的主频虽然没有 600MHz 那么变态, 但是 H7 的性能整体比 RT1052 并没有太大劣势. 就算不叫爸爸一声大哥总逃不了. 之所以 F7 和 H7 没掀起大浪关键还是价格太吓人了, 一般人听说 100 多直接心里骂娘转身走人了, 根本不想了解你的性能. 而 imxRT1052 的 30 元确实很诱人, 听起来似乎真的是高性能低价格了, 很多人甚至据此判断 NXP 要 "干死"ST 了.
跨界处理器的尴尬
高性能跨界处理器初看似乎很不错, 实际上并没有那么容易成功. 原因就在于这种高性能单片机实际上和低性能高性价比的嵌入式 linux 解决方案比并没有优势.
是的, 很多人觉得 600M 主频的单片机才 30 块很便宜很厉害. 那是因为你不熟悉嵌入式的解决方案. 实际上 imxRT1052 单芯片是不能很好工作的, 他要实现高性能至少需要外置 Flash 和 SDRAM, 就算只是 1Gbit 的 SLC Nand 和 32MB 的 SDRAM, 再加上 RT1052BOM 成本也在 50 元左右了. 再加上 RT1052 虽然号称批量 30 元, 但是实际上小批量拿货价都在 40-50 元, 所以目前市场上 RT1052 的核心板售价都在 120-150 元之间了. 这个价格其实并不便宜, 有很多嵌入式 linux 的解决方案都比这个性价比高.
譬如 NXP 的 imx6ul, 内置 Cortex-A7 单核心, 最高主频 1.2GHz, 也是工业级, 各种你能想到的外设都有了. 标配 256MB SLC Nand 和 256MB DDR 的核心板, 市场最低售价 119 元, 比 RT1052 还低一些.
实际上还有性价比更高的方案, 譬如我们深创客推出的 NUC972 牛顿板中使用的新唐 NUC972 方案, 内置 64MB DDR, 外部配置 1Gbit SLC Nand. 主板批量可以做到 100 元内. 性价比完胜 RT1052 这类高性能单片机.
很多人可能会说, 我不会嵌入式 linux 开发, 我只会单片机开发啊. 所以你 linux 的方案性价比再高跟我没关系, 单片机的才跟我有关系. 我想说这绝对是一种误解, 百分百的误解. 为什么?
单片机就三个字, 你别觉得叫单片机的都是一种东西. 单片机和单片机是不一样的, 你觉得主频 600MHz 的单片机带 1024*768 分辨率的 TFT LCD, 它的开发方式和难度会和 10 块钱不到的 STM32F103 一样? 软件开发是跟着硬件走的, 什么样性能的硬件就应该配套什么样的软件开发方式和相应资源, 也会要求开发者具备某种相应素质. 所以不要觉得都是单片机就亲切, 就能玩. 实际上要把高端单片机完全发挥性能做出好看的 GUI 并且用到项目中解决掉所有的 BUG 并不是一件容易的事情.
结语
这篇文章写的比较浅, 主要是讲了下单片机和嵌入式系统的由来和差异. 引出了高端单片机 (STM32H7,imxRT1052 等) 和高性价比嵌入式 linux 解决方案的的一个对比. 主要是希望抛给大家一个思考点, 引导大家去思考如何分析和评价一款芯片方案, 从而在做项目时能够更好的选型适合自己的芯片方案. 总的来说, 我的观点是: 能用几块十几块的单片机就用单片机, 如果这些高性价比的单片机不能满足要求非要上几十块的高性能单片机, 那你确实应该考虑下是否应该一步到位上高性价比的嵌入式 linux 解决方案. 很多人担心 linux 不会开发, 其实不应该这么考虑. 真正沉下去做项目, 你会发现用嵌入式 linux 并没有那么难, 而且高端单片机加上 RTOS 和一堆框架, 协议栈之后也不简单. 出了问题也不好找. 而且嵌入式 linux 经过多年积累, 其方案稳定性大多都不错. 而高端单片机的配套 RTOS 和框架协议栈等中间件往往处在发展初期, 往往 bug 很多. 因此, 建议大家值得投入时间去学习嵌入式 linux 软件开发的技能.
今天先讲到这, 后续有时间再继续更深度来高性价比的嵌入式 linux 解决方案的各种技术细节.
来源: http://blog.51cto.com/astonzhu/2135684