gzyueqian
13352868059

粤嵌嵌入式培训班学员怎么学习嵌入式Linux的心得总结

更新时间: 2018-11-07 15:10:54来源: 重庆嵌入式培训浏览量:5133

    从今年年初入职到现在有半年多的时间了,接下来我就给大家简单分享一下我学习嵌入式Linux的心得及对自己学习嵌入式Linux的一点理解。本人也是从参加粤嵌教育培训才开始接触嵌入式Linux,经过培训老师的讲解、自己平时查阅资料以及实际工作中的接触,对嵌入式Linux认识也逐渐加深。下面把自己的认识过程简单说明一下,可以供刚入门的同学参考。


    1、学习嵌入式Linux是一项系统工程,不要想着几个月或几天可以搞定。随着对嵌入式Linux认识的深入,你会越来越觉得这是不可能的(跟智商没关系),因为涉及的知识点实在太多。那我们是不是要把所有的知识学完才能工作,这个到没有必要,因为实际工作(某个岗位)不需要那么多知识。所以,把教学大纲内容的掌握了,应该可以胜任某些初级工作。
    2、如果从事底层开发,与硬件打交道,你需要对CPU架构有个大概的了解,因为要让系统跑起来,你必须知道嵌入式Linux的引导过程。通常ARM架构和X86的引导过程还是有差异的,尽管原理差不多。我们在培训的时候主要接触的是ARM平台,但有可能工作时接触的X86架构,因此你除了要知道U-boot如何引导ARM平台的嵌入式Linux内核,还要知道grub如何引导X86平台下的嵌入式Linux内核,因为当前嵌入式Linux主要发行版基本都是采用Grub2来引导。有时间需要了解一下grub2,可能还要知道MBR、EFI等,这些是X86平台的BIOS相关的知识。掌握了这些你才能在开发平台上安装系统,不管什么平台都能搞定,才能以不变应万变。上课时,可能老师会讲init进程,但我要告诉你,如果你实际遇到的init行为跟上课时不一样,不要奇怪,因为现在发行版的init已经被重写了好几个版本,上个时讲的是Sysv标准。现在发行版init虽然部分兼容sysv,但变化也是非常大的。具体的可以上网搜索UpStart 和 systemd。
    3、我们的主要工作不可能仅仅安装一个嵌入式Linux操作系统,通常主要工作应当是设备驱动的移植或开发。这个需要的知识就比较专业了,不是简单套用一下字符设备、块设备或网络设备能搞定的。需要熟知硬件设备的工作过程,如何设置寄存器,寄存器的地址是什么,这个就要“肯“芯片的datasheet和考验个人E文的能力了,有可能读了一遍不知所云。还要熟悉相关标准和协议(比如:pci、usb、i2c、spi等),这有可能又是几百或上千页的文档需要阅读。再者就是嵌入式Linux相关子系统的实现,比如tty、gpio、i2c、usb、pci、net、blk等,因为终你的驱动代码要调用这些子系统的内核代码,你不能仅仅参考模板代码,因为那样如果出现问题,你将束手无策。
    4、文件系统可以说是嵌入式Linux的灵魂,因为有人云嵌入式Linux中“一切皆文件”。不要觉得只有磁盘上才存在文件系统,内存中也有文件系统,而且有很多。典型的sysfs文件系统就是内存文件系统,搞嵌入式Linux驱动开发,sysfs文件系统是必须要掌握的,他和驱动程序的关系不是一般的密切,了解sysfs文件系统就必须了解Kobject对象体系,这个体系的内容也比较丰富。
    5、 实际项目开发设计多的就是通讯设备,除了板上的spi、i2c通讯外,设备间的通讯主要为串口(RS232、422、485)、网口(802.11)以及无线通讯(wifi、bt、3g、4g),这些通讯协议即使不能完全掌握,也要了解大概。
    6、驱动开发可以参考模板,但调试驱动是没有模板参考的。驱动程序开发的真正的能力是体现在解决问题的能力,你不可能凭空想象和猜测哪里出问题了,需要有手段。这就要用到调试方法、手段了,还有就是对内核相关驱动架构要非常清楚,能够通过内核消息,定位问题大致位置。如果你的硬件知识过硬,不仅不需要和硬件工程师扯皮,还可以“谦虚的“地提示他,硬件哪里可能是有问题的。
    7、 如果实在搞不定,不要忘记找“度娘“。以我的经验,应该可以找到80%的答案。
    8、分享一个实际项目—PCI总线转16串口卡。一看项目的名字,就知道是与PCI总线和串口有关,PCI总线是X86平台上常用总线,现在已经发展到PCIe了,PCI是32/64位总线而PCIe是串行总线,但速度更快(3.0版的1x带宽达到8.0Gbps)。协议上PCIe是基本兼容PCI的,所以嵌入式Linux内核中采用是同一个架构。现在PC、工控机上的千兆网卡、SATA3.0等基本都是采用PCIe转化,只有这样才能满足带宽要求。至于串口部分,如果开发过Uart(8250)驱动,应该没问题。实际的硬件部分是由PLX9054+FPGA来实现,由于存在FPGA,串口部分寄存器由FPGA工程师提供,这个需要软件和硬件磨合。后的驱动应该是一个复合驱动,你不能简单套用字符设备、块设备或网络设备那一套。PCI部分的驱动,你不仅要了解PCI协议、PCI配置过程(配置空间的读写),为了实现PCI设备上电自动配置还涉及到EEPROM芯片的烧写,同时还要熟悉嵌入式Linux内核PCI部分架构,以及驱动程序的注册。整个驱动部分不是两块简单叠加,需要有机结合。如果你不知道PCI配置空间、IO空间、内存空间,不熟悉内存映射机制、虚拟内存概念,不了解PCI的INTA—INTD或PCIe的MSI等中断机制,这个驱动是搞不出来的。这一个项目涉及的知识点非常多,即使是串口部分,也不是简单一个字符设备可以搞定的,你需要知道tty、线路规程、UART协议。
    9、 搞驱动开发既需要积累知识、又需要积累经验,切记纸上谈兵、好高骛远。实在没什么嵌入式Linux学习方法推荐,如果要推荐的话,我个人觉得可以参考这个配置《3+1+1+1+1》,具体为:3本书(嵌入式Linux内核开发(Robert Love)、深入理解嵌入式Linux内核(Daniel P. Bovet / Marco Cesati)、嵌入式Linux设备驱动程序(Jonathan Corbet))+1个软件(Source Insight)+1套内核源码(建议版本至少大于2.6)+1个网络搜索引擎+1个持续的学习热情。这里说一下阅读内核代码,对于初学者可能非常痛苦,因为内核代码里面有很多链表、锁、出错处理以及你闻所未闻的算法,更伤心的是当你怀揣无比坚定的信念,兴致勃勃地用SI跟踪代码,要一探究竟,结果代码跟到一半无法进行了。这是因为内核很多地方采用了函数指针和回调机制,只有在执行的时候,才指向具体的函数。这样是不是就没法跟踪了呢,当然不是,具体就不详述了,可以到网上查找相关资料。
    10、 基础知识也需要掌握,Shell编程、Make工具的使用、内核编译系统、gcc编译和链接、elf格式加载过程、ext2文件系统等,扎实的基础知识,可以让你学习新知识事半功倍。
    以上简单罗列了一下个人在学习嵌入式Linux过程中的一点体会,有些细节没有展开。若想了解涉及到的具体知识点,请自己到网上搜索。由于自己也刚刚入门,如果误导了你,还请见谅!

免费预约试听课