From: http://www.infoq.com/cn/articles/intelligent-embedded-os-Internet-of-things-and-robots

嵌入式开发是一个低调的领域。相比Web开发和企业级开发,嵌入式开发这一领域似乎很少在互联网上发出声音。随着智能设备的兴起,智能手环、手表、眼镜、灯泡等产品成为互联网企业的下一个目标,而物联网这一概念再次复苏,嵌入式开发开始引起很多互联网工程师的关注。

那么,现在的嵌入式开发是怎样的?相比十年前、二十年前有什么发展?“物联网”这一大概念下,应用开发者应从何切入?本次访谈,我们邀请到一位不那么低调的嵌入式开发者,来跟我们分享他对这些问题的看法。

嘉宾简介

罗未(Noel),豌豆机器小组(WRTnode machine team)发起人,致力于整合机械设计、嵌入式Linux开发、计算机视觉、机器学习方向,以开源的理念制造智能交互机器,希望为开源社区和大众市场带来 各种伴随人类却又独立于人类的机器。个人出身于行业软件领域,3年前转入硬件方向,经历过智能家居和路由器行业,现希望做一些让未来更近的事情。

相关赞助商

全球架构师峰会,7月18-19日,深圳万科会议中心举办,精彩呈现

罗未2014年全球架构师峰会(ArchSummit)的联席主席之一。有关他的更多介绍可参考技术人攻略对他的访谈:开放制造的机器之心

以下内容根据InfoQ中文站编辑跟罗未的沟通整理而成。

嵌入式操作系统现状

目前嵌入式设备主要分为两大类:MCU设备和带MMU的CPU设备。

MCU(Micro Computing Unit),也就是我们常说的单片机,其特点是Micro:主频大概在几十MHz,内存在几KB,Flash非易失存储也是几十KB,资源小,价格便宜。 单片机这个领域从80年代、90年代开始就一直有人玩,像是玩具、闹钟、计算器、电子表、工业控制等很多领域都有用到,应用广泛。单片机程序的特点是逻辑 简单、实时性强没有等待,不像Linux那样会存在资源被其他程序占用的情况。

早期单片机程序一般都是裸写C代码的方式,用一个大循环把所有事情搞定,所有的底层功能——如资源分配、进程调度、DNS查询、域名转换等,都要手写实现。前几年开始有一些基于MCU的操作系统,比如μC/OSRT-Thread等,单片机有了操作系统就相当于资源分配、进程调度等工作不用手写了,可以交给系统去管理,程序员不用去管任务间协调的问题。这可以看作是第二代单片机开发环境。

近几年有一些新的单片机操作系统,比如Contiki,这套系统的特点是把互联网特征作为基础的构建。这套系统很牛,用10KB以内的内核就提供了对HTTP、TCP/IP等协议的支持,让单片机上来就可以联网,让单片机开发者绕过了每次都要裸写这些基本功能的痛苦。

现在的单片机有些很神奇的应用,比如图像识别、语音识别,可以做到在视频上识别色块的程度。但是,单片机如果又要做图像识别又要上网,就会非常吃力,毕竟资源十分有限,需要有很高的开发能力把它们协调好,这种情况下就不能用操作系统了。

以上是单片机的情况。另外一种是更大一些的,就是自带MMU(Memory Management Unit,内存管理单元)的设备。这种设备的主频一般在几百MHz以上,内存在几十MB以上,早些年的智能手机就差不多是这个配置,跟十几年前的PC机配 置差不多,所以安装运行Linux系统是没有问题的。这类设备其实也做了十多年了,现在用的比较多的架构有两个:ARM和MIPS,都是商业的,现在新的 硬件基本上都是这两种架构。

有很多发行版都专门为ARM做过安装包,比如流行的Ubuntu和Debian。无论是ARM还是MIPS,因为有了系统,开发起来要比在单片机上 舒服多了,但也仍然有一个很麻烦的地方,那就是要做交叉编译。开发者一般都是在自己电脑上——大部分是x86架构——完成开发的,因此要用x86上的 ARM编译器交叉编译出ARM的二进制文件,用MIPS编译器交叉编译出MIPS的二进制文件,才能在设备上运行,这为调试带来了不小的麻烦。为什么我们 这个圈子门槛比较高,就是因为一般都是掌握了交叉编译的开发者才会进来玩。不过好在有一个叫做GDB(GNU Debugger)的工具可以做远程调试,减少一些麻烦。

物联网终端需要完成的工作

现在在有一种M2M(Machine to Machine)的思路,在终端用可以联网的单片机做最简单的事情,比如开关一个灯泡;终端直接跟家庭网络的网关(路由器)连接,或直接跟公网的云端连接,由云端做更复杂的计算和处理。

这种思路可以解决一部分问题,但是我觉得还不够。终端需要做更多的事情。

