动手学树莓派第1章:先唠叨两句

嵌入式未来10年的如何发展

截止到2018年,嵌入式系统发展一直处于不温不火状态,还记得2012年在读硕士期间,老师曾给过两幅图片:一幅高楼大厦、灯火通明、另一幅小小的村落、点点灯光。高楼大厦代表的互联网行业,一直处于蓬勃发展;而嵌入式则一直处于小村落状态。但万事万物的发展都是由逐步的量变转为质变,目前嵌入式蓬勃发展的三个基本条件已经成熟,未来的嵌入式必将迈入AIOT(AIOT=AI+IOT)时代。

咱们先看看三个基本条件:算力的提升和SOC的成熟、5G的商业化普及、硬件友好性深度学习算法的逐步成熟。

1.算力的提升和SOC的成熟。

1981年,intel公司制造MCS-51单片机,把我们带入了嵌入式世界。

记得2009年大四由于毕业设计的需要,购买了一套郭天祥老师的《51单片机C语言教程》图书和配套开发板,从那时起,开启了我的嵌入式世界之旅。

经过大学四年的努力,如愿的考上研究生。研究生期间,第一个项目就是用STC89C51单片机,借此机会好好把郭老师的课程消化了,记得当时STC公司提供的单片机内置1KByte的RAM、8KByte的FLASH,内置定时器、ADC等外设,感觉太棒了、这块单片机拥有了一起,经过了半年的测试实验,交付用户,第一个项目还算不错,达到用户的要求;在产品的后期,由于新增不少功能,引入了RTX-51操作系统,引入了多任务的概念,让我第一次见识到,原来单片机可以这么玩,操作系统这么好用。第二个项目就是使用MSP430F149(从8位单片机升级为16位单元机了)给海洋平台做传感器数据汇总、本地存储和远程发送,主要使用MSP430的低功耗特性。项目中期由于功能复杂和出了一次问题,引入了ucos-II系统(由RTX-51升级为ucos-II),利用其多任务的特点,成功的解决了“前台main函数-后台中断”满足不了当前项目多任务的要求(主要还是修为不够,靠外力弥补);这个项目也成为我的毕业论文。这里要感谢我的导师唐达老师和好战友何峰同学,唐老师给予了我们最大的资金支持和项目自主权,让我看到了我具备的能力;我和峰峰同学分别负责一个大项目中的2个子项目,与峰峰同学共同进行了一场嵌入式冒险之旅,最后安全抵达终点。

2012年毕业,进入了工作岗位。工作后,继续从事嵌入式系统开发,处理器升级为了ARM、MIPS,使用过AT91RM9200(ARM9)、AT91SAM9G45(ARM9)、LPC4357(Cortex-M4、M0双核)、LS2K1000(龙芯MIPS处理器);在AT91SAM9G45上,开始了我的linux之旅,从此让我无法自拔的迷恋上操作系统,终于可以玩大型系统了;在工作中,接触到SylixOS系统,这个真正的我国自主可控强实时系统(SylinxOS对标VxWorks系统,在已在安全性要求极高的航空、航天、电力和高铁等领域应用;我深入看过源码,SylixOS不是linux系统加个“外壳”、也不是VxWorks系统加个“外壳”,是系统作者一点点打磨、历经十年时间练就的一把利刃,系统作者的精神也让我明白,任何事情的成功不是偶然的,只有坐得起冷板凳,静下心来沉淀自己,才能开启属于自己的辉煌。同时,也更加坚定了我静下心来做一些属于自己的事情,比如现在我正在做的“品树莓派系列”教程。希望后面有机会可以与大家一起品品SylixOS)。在2013年底,由于项目需求开启了我的linux之旅,经过险滩暗礁、也有山穷水尽疑无路时,最终还是咬牙坚持下来,看到了黎明的曙光,这要感谢我的组长宋庆国和部门领导张晓明,组长给予了专业的指导,让我脱离险滩、避开暗礁,看到了属于自己的linux系统;张部长付出了极大地耐心和关怀,为我们年轻人的成长保驾护航。航天系统的6年经历,让精益求精、打破砂锅问到底的精神深入到我的骨髓中。(归零:航天系统专有名词,就是要把搞清问题机理、问题现象可稳定重复复现、更改措施有效、同时进行举一反三、其他产品是否有类似问题,杜绝此类问题再次发生)

