一位以linux为例的嵌入式大神的学习心得总结(干货)

嵌入式系统是一个非常广泛的定义,从技术层面来说可以分为硬件层,驱动层,系统层和应用层。硬件层,就是原理图、pcb图、电路板那些。
驱动层,主要工作是对mcu寄存器进行读写、总线的使用以及对传感器什么外设的操作等,简单说就是编写直接操作硬件的代码。
系统层,把前面的驱动层封装起来,并弄出个接口(驱动接口),同时加上进程控制、内存管理、文件系统、网络通信四样东西,再把这些东西再封装起来,最后提供接口给应用层。当然,由于嵌入式系统是专用设备,具有可裁剪的特性,所以上面五样东西不一定都有。
应用层,只要是涉及人机交互界面的都属于这里,其中一种就是手机移动开发。
在驱动和硬件这两个层次做出来的产品,我们现在称之为智能硬件。
比如无人机:
简单来看,无人机就是硬件层+驱动层,可能会有操作系统,还有应用层的人机界面。
智能插座也不过是一个单片机+继电器+手机app组成。
嵌入式分为广义和狭义两种。广义的嵌入式就是片上系统(system on a chip),包括单片机、psoc、nios、microblaze等。而狭义的嵌入式就是arm9、cortex a8等特定的跑操作系统的芯片。这里主要介绍狭义嵌入式的学习路线。
还是主流的方法,先学会使用它,再深入研究底层。
常用的嵌入式操作系统有linux、win ce、安卓、vxworks、qnx、ose等,目前资料最多的是linux,所以下面以linux为例。
一、安装虚拟机和linux系统。 一般人用的电脑都会装windows系统,要想在windows上跑其它系统,得安装虚拟机。而目前主流的虚拟机有vmware、virtualbox、hyperv等,你可以随便选一个安装。然后去官网下载个人版的linux镜像(.iso文件)并把它安装在虚拟机里面即可,这里给出主流linux系统的官网链接:ubuntu、fedora、centos、debian、suse。如果你没有用过linux的话,推荐使用ubuntu。因为redhat要收费,并改名为rhel,所以这里不作介绍。
二、学会使用linux常用命令。 这里,必须改改在windows下点鼠标的习惯,在linux下做事得用命令行。此外,在linux下载软件,不需要在百度下载,而是用linux自带的软件包管理工具(如:apt-get、dnf、rpm等)。如果你用ubuntu的话,得修改软件源(下载软件的网址),因为国外的源比较慢,百度上有详细说明。接下来,得学会最基本的命令,如:ls、cd、find、grep、ps、diff、fdisk、ifconfig等。跟着教材多操作几遍就会了,没有很深的理论知识,不需要掌握所有的命令,也不需要记住所有命令的选项,用到的时候会查就可以了。有空的话可以上ubuntu社区或者linux公社。
三、学会使用linux常用工具。 1、编辑器(写代码必备的)。有gedit,vim,emacs,sublime等,推荐学vim。
2、gcc和gdb。gcc是编译器,gdb就是代码调试器。
3、makefile、autoconf、automake。这里可不像vc++6.0这种工具,点个鼠标就给你编译好。在linux下,你得用makefile和make工具,来编译代码。其中autoconf和automake可以自动生成makefile。
4、ssh、tftp。如果你在arm开发板上弄了个web服务器,那么,你就可以用这些工具去访问它。其中,ssh工具建议用securecrt或者mobaxterm。
5、samba。要想用linux跟windows交换数据,还可以搭建samba服务器。
6、版本控制器。有svn,cvs,git等,推荐学git。有了git,你就不必手动备份代码了。
四、学会编写shell脚本。 在实际工作中,复杂的系统管理操作,不会一行一行地敲命令,而是用脚本(命令是基础)。脚本也是一种编程语言,只不过是解释型语言。相比c/c++、c#、java这类高级语言,脚本要易学很多(因为增加了语法糖)。在linux下,shell也有很多种,如:bsh、bash、csh、tcsh、ksh、zsh等,一般是学bash,其它的遇到再学也不迟,因为都是大同小异的。此外,bash语法比较奇特,很多符号(如:$#,$0,$?等)比较难记,不过也没必要特意去死记它,有个印象就可以了,用到的话再查手册,这里重点掌握正则表达式。如果有时间的话,建议再学python脚本,python的语法要容易很多,用途也比bash广很多。
五、学会linux下c编程。 尽管学会bash已经能做很多事情了,但是驱动和内核开发还是用c语言,因为那时候系统还没起来,bash是用不了的。此外,c语言的执行效率比bash要高,网络编程的socket也常常用c语言开发。在这里,得掌握基本的文件操作、进程/线程控制、socket等。推荐《linux环境c程序设计》、《unix环境高级编程》、《unix网络编程 卷1》、《unix网络编程 卷2》,或许这些教材有点难,但是,请不要钻牛角尖,不懂的暂时跳过,在学完下一阶段的理论之后,再来看,之前不懂的东西就变得容易。
六、增强理论知识。 因为有的人打着嵌入式硬件工程师的名号装逼,其实嵌入式硬件就是普通硬件工程师做的工作。我们这里都是讨论软件方面的内容,而且嵌入式是以软件为主导的(工资上有较大差距)。
1、单片机。不想学单片机的话,可以学计算机组成原理。
2、数据结构。主要掌握表和树,其中链表会在操作系统的调度算法中用到。
3、操作系统。全部都是重点,必须深入研究,才会对linux有个较全面的认识。
4、编译原理。有时间的话,最好多看看,没空的话,也得了解一下。对于提高编程能力,有一定的帮助。
5、数据库。除了基本的数据库理论之外,还得掌握sqlite或者oracle。
6、arm体系结构。介绍arm的架构和指令集,在移植uboot和驱动中会用到,不做这两项工作的话,可以不学。
7、计算机网络基础。开发中用到的tcp、udp、ssh、tftp、http、rtp就会涉及到网络相关的知识,也就是socket套接字编程。
8、接口应用。如:串口、zmodem、iic、spi、1-wire、usb、hdmi、can、iis、pcie、蓝牙、陀螺仪等。
学完上面这些理论之后,得再复习一下linux下c编程,你会有更大的收获。
下面第七、八、九阶段,使用开发板自带的bootloader即可,暂时不必研究它。
七、文件系统。 在学习操作系统原理的时候,已经有介绍文件系统了,而且不需要深入研究文件系统的具体算法,只需要了解其特性再学会使用它就可以了。如:nfs、fat32、ntfs、yaffs2、ext4、zfs等。
八、内核裁剪。 一般初学,可以先掌握内核剪裁(具体工作就是填写若干个选项)。剪裁只是去掉内核部分不需要的功能,以减少代码体积。这里只要求你对内核的各个功能选项都很熟悉就可以了。如果剪裁还不能满足要求的话,得阅读内核源码,修改内核了。推荐《understanding the linux kernel》和《linux kernel development》。阅读内核源码,推荐windows下的source insight或者eclipse。
九、驱动开发。 由于系统还没起来,所以驱动能用到的api(内核的部分api,如:kprintk、kmalloc等)并不多,很多函数还是得自己写的,其中,会经常访问临界资源,所以得掌握自旋锁、睡眠锁。此外,驱动程序出问题的话,整个系统就挂掉了,所以还要掌握各种调试驱动的方法,如:goto语句、日志系统、kdb等。接下来就要熟悉掌握字符设备和块设备的驱动程序了。推荐《小白的博客》和《linux device drivers》(不建议看中文版)。
十、移植bootloader。 单片机也有bootloader,在keil c下的startup.a51,主要是做一些初始化工作。那么,在arm上面的bootloader也是一样的功能,同样,也没有那么重要所以把它排在后面。常用的bootloader有vivi和uboot,一般学习uboot,主要掌握uboot的启动流程和移植。在经过前面的学习,那么uboot对你来说已经非常容易的了,一般只需要学会使用uboot或者用已经移植好的uboot,不需要深入研究它。推荐看uboot自带的帮助文档以及《深入理解bootloader》。阅读uboot源码,推荐windows下的source insight或者eclipse。
十一、图形界面开发。 常用的gui图形库有:gtk++、qt、java、安卓等。有c++基础的,建议学习qt,不会c++的,建议学java。在前期的gui开发,可以不需要使用开发板,而2440下适合跑qt,如果要跑java、安卓的话,建议换一块开发板,可以考虑exynos4412开发板。此外,你还可以用python自带的tkinter来开发图形界面。
因为安卓系统是在linux的基础上封装了一层api,所以,如果做安卓驱动,就得掌握linux(上面前十个阶段)。如果只做安卓app,你只需要使用android studio或者eclipse配合安卓模拟器(最好用安卓手机),就可以了,不需要学习linux,也不需要开发板。
在你做过几个gui项目之后,再学习uml和设计模式,这会大大增强你的代码架构能力。
十二、web开发。 有的时候得在arm板上搭个web服务器,这里,得学习html、css、javascript、xml、ajax、php等。看起来内容很多,但其实并不多,因为这些语言都很容易上手。初学可以使用adobe的dreamweaver做开发,上手之后一个sublime text配合firefox浏览器就可以了(还要学习mvc模式)。此外,还得会用bash或者python编写cgi程序,这样才可以在网页上调用到底层的c语言接口。推荐《疯狂html 5/css3/javascript讲义》。
十三、最后 这里没有涉及流程图绘制软件、文档生成工具等(这两个东西在工作中会经常用到)。
由上文可知,嵌入式软件涉及很多计算机相关的知识,就算你掌握了上面所提及的知识,那也只是打开一扇小小的窗户而已,还有很多事情做不了的。比如:二维码识别、视频采集卡等。
嵌入式的工作也分成几个岗位,分别是系统工程师、驱动工程师、软件工程师、ui工程师。
系统工程师:熟悉操作系统的内核原理、熟读内核源码。主要职责为系统打补丁或者添加新功能,如:热升级、提高系统的容错性等。一般的公司是不做这种开发的。
驱动工程师:熟悉各种外设的驱动开发,为内核和gui提供接口。由于很多ic厂商提供了相关芯片的驱动程序,而导致很多驱动工程师下岗(需求量减少)。
软件工程师:熟悉各种编程语言和gui图形库、框架(不是会查文档就可以的,而是要求非常熟悉框架)。由于项目需求经常变更,开发效率跟不上变化,所以软件工程师的需求量大大增加。

过融合编译器和PrimeShield为新兴的高级节点PPA机会做好准备
三菱化学扩充9万吨电解液年产能用于升级工厂的设备
盘点全球物联网的发展态势
安森美M3S EliteSiC MOSFET让车载充电器升级到 800V 电池架构
陶氏化学工厂爆炸 牵动半导体关键耗材生产
一位以linux为例的嵌入式大神的学习心得总结(干货)
华为mate10什么时候上市?华为mate10来临之际,还有哪些黑科技值得关注?
Python怎么玩转JS脚本
Linux下lt9611调试总结
微软应用商店已经发布PowerShell 7.1
一文浅谈智慧林业
锤子两款新机获型号核准 设计完爆前代产品
千方科技开盘涨停 阿里入股近36亿元
索尼一份专利申看到了在电竞领域流露出了全新的野心
车辆控制器的电磁兼容存在问题及解决办法
视障人士的Arduino辅助技术说明
一种消除系统温漂和时漂的设计和实现
华为荣获2022年度金融技术与平台奖项
什么是高频率超声波清洗机?
百望云携手兰格集团签订战略合作协议 赋能钢铁行业数字化变革