我认为终端需要是智能的,它们需要达到“机器人”的层面。现在我们说的机器人跟以前大家理解的那种人型机器人不同,现在所说的机器人是一种复杂控制系统,是软件,可以跑在各种各样不同姿态的设备上。机器人需要完成三项工作:

  1. 感知:从传感器采集数据
  2. 交互:网络传输(如HTTP、TCP/IP)和物理控制
  3. 智能:如图像识别、语音语义的理解、智能规划,需要抽象成智能的算法

现在的机器还处于太过依附于人类的状态,需要人告诉他要做什么。我觉得未来的机器应该自己知道要做什么事情。现在的人工智能、知识图谱的建立就是奔 着这个方向去的,比如Google工程师训练机器,让机器在Youtube的视频里认识猫,这个涉及到一个很大的知识库和训练过程,需要云端的协助。但最 终训练出来之后,其实猫的图像识别特征数据是很小的,可以放在终端的机器人里,他们自己就会认识猫了。这就好像婴儿的学习过程一样。

但是跟婴儿不同的是,机器天生是执行器。所以结合认知能力,让机器认识猫了之后,加上执行,是不是可以让机器自动的去抓猫或者逗猫玩?机器认识电梯 之后,是不是能够自己去按电梯?机器认识无线充电站后,是不是能够自己跑到无线充电站上面蹲着充电?随着知识图谱的建模完善,事物和事物之间的联系能够被 机器理解,机器人会变得越来越强大,越来越重要。

其实现在语音语义的知识图谱建设已经相对完善了,机器已经能够理解一些上下文之间的关系,比如你说到吃苹果,他就知道你说的是什么意思。我们现在在语音语义+网络这块直接使用了讯飞的服务,我们把工具链给他,他们帮我们生成了一个二进制包给我们,就很方便了。

技术上的挑战

上述这些工作当中,有些单片机可以完成的很好,有些不能。单片机可以采集一些简单的数据如位置、高度、重力加速度、四轴姿态、温度、湿度等,进来都 是数字,只需要做AD转换。比较复杂的数据如声音、图像,单片机处理起来就比较困难,一般我们通过Linux的USB驱动来跑,需要MMU的芯片。但是单 片机有一个特征是Linux无法满足的,就是实时性。很多物理控制对实时性的要求很高,比如四轴飞机的控制,严格要求50Hz的控制频率,即一秒进行50 次计算来决定下一帧的动作,如果稍微有点资源抢占造成延迟,飞机就掉下来了。

为了同时达成实时计算+复杂性这两个目的,我们只好把两个芯片加在一起。但是两个芯片在一起,就成了一个分布式系统,有芯片级的通信问题,同时开发 者还需要写两套代码,又要写单片机的交叉编译,又要做Linux开发,各种调试和测试的困难。Arduino现在已经有一套挺完善的思路:首先它的传感 器、控制器的库都很全,然后它做了一个ArduinoYUN的板子,就是一个OpenWRT(一个超级精简的Linux发行版)+单片机的双芯片板子,然后它有一个万用固件——一个支持firmata协议的 库,算是一个翻译,只要符合这个协议就可以从Linux控制Arduino,算是一种思路。但是我觉得这个思路有两个问题:第一,ArduinoYUN的 思路是以MCU开发为主,把OpenWRT当做单片机的透传模块,为单片机提供网络服务。放着强大的芯片在一边,用小小的单片机跑主程序,感觉未免太浪 费。第二,firmata协议虽然简化了控制,但是又影响了实时性,在实时性要求较高的时候(比如四轴飞机),这种思路又无法满足需求了。

现在一些芯片公司已经开始意识到这个问题,开始考虑如何把两者封装成一个芯片,来满足实时性+复杂性的结合。我认为封装后应该要以Linux为主要的开发平台和软件运行平台,以MCU作为辅助以满足实时性需求。

所以,实时性+复杂性的结合是第一个挑战。第二个挑战是复杂运算的加速,比如H.264/H.265的视频压缩、图像识别的硬件加速,要不要放在机 器人的芯片里?我觉得是需要的,但是不需要手机那么强的GPU,有一个视频压缩的芯片放在里面就可以。终端如果能做视频压缩,多半也能做图像识别,那么终 端机器人可以做的事情就更多。

第三个挑战是针对Linux内核本身的,就是在这种级别的计算平台上如何进行更合理的裁剪、做更合理的算法策略、执行策略。OpenWRT的开发版 现在我们做到64MB的运行时内存占用,而一般的路由器芯片都是16MB、32MB。其实内存的空间占用倒不是大问题,因为现在内存很便宜,就算用到 128MB、256MB也没什么,但是关键在于时间片的占用。所谓省资源其实就是两个意思:少占地儿+少占时间,这样才能低延迟。所以Linux内核如何 解决这个问题,也是一个比较大的挑战。

这三个点可能是未来几年这个产业很多人的努力方向。

总结