2018年,离开了学习、工作了6年的单位,进入了一家初创性企业,继续从事嵌入式系统开发。现在已经入职一年多了,这一年多的感受就是,不论何时何地一定要多读书、读好书。由于公司是哈工大孵化的企业,可以继续与学校老师进行交流(本人始终迷恋着校园里的书香气)。从与公司高层和学校老师的交流中,让我深深的感受到,领导和老师们从未停止过学习,一直紧紧跟随着时代的发展,与彭宇老师的一次交流中,彭宇老师要求我们年青一代一定要博览群书,火花总是在学科交叉中产生。于是,继续开始停止了1年的读书行动,并带着孩子一起读书(坐在沙发上,人手一本)。在工作中,接手了zcu102系统预研工作,zynq系统SOC为我开启了另一扇大门,一枚小小的芯片既有通用CPU的PS端、又有FPGA可定制逻辑的PL端,之前形成在工作中总结的系统架构已经被我敲碎(稀碎),现在是时候重新建立新的系统结构了。zynq系统的魅力在于,系统架构师可以将之前需要并行处理的复杂算法,使用PL端的硬件逻辑来实现,做到真正的并行化,例如,深度学习中的卷积乘法,用PL端来实现,可以提供同等功耗下比CPU和GPU更强大的算力。同时,xilinx公司提供的vivado高层次综合(HLS),让嵌入式工程师用C/C++来快速、高效的在PL端实现自己的算法(感觉就像当年C语言替代汇编语言,成为系统开发到主流,由编译器负责C语言到汇编的转化)。

10年的嵌入式之旅,看到嵌入式处理器性能的逐步提升(主频从几十M到上G,核心从单核到多核)、操作系统赋予嵌入式处理器新的灵魂、承担的更多、更复杂的任务。当前借助HLS的助力,把FPGA带入嵌入式工程师的世界,已经开启了智能嵌入式时代。

2.5G商业化普及。

2019年(今年),美国亲自出面,动用国家的力量制裁我国的华为。究竟为什么一个超级大国要动用其所有的力量,制裁一家企业?重要因素之一就是5G(推荐阅读《5G时代:什么是5G,它如何改变世界》,中国人民大学出版社出版)。书中介绍,从1G到4G是量变,是通信速率的提升,而5G是质变,带来的是万物互联,6G是5G的量变,对5G的改进。所以5G是关键,这就是为什么美国不惜一切代价制裁、整垮华为(华为是整不跨的,借用并更改下格力的一句广告词”华为掌握核心科技“)。5G的高速度、泛在网、低功耗、低时延的特性,让万物联网上升为万物互联的阶段。其物联网的边设备和端设备必然是高性能、低功耗的嵌入式设备。5G必将助推嵌入式进入一个万丈高楼、灯火辉煌的蓬勃发展阶段。

3.边缘端深度学习算法和硬件有好性深度学习算法的逐步成熟。

人工智能到2019年为止,共经历了3测浪潮,从单层神经网络到多层BP神经网络再到现在的深度卷积神经网络,当前正处于深度卷积神经网络浪潮中。2016年AlphaGo战胜了职业九段旗手李世石,可谓轰动全球,让人工智能进入了公众的视野。当前,任何事情不带着人工智能,就是out。期间,各研究机构进行了基于当前网络模型的裁剪工作、定制专用的NPU协处理器,但与学校交流中发现,深入理解深度网络模型、从模型中甄选硬件友好型神经网络模型进行修改、实现,是一条很不错的选择。但这要求工程师具有极高的内功修为,从整体上把握系统,选择合适的神经网络模型,把算力合理的分配到PS、PL端进行,实现边缘端高能效计算。我当前的工作重点之一就是,继续深入理解神经网络模型,学习HLS工具,将结合需求,合理的利用PS端和PL端资源,实现边缘端的高能效计算。

未来是AIOT时代,更是人才的竞争。时代对人才有了新的要求,您是否准备好了呢?

成为时代的弄潮儿,不做局外人

AIOT时代已经来临,但我们该如何深入其中呢?如何不断地提升自己技能的层次,不被时代淘汰了?That’s a good question.

站在AIOT的山脚下,抬头望去,高耸入云的山峰,从山脚下根本望不到顶峰。必然会发出,路在何方的感叹!的确,路在何方呢?

作为一名嵌入式世界里的老鸟,有义务、有责任带领新手们一起攀登这座高山,我已经走过的弯路,可以带领大家避开;但毕竟我也在攀登的途中,对于没走过的路,我也会先行探路,分享出我的经验教训。

全部旅程我准备按照如下路线,带领各位攀登这座高山、欣赏途中的美景。

