《初学者一篇看懂嵌入式Linux 附适合初学者的嵌入式Linux计划.docx》由会员分享,可在线阅读,更多相关《初学者一篇看懂嵌入式Linux 附适合初学者的嵌入式Linux计划.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式Linux跟桌面Linux一样,是一个操作系统。从单片机走过来的童鞋往往习惯于 直接控制寄存器,事必躬亲,从零开始实现想要的功能。而在嵌入式Linux的世界里,我们 首先要抛弃这个思想,应把它作为最后没办法的办法。就像我们想要在windows系统中编写一个程序,首先想到的不是操作CPU芯片的寄存 器,而是学习Windows API一样。我们在嵌入式linux编程时,首先想到的应该是使用现成 的驱动或软件或Linux API。没有的话看看能不能修改一下现成的资源为己所用。还是不行 的话才考虑自己从头开始写。嵌入式Linux大厦是由很多层组成的,当我们想找一个人时,首先要明确他在那一层楼。
2、同样的,我们遇到问题时,首先要知道是哪个方面的问题,然后才有可能知道到哪里寻找答 案。下面我们把这座大厦进行一下拆解。我们平时使用Linux系统的话,最常用的工具就是Shell (或者用windows中常见的说 法:命令行),初学者接触Linux的第一个东西往往也是shello也许你已经知道,把shell 命令组合起来写成一个文件,亦即shell编程,也是一门大学问,它能做的事很多很强大, 但仅限于对Linux系统的操作。我们一定不会用shell命令去编写一个显示屏程序,或者一个GPS导航程序。而且作为 嵌入式Linux开发来说,shell不可能作为最终产品工作的平台,因为我们不能要求用户在屏
3、 幕中输入代码来实现功能。因此我认为对嵌入式开发来说,shell命令无需深究,掌握基本 操作就够了。shell基本操作主要包括:获取命令帮助,到达指定目录,查看目录内容,权限修改, 文件的复制粘贴等基本操作,文件搜索,文件内容查看和编辑,系统关机重启(这些只 是最基本的,后面再慢慢学别的命令,比如学习进程编程时,再学习进程相关的命令;学习 C语言编程时,再学各种编译和调试命令也不迟)学习嵌入式Linux,我们的最终目的是制作一套嵌入式系统来实现功能。往往需要用 C/C+或Python等其他语言来编写程序,但是编程之前我们要先明确一些基本概念。最基本的,当我们编写程序时,首先要明确嵌入式Linu
4、x分为用户空间和内核空间。用 户空间是应用程序运行的空间,内核空间就是操作系统和驱动程序运行的空间。这是从软件 的角度来说的,对应于ARM芯片来说,就是芯片的不同”工作模式:这两个空间是通过“地 理隔离”实现互相完全独立的,它们各自的程序使用不同的内存地址区间,各自使用自己的 头文件(有些头文件在两个空间内甚至是重名的,要注意区分)、各自调用属于自己空间的 函数(哪怕实现的功能相同,比如printf()和printk。),而且不能互相直接访问(用指针也不 行)。(意味着学习这两部分的编程时要学习两套独立的知识体系)内核空间相关的东西有:Linux内核源码、内核编译和配置、内核移植、文件系统、
5、Busybox设备驱动程序编写、中断编程用户空间相关的东西有:Shell、应用程序编译和调试、进程、线程、文件10编程、网 络通信相关、Qt图形界面编程如果你仅仅要开发应用程序,那你就可以远离内核空间那些东西了。对你来说,驱动程 序、底层硬件、操作系统的工作方式等都是透明的,你写的程序在别的芯片上也能跑得很好。但如果你想要开发驱动程序,或者定制自己的操作系统,或者你想向一片“全裸”芯片中 写入操作系统,并使它正常运行起来,那就得学习内核空间的知识了。如果你想让“全裸”芯片运行起来,还会遇到一块比内核更底层的东西,Bootloaderc它 是在内核启动前运行的一段程序,用来初始化硬件、建立内存空
6、间映射等,与芯片的品牌、 型号极其相关。我们通常对一些现成的Bootloader进行修改来满足需求,常见的Bootloader 有 U-Boot、Vivi 等。再多说一句,如果想从零开始做一个嵌入式设备,还有更底层的问题需要解决和学习:电路设计、PCB布线等。因此,我们看到的嵌入式Linux书籍就可以粗略分成两个方向:一类讲嵌入式Linux应 用程序编程,另一类讲如何搭建一个完整的嵌入式Linux平台。分别对应的就是用户空间和 内核空间的事情。虽然用户空间和内核空间是独立的,但就像Windows提供了 API,允许我们对系统进 行操作一样,用户空间的程序也可以通过系统调用来访问内核(就是一些的
7、C语言函数)。 但由于系统调用非常基础,所以有时使用起来很麻烦。比如说一个简单的给变量分配内存空 间的操作,就需要动用多个系统调用。Linux定义一些库函数(API)来将系统调用组合成某些 常用的功能,以方便我们编程(同样是C语言函数)。因此,我们在读别人的程序时,就要 区分其中的函数是系统调用,还是库函数,还是C/C+标准库中的函数,还是用户自己定义 的函数。如果是前三者,就可以到各个地方搜索相应的资料,这样学习起来就快很多。那么shell程序和我们用C/C+编写的程序有什么区别呢?事实上,我们在shell中写的 每一个命令,都对应了一个程序,在程序内部就是通过调用各种API来实现相应功能的
8、。 因此用shell能实现的功能,理论上都能用C语言实现。作为嵌入式Linux开发初学者,简单熟悉了 shell以后,就可以开始进行一些C语言编 程的尝试了。我们最早接触编程一般都是在大学的编程课上,而且往往用的是Visual C+6.0。窃以 为这是让我对编程原理长期困惑不解的罪魁祸首!啥是环境变量?为啥要设置include路径, lib路径?为啥一点编译按钮就会出来那么多后缀名不同的文件?这些很基础很重要的问题 都被VC6.0这个外壳掩盖了。但哪怕你在Linux中使用gcc编译一个最简单程序,一定就会 像我一样马上明白把一个.c的源文件变成一个可执行文件,中间究竟发生了什么事情。如果 你再
9、用gdb调试一个程序,就会明白得更多一点。关于C/C+编程的基本工具,我们需要学习的有:vim等代码编辑器、diff等文件比较 的shell命令、gcc等编译器、gdb等调试工具、交叉编译等。这里需要特别提到一个重要工 具(网站):github,根据百度的解释,它是一个“分布式的版本控制系统”,初学者还用不到 版本控制,那就可以单纯把它当成一个开放的源代码库。这个网站里有大量优秀的源代码供 学习和使用。学习了基本的编程方法,我们就该接触Linux的API等内容了。毕竟,我们的嵌入式系 统要与设备进行交互,只用C/C+标准库是不够的。在此之前,需要建立一个Linux的重要 概念:一切皆文件。甚至
10、硬件设备对Linux系统来说,也是文件。这样对设备的操作就等同 于对文件进行读、写,或读写以外的操作。这部分内容在各种书籍资料中通常以“文件10编 程”命名,作为一个章节来写。我觉得这是应当第一个来学的东西,因为看到自己能随意操 控文件和外设是一件让人很振奋的事情!成就感是继续学习的一大动力!另外一个重要内容是,理解进程和线程。通过学习这个部分,能管中窥豹地大致领略到 Linux系统如何进行调度,你的程序是怎么在Linux中运行的。这是操作系统原理的内容, 但作为非软件专业出身的人,没办法,只能自学了。其他应用程序编程如网络编程、Qt图形编程等就不一一说明了。驱动程序可能是我们将来接触内核空间
11、遇到的第一个内容。不过暂时还没什么特别想说 的。内核空间距离初学者还是有点远的以后再来学这部分内容。适合初学者的嵌入式Linux计划俗话说万事开头难,刚开始的时候,你是否根本就不知如何开始,上网查资料被一堆堆 新名词搞的找不到北,去图书馆看书也是找不到方向?又是arm,又是linux,又是uboot头 都大了,不知道自己究竟从哪里开始?下面就跟着我学习设计嵌入式工程师的修炼日记吧!简单说,从arm基础知识到裸机编程,从uCOSII到linux,从linux基础的命令到shell 编程,从u-boot到文件系统,最后到现在的linux驱动程序。从简单到复杂,从基础到高级 基本是按照这个来的。第一
12、阶段:嵌入式硬件基础以及裸机程序开发1 .知识点:(1) arm处理器基础知识,工作模式,寄存器,中断与异常、寻址方式,汇编指令集 (2)熟悉ADS集成开发环境为裸机程序开发做准备(3)裸机程序开发:LED,串口,LCD,触摸屏,NANDFLASH, IIC, IIS, DMA 等2 .过程以及目的:这一阶段的学习主要是熟悉嵌入式的硬件,为以后的linux驱动打基础。因为嵌入式主 打处理器架构就是arm,所以针对arm来学习。首先学习基础知识,然后通过在开发板上的 练习来掌握。这一阶段所用的资料主要有:(1)ARM嵌入式基础教程这本书主要看arm基础的知识。这本书是讲arm7的, 但是arm的
13、基础的指令集以及模型是一样的。(2)嵌入式linux应用开发完全手册这本书主耍看介绍s3c2410接口模块的部分, 实验裸机的时候需要硬件的知识。3 .所用时间:大约两个月。第二阶段:linux基础以及shell编程1 .知识点:(1) linux基础知识linux安装与使用(2) linux常用命令vi使用(5)简单shell编程2 .过程以及目的:这一阶段的学习主要是熟悉linux,会安装linux, 了解Linux的基础知识,会简单的操 作。刚开始安装linux还是在虚拟机上安装比较好,安装开发板推荐的Fedora9,按照开发板 配套的说明一步一步的安装,然后在上面练习各种命令。这一阶段
14、主要要看鸟哥的linux私房菜基础学习篇,这个书有电子版,也不用全看, 主要是看前面对Linux基础知识的描述,以及基本的命令。命令只是了解,那么多记也记不 下来,以后用时再查阅。这一阶段主要目的是对linux有一个整体的了解,最起码要知道基 础的一些概念,还有会一些基本的操作。3 .时间:大约一个月。第三阶段:linux应用程序基础开发1 .知识点:(1) GCC, GDB, Make 基础(2)文件,时间编程(3)多进程,多线程程序设计(4)进程间通信2 .过程以及目的:这一阶段的学习主要是了解linux应用程序的编写调试,也都是基础知识,主要目的还 是熟悉Linux。熟悉其中应用程序有关
15、的一些概念,为以后打基础。这一阶段主要看了嵌 入式Linux应用程序开发标准教程,这本书对linux上应用程序编写讲的很详细,而且不是 很难,那本最经典的UNIX高级环境编程讲的比较深入,刚开始看有点难,万事开头难 还是从简单的开始。学习应用编程以后也不一定搞应用,从事嵌入式linux行业的人,这是 必须的基本技能。3 .时间:大约一个月第四阶段:ucosn操作系统学习4 .知识点:(1)嵌入式实时操作系统的概念以及基础知识(2)ucosn操作系统源代码阅读(3)移植 ucosn(4)ucosn操作系统应用编程5 .过程以及目的:这一阶段的学习主要是了解嵌入式实时操作系统的基础,因为UCOSI
16、I是开源的,可以 研究他的代码。对操作系统的任务调度以及资源管理有直观的认识。并且阅读他的源码能够 提高自己的编程能力,规范自己的编程习惯。虽然提供了 ucosn的移植版本,但是自己实 际移植一次能够有更深刻的认识。这个操作系统比较简单,所以应用程序的编写就很重要,在上面实现几个功能还是有助 于对系统的理解。这一阶段主要看的就是邵贝贝翻译的UCOSII作者所著的嵌入式实时操 作系统uCOS-n,里面对操作系统的源码有详细的分析。看透这本书后就会对ucosn有一 个深入的了解。这一阶段的主要目的是了解操作系统的知识,比如任务调度,并发与竞态。 还有一个目的就是锻炼自己的编程能力。因为如果看介绍操
17、作系统原理的书会比较枯燥,我 感觉阅读一个操作系统的源码比看一千本介绍原理的书来的实惠的多。6 寸间:大约一个月第五阶段:bootloader学习1 .知识点:(1) bootloader 基础知识u-boot基础与命令(2) u-boot移植2 .过程以及目的:bootloader是一个linux嵌入式系统的不可缺少的部分。这一阶段的学习主要是了解 bootloader的作用,以及通用bootloaderu-boot的知识,刚开始学会用u-boot的各种命令。 然后分析u-boot的启动流程和Makefile以及u-boot加载内核过程。然后按照别人的步骤一 步一步的移植内核,多做几遍以熟悉
18、这个过程。然后在熟悉整个u-boot的基础上,独自完 成u-boot的移植,并添加自己修改。这一阶段主要参考资料就是光盘自带的u-boot移植参 考手册和一些网络上的文章。个人感觉u-boot移植这方面的网络资源相当的丰富。3 .时间:大约一个月第六阶段:文件系统学习1 .知识点:(1) linux文件系统的种类与作用(2)熟悉busybox的使用,以及linux系统启动过程(3)构建自己的根文件系统2 .过程以及目的:文件系统也是一个linux嵌入式系统不可缺少的部分,这一阶段的学习主要是熟悉根文 件系统的作用以及基础知识,并且自己构建自己的根文件系统。这一阶段所看的书有构建 嵌入式linu
19、x系统,这本书详细讲解了嵌入式linux的所有元素,包括文件系统。这里主要 看文件系统这块。我还参考了网上的一些文章。这里首先要熟悉基本的一些Linux文件系统, 然后学习busybox的使用以及linux的启动过程,最后参考别人的一步一步来构建自己的文 件系统。3 .时间:大约半个月第七阶段:嵌入式图形界面GUI(1) .知识点:(1)嵌入式图形界面GUI的种类与特点minigui基础知识(2) minigui移植与程序编写2 .过程以及目的:嵌入式图形界面GUI作为嵌入式上层系统的东西也是需要了解的,这里我只学习了 minigui,因为QT是需要C+的知识,而我没有学过C+,所以只看了 m
20、inigui的相关知识。 这个阶段的目的主要是熟悉一下嵌入式图形接界面的开发流程,因为以后也不打算搞应用。只是熟悉一下嵌入式组成的一些方面。这里只要将minigui移植到板子上能跑hello程 序就可以了。其他的也不用深入了解。通过移植minigui对linux上运行的软件以及函数库, 程序运行原理,编译器都会有一个新的认识。3时间:大约半个月第八阶段:linux驱动程序基础知识3 .知识点:(1)看完LINUX设备驱动程序除了网络驱动程序,tty驱动程序,块驱动程序这 几章不看,其他的都要看完。(2)实验书中所有例程,要仔细分析结果,理解相关知识点。(3)就算是例子,程序编程习惯一定要统一,
21、文档一定要规范。4 .过程以及目的这一阶段的目的就是为了 linux驱动打基础,LINUX设备驱动程序(第三版)也就是 大家所说的ldd3,是最经典的一本讲linux驱动的书,一定要看而且多看几遍。第一次看很 难看进去,感觉讲的晦涩难懂。但是多看几遍就会由豁然开朗的感觉。看完了书,然后就是 实验书中的例子。5 .时间:大约两个月第九阶段:linux驱动实战1 .知识点:(1)通过led驱动理解杂项字符设备的注册与实现,并掌握MINI2440的10操作过程。(2)通过button驱动程序掌握基本的中断实现方法。(3)掌握PWM驱动程序。(4)通过触摸屏驱动程序掌握input设备模型的实现。(5)
22、掌握ADC驱动程序的设计(6)掌握看门狗,rtc驱动程序的设计(7)通过LCD驱动程序分析platform设备模型的实现。2 .过程以及目的:这一阶段的学习主要是掌握实际的简单的驱动程序的实现与ldd3中的差别,并且分析 一些linux子系统。通过这一阶段的学习,能够对linux驱动程序有更深入的认识。并且锻 炼自己阅读海量代码的能力。这一阶段主要工作就是看代码,实验,看代码,实验,通过现 象学习知识。3 .时间:大约一个月第十阶段:深入理解linux内核与USB子系统的研究前九个阶段完成了,自己感觉嵌入式Linux应该应该算是入门了。所以要开始计划第十 个阶段了。这一阶段基本上要确定自己未来的发展方向了。因为现在嵌入式系统的标准接口 都有USB,所以学会USB的相关知识是很有竞争力的。搞驱动的人对内核应该有一定的了 解,所以深入理解Linux内核还是必须的。这一阶段主要是学习USB协议,阅读linux USB子系统全部的代码,通过阅读代码加 深对USB的理解,随后就是熟悉各种USB类协议,编写和移植USB驱动了。USB是我确 定的方向,因为我想搞什么东西都要专一,什么都搞,什么也搞不好。所以我决定学习USBo 决定以后从事嵌入式有关USB方面的工作。这一阶段的学习正在进行中,现在正在linux USB子系统浩瀚的代码中漫游。