相比十年前裸写C代码的场景,现在我们有图形化的界面,有RESTful API,嵌入式开发的难度可以说已经大大降低了。虽然有上面提到的基础设施与开发工具的挑战,但我认为用不了几年时间也都能解决。网络连接现在已经基本不 是问题,3G、4G、Wifi已经足以支撑大部分智能设备的应用场景。

但是,仅仅有这些,到“智能的物联网”有很大的距离。机器需要学习更多、建立更多的知识图谱,才能变得更加强大。现在云端还没有太多现成可用的知识 图谱,但我们仍然可以先从简单的事情做起,比如让机器人扫地,让机器人把空瓶子扔进垃圾桶,一点一点的改进它们。也希望有更多的开发者能够加入这一进程, 让我们的世界变得更加完整。

相关资料

ArchSummit全球架构师峰会即将于7月18-19日在深圳举行,此次会议重点解析九个当前最受关注的领域,包括:SNS、 移动互联网、 金融、 大数据、 智能硬件、 游戏、 云计算、自动化运维、电商等专题。目前正在火热报名中,感兴趣的读者可以访问网站主页了解更多信息。

嵌入式开发 MCU的更多相关文章

  1. 嵌入式开发—C语言面试题

    嵌入式开发—C语言面试题 源地址:http://blog.csdn.net/xdx2ct1314/article/details/7358929   1. 用预处理指令#define 声明一个常数,用 ...

  2. Mac下搭建基于PlatformIO的嵌入式开发环境(STM32开发)

    PlatformIO简介 PlatformIO是开源的物联网开发生态系统.提供跨平台的代码构建器.集成开发环境(IDE),兼容 Arduino,ESP8266和mbed等 支持在Windows.Lin ...

  3. 嵌入式开发中常见3个的C语言技巧

    Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光 ...

  4. [嵌入式开发]Linux性能分析——上下文切换

    一.从一个问题说起 相信很多人在玩手机还是PC时,都曾碰到过这样一种情况,安装的软件多了系统性能就变慢了,但是去查看CPU利用率一直都低于10%,内存也很充足.我在近期的开发工作中就碰到了类似的情况, ...

  5. ARM嵌入式开发板

    iTOP-4412 ARM嵌入式开发板----主要特点 iTOP-4412开发平台是北京迅为电子研发设计的嵌入式开发板平台,核心板配备64位双通道2GB DDR3,16GBEMMC存储,三星原厂S5M ...

  6. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  7. 嵌入式开发平台-iTOP-4418开发板

    详情转自:http://topeetboard.com S5P4418核心板可以无缝支持核心系统S5P6818,并保持底板设计不变,将兼顾更高端 的应用领域,为项目和产品提供更好的灵活性以及可伸缩性. ...

  8. zju(1)嵌入式开发环境构建

    1. 实验目的 搭建嵌入式开发环境,安装ubntu,编译交叉工具链,安装配置tftp,nfs.用makefile 编译几个文件,在实验台上运行. 2. 实验内容 1) 安装ubuntu12.04 2) ...

  9. 专访Linux嵌入式开发韦东山操作系统图书作者--转

    CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...

随机推荐

  1. SpringCloud文章

    ZUUL路由服务遇到的坑:https://www.jianshu.com/p/2af5171fa2f3 springcloud----Zuul动态路由:https://blog.csdn.net/u0 ...

  2. 自旋锁Spin lock与互斥锁Mutex的区别

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...

  3. vue is detected

    Vue.js is detected on this page. Devtools inspection is not available because it's in production mod ...

  4. os模块与 sys模块

    os模块是与操作系统交互的一个接口 ''' os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作 ...

  5. DP设状态 : 状压与线

    [NOIP2017]宝藏(状压) [AHOI2009]中国象棋(状压) [BZOJ1814] URAL1519 Formula 1(插头\(DP\)模板) 新链接 : Luogu5056 , dark ...

  6. BZOJ - 4520 K远点对

    题意:已知平面内 N 个点的坐标,求欧氏距离下的第 K 远点对 维护大小为2k最小堆,KD树的估值用前面提到的做法 PS.网上有人估价是使用边界四个点的最值来独立枚举,然而这样写似乎过不了 #incl ...

  7. SGU - 495 概率DP

    题意:n个带礼物的盒子和m个人,每个人拿一个盒子并放回,如果里面有礼物就拿走(盒子还是留下),问m个人带走礼物的期望 #include<iostream> #include<algo ...

  8. 6.ConcurrentHashMap jdk1.7

    6.1 hash算法 就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所 ...

  9. C# 判读取得字符编码格式

    FileStream fs1 = new FileStream(folder + strPath, FileMode.Open); byte[] bytes = new byte[fs1.Length ...

  10. 啊啊啊啊啊啊啊今天就写,炒鸡简单 数据库Sqlite的创建,库的增删改查

    啦啦啦啦啦啦啦 写这个不用多长时间,我直接写代码注释都是些语句,Sql语句和Api来操作数据库 ,语句的参数我会注释 SQLite数据库创建数据库需要使用的api:SQLiteOpenHelper必须 ...