(1)用python开始我们的旅程,使用python简单、快速、形象的理解操作系统为我们提供了便利,如何使用多任务、如何指挥他们协同工作;同时借用树莓派和NXEZ扩展模块,通过led灯、温度传感器、数码管等形象的展示出来;然后,咱们利用RPi模块,初探python库是如何使用操作系统提供的API(操作系统以c语言方式提供API接口);最后,简单介绍深度学习包含哪些方面的工作,并在树莓派上使用tensorflowlite使用深度学习来进行图像分裂。在获取树莓派4B和Movidius2神经网络棒后,完成具有实用价值的给予树莓派+Movidius2嵌入式深度学习目标识别系统,使用的网络模型为yolo(后面准备使用fpga来实现yolo网络)。

(2)用C语言继续向上攀登,掌握C语言的基本语法、同时我会将C语言的核武器——指针传授给大家,指针是向上继续攀登探索内核必备核武器;然后,按照与python之旅相同的思路,使用C语言理解操作系统提供的工具,并深入解析python库使用操作系统提供的API;最后,咱们分析下yolo作者分享的yolo开源的c语言版网络分析计算过程,逐层讲解模型和参数,为后面使用HLS在ZYNQ上用硬件实现做准备。

(3)有了python和c语言从应用层看操作系统的实践经验,咱们基本明白了操作系统给我们提供哪些服务,下面让我们继续攀登,探索linux内核。这部分会一起欣赏内核中内核驱动和系统调用接口两部分,看看内核如果操作led灯、温度传感器、数码管等外设,如何给应用程序提供系统调用接口,系统调用接口与API什么关系,我们该如果定制自己的内核驱动;同时,咱们看看内核如何使用c语言实现面向对象的思想。

(4)欣赏完内核驱动后,咱们继续前行,进入到内核核心区域,这里有进程管理、内存管理、虚拟文件系统、网络协议栈四个著名风景区,我会主要讲解进程管理、网络协议栈两部分,概要讲解内存管理、虚拟文件系统;这里我们换个角度,从算法角度,看看散列表、二叉树、B+树等如何在内核中应用,激发咱们对算法的兴趣。其中,我会带大家完整的从应用层api到tcp/ip协议栈再到网卡驱动近距离的走一遍,看看无处不在的网络是什么样子的。

(5)参观完cpu端的部分美景后,估计你具备了自行浏览cpu端其他景点的能力,这里你需要博览群书,整理出自己的cpu端体系架构;我的感受就是,看到一片处理器,我看到的是第一层cpu通过片上总线协调各外设工作;第二层内核定时进行进程管理、内存回收等工作,同时将外设中的数据放到内存中,唤醒相应进程工作;第三层,进程按照用户的意愿进行工作,如果需要协调,则想内核发送报告,内核负责对通信和同步。

(6)自行参观完cpu端景点后,咱们继续前行,AIOT这座高峰就在我们前面。嵌入式出身的探索者,可以按照先PS端、然后是深度学习网络模型学习、最后是PL端学习。使用的配套硬件,准备使用sipeed公司的“荔枝糖hex zynq7020 fpga开发板”。对于PS端开发,按照树莓派的思路进行从python开始、经过c语言、内核驱动,最后是内核核心区域。

(7)我们继续攀登,前面是一个完全新的领域,深度学习领域;在当前的深度学习包含三种工作:①大牛研究深度网络模型改进模型,②我们理解大牛的网络模型,利用其模型的特征提取能力,在网络输出端更改为自己的分类,然后用自己的数据集进行训练自行添加层的权重,③将已经训练好的模型,借助HLS使用FPGA实现,实现高能效计算。对于第一点,作为芸芸众生的我们恐怕功力不够,容易走火入魔;但我们可以做第二、三点工作,让深度学习移植到嵌入式端,在嵌入式端工作,让嵌入式更智能。

(8)领略的深度学习的风采后,我们要借助HLS在FPGA上实现我们的网络模型,实现一个低功耗、高性能的边缘端智能处理平台,初步实现AIOT。

以上是我能带领的全部旅程,当然我现在刚刚攀登到第(7)层,准备安营扎寨,细细品味眼睛的美景。我会继续努力攀登,争取早日到达第(8)层,同时与大家分享一路的风采。

当然,即使到了第(8)层,还有更高的山峰在远方,我似乎能隐约看到,远方有座“数学”的高峰,平静、安详而美丽,希望此生能到达那里,摆脱具体技术的束缚,用“数学“的角度,重新理解这个世界,此生足以。

课程内容

本课程是AIOT攀登之旅的第一站——《动手学树莓派——python上篇》,用python快速上手树莓派和操作系统,从应用层理解操作系统提供的工具。完成本课程后,您可以快速掌握、部署“树莓派官网”或者“树莓派实验室”提供的其他例程,达到授人以渔的目的。

本课程面向的群体:

(1)在校大学生。希望本课程成为计算机体系结构、操作系统、计算机网络、python编程语言等课程的课外实践课,在树莓派上不断地试错,在动手中理解计算机系统。
(2)嵌入式工程师。如果您之前从事无操作系统的单片机开发,您想继续了解高性能嵌入式处理器配合操作系统能做什么,本课程可以带您进入操作系统世界,看看除了“前台main-后台中断”设计模式外,程序有了多任务后,应用程序系统设计如此清晰、如此美丽。
(3)电子技术爱好者。您可能无意间发现自己有电子技术的天赋,但苦于没有系统性的计算机课程学习,本课程可以为您提供系统学习计算机优质图书推荐,当然本课程也是结合优质图书设计的动手实践课,您可以在学习理论知识的同时,使用本课程进行实践,因为“实践是检验真理的唯一标准”。
(4)在校中、小学生。计算机是个神奇的世界,记得我小时候幻想自己有个万能的玩具,可以控制一切,现在已经有了,它就是树莓派,希望本课程可以带您进入计算机的世界里,初步的感受万物可互联、万物由我互联的神奇世界,在本课程之后,您可以尽情的将“树莓派官网”和“树莓派实验室”提供的作品逐一尝试,并分享给您的朋友们。

本课程参考的图书:

(1)《深入理解计算机系统(第三版)》,作者:(美)兰德尔 E.布莱恩特(Randal E.Bryant)等,机械工业出版社出版。
(2)《操作系统:精髓与设计原理(第6版)》,作者:斯托林斯(William Stallings),机械工业出版社出版。
(3)《计算机网络(第5版)》,作者:[美] 特南鲍姆,[美] 韦瑟罗尔 著,清华大学出版社出版。
(4)《计算机网络:系统方法(第5版)》,作者:美 拉里 L 彼得森 Larry L 著,机械工业出版社出版。
(5)《Python学习手册(第5版)》,作者:马克·卢茨(Mark Lutz) 著,机械工业出版社出版。
(6)《Python编程(第4版)》,作者:[美] Mark Lutz(马克·卢茨) 著,中国电力出版社出版。
(7)《UNIX环境高级编程(第3版)》,作者:[美] W. Richard Stevens,[美] Stephen A. Rago 著,人民邮电出版社。
(8)《UNIX网络编程:卷1+卷2》,作者:[美] W.理查德·史蒂文斯(W.RichardSt 著,人民邮电出版社。

致敬学习过的网课

在嵌入式之旅中,感谢给我指点的网课,让我找到了正确的方向,继续探索下去,现推荐给大家。
(1)郭天祥老师的《10天学会单片机》,带我进入了嵌入式的世界。
(2)国嵌的《嵌入式LINUX视频教程》,带我进入了操作系统的世界。
(3)算法时空《算法导论》,帮我构建一个完整的属于我的计算机世界。
(4)“炼数成金”黄校长的《大数据算法导论》用浅显易懂的方式让我更形象理解算法,黄校长的《机器读心术之神经网络与深度学习 》带我进入了深度学习的世界中;同时,让我感受到数学的强大,让我立志此生一定要克服一切困难、进行一趟数学之旅。
(5)亚马逊李沫老师的《动手学深度学习》,将我从黄校长学到的理论知识,进行完整的实践。同事本套系列课程也是受李沫老师的启发,使用jupyter-notebook,边讲边演示。个人觉得亚马逊的gluon是个很好的深度学习框架,希望亚马逊是否可将该框架将移植到树莓派上,可以进行嵌入式深度学习教学。

请拿起图书,放下手机,翱翔知识的海洋
很多人会有疑惑,读书为了什么?

读书最重要的意义在于:读书可以明智,可以让自己看清事物的本质。

还有人会疑惑,我读了书,但是没觉得有什么用啊?

读书就像吃饭一样,食物组成我们身体的物质基础,吃的不好,身体就会发育不良,吃错了,就会得病;读书也一样,组成我们的精神世界,读的好、读的对,精神时间才能茁壮成长,人与人的交谈,就是两个精神世界的交流,“腹中有书气自华”就是这个道理。

“每个优秀的人,都有一段沉默的时光!那段时光,是付出了很多努力,却没有开花结果的日子,我们把它叫做扎根!”——习近平

借用习大大的对年青一代的赠言,正式我的的神奇的登山之旅吧。

致敬

本课程用攀登知识的高峰,致敬吴京大哥的《攀登者》,京哥用自己的一系列优秀作品将硬汉精神推向了新高度,我们需要这种“不畏挫折、不惧强敌、勇于承担、敢于牺牲”的新时代硬汉精神攀登我们的高峰。

课程 bilibili 视频地址:https://www.bilibili.com/video/av71878718/?p=1

返回课程目录

课程 gitee 地址:https://gitee.com/shirf_taste_raspi/shirf_serial_share