完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
怎么学习嵌入式Linux操作系统
本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。 在实际工作中,我们从事的是“操作系统”周边的开发,并不会太深入学习、修改操作系统本身。 ①操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序 ②学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程序后,也会加深对操作系统其他部分的理解 ③Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成 但是,要成为该领域的高手,一定要深入理解Linux操作系统本身,要去研读它的源代码。 在忙完工作,闲暇之余,可以看看这些书: ①赵炯的《linux内核完全注释》,这本比较薄,推荐这本。他后来又出了《Linux 内核完全剖析》,太厚了,搞不好看了后面就忘记前面了。 ②毛德操、胡希明的《LINUX核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。 ③其他好书还有很多,我没怎么看,没有更多建议 基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习。 2.2 学习驱动程序之前的基础知识 2.2.1 C语言 只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的,一上机就傻了,我怀疑他们都没在电脑上写过程序。 理论再好,没有实践不能干活的话,公司招你去干嘛? 反过来,实践出真知,学习C语言,必须练练练、写写写! 当你掌握基本语法后,就可以在电脑上练习一些C语言习题了; 当你写过几个C程序后,就可以进入下一阶段的裸机开发了。 ①不需要太深入 作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法操作,暂时就够了。 指针操作是重点,多练习; 不需要去学习过多的数据结构知识,只需要掌握链表操作,其他不用学习,比如:队列、二叉树等等都不用学; 不需要去学习任何的函数使用,比如文件操作、多线程编程、网络编程等等; 这些知识,在编写Linux应用程序时会用,但是在操作系统特别是驱动学习时,用不着! 永往直前吧,以后碰到不懂的C语言问题,我们再回过头来学习。 在后续的“裸机开发”中,会让你继续练习C语言,那会更实战化。 C语言是在写代码中精进的。 ②可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令 我们暂时没有提供C语言的教程,找一本C语言书,网上找找免费的C语言视频(主要看怎么搭建环境),就可以自学了。 2.2.2 PC Linux基本操作: 对于PC Linux,我们推荐使用Ubuntu,在它上面安装软件非常简便。 我们的工作模式通常是这样:在Windows下阅读、编写代码,然后把代码上传到PC Linux去编译。 实际上,Ubuntu的桌面系统已经很好用了,我们拿到各种智能机可以很快上手,相信Ubuntu的桌面系统也可以让你很快上手。 为了提高工作效率,我们通常使用命令行来操作Ubuntu。 不用担心,你前期只需要掌握这几条命令就可以了,它们是如此简单,我干脆列出它们: ①cd : Change Directory(改变目录) cd 目录名 // 进入某个目录②pwd : Print Work Directory(打印当前目录 显示出当前工作目录的绝对路径) ③mkdir : Make Directory(创建目录) mkdir abc // 创建文件夹abc④rm : Remove(删除目录或文件) rm file // 删除名为file的文件⑤ls : List(列出目录内容) ⑥mount : 挂载 mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt⑦chown : Change owner(改变文件的属主,即拥有者) chown book:book /work -R // 对/work目录及其下所有内容,属主改为book用户,组改为book⑧chmod : Change mode(改变权限),下面的例子很简单粗暴 chmod 777 /work -R // 对/work目录及其下所有内容,权限改为可读、可写、可执行⑨vi : Linux下最常用的编辑命令,使用稍微复杂,请自己搜索用法。 要练习这些命令,你可以进入Ubuntu桌面系统后,打开终端输入那些命令;或是用SecureCRT、putty等工具远程登录Ubuntu后练习。 2.2.3 硬件知识 我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。 对于正统的方法,你应该这样学习: ①学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。 ②学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。 ③《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。 就我个人经验来说,这些课程是有用的,但是: ①原理有用,实战性不强。 比如《微机原理》是基于x86系统,跟ARM板子有很大差别,当然原理相通。 我是在接触嵌入式编程后,才理解了这些课程。 ②每本书都那么厚,内容都很多,学习时间过长,自学有难度。 针对这些校园教材的不足,并结合实际开发过程中要用到的知识点,我们推出了《学前班_怎么看原理图》系列视频: 学前班第1课第1节_怎么看原理图之GPIO和门电路.wmv即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。 这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。 2.2.4 要不要专门学习Windows下的单片机开发 很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。 问题来了,要不要专门学习Windows下的单片机开发? ①如果这是你们专业的必修课,那就学吧 ②如果你的专业跟单片机密切相关,比如机械控制等,那就学吧 ③如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows下学习单片机吧! 理由如下: ①Windows下的单片机学习,深度不够 Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。 它们封装了很多技术细节,比如: 你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的; 你可以编写中断处理函数,但是却不知道它是怎么被调用的; 你不知道程序怎么从Flash上被读入内存; 也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪; 当你想裁剪程序降低对Flash、内存的使用时,你无从下手; 当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂; 等等等。 ②基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。 实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。 在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。 一切从零编写代码、管理代码,可以让我们学习到更多知识: 你需要了解芯片的上电启动过程,知道第1条代码如何运行; 你需要掌握怎么把程序从Flash上读入内存; 需要理解内存怎么规划使用,比如栈在哪,堆在哪; 需要理解代码重定位; 需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场; 你会知道,main函数不是我们编写的第1个函数; 你会知道,芯片从上电开始,程序是怎么被搬运执行的; 你会知道,函数调用过程中,参数是如何传递的; 你会知道,中断发生时,每一个寄存器的值都要小心对待; 等等等。 你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。 驱动程序=Linux驱动程序软件框架+ARM开发板硬件操作,我们可以从简单的裸机开发入手,先掌握硬件操作,并且还可以: ①掌握如何在PC Linux下编译程序、把程序烧录到板子上并运行它 ②为学习bootloader打基础:掌握了各种硬件操作后,后面一组合就是一个bootloader 2.2.5 为什么选择ARM9 S3C2440开发板,而不是其他性能更好的? 有一个错误的概念:S3C2440过时了、ARM9过时了。 这是不对的,如果你是软件工程师,无论是ARM9、ARM11、A8还是A9,对我们来说是没有差别的。 一款芯片,上面有CPU,还有众多的片上设备(比如UART、USB、LCD控制器)。我们写程序时,并不涉及CPU,只是去操作那些片上设备。 所以:差别在于片上设备,不在于CPU核;差别在于寄存器操作不一样。 因为我们写驱动并不涉及CPU的核心,只是操作CPU之外的设备,只是读写这些设备的寄存器。 之所以推荐S3C2440,是因为它的Linux学习资料最丰富,并有配套的第1、2期视频。 2.2.6 怎么学习ARM+Linux的裸机开发 学习裸机开发的目的有两个: ①掌握裸机程序的结构,为后续的u-boot作准备 ②练习硬件知识,即:怎么看原理图、芯片手册,怎么写代码来操作硬件 后面的u-boot可以认为是裸机程序的集合,我们在裸机开发中逐个掌握各个部件,再集合起来就可以得到一个u-boot了。 后续的驱动开发,也涉及硬件操作,你可以在裸机开发中学习硬件知识。 注意:如果你并不关心裸机的程序结构,不关心bootloader的实现,这部分是可以先略过的。在后面的驱动视频中,我们也会重新讲解所涉及的硬件知识。 推荐两本书:杜春蕾的《ARM体系结构与编程》,韦东山的《嵌入式Linux应用开发完全手册》。后者也许是国内第1本涉及在PC Linux环境下开发的ARM裸机程序的书,如果我说错了,请原谅我书读得少。 对于裸机开发,我们提供有2部分视频: ①环境搭建 第0课第1节_刚接触开发板之接口接线.wmv要声明的是: 录制上述《裸机程序开发》视频时,本意是结合《嵌入式Linux应用开发完全手册》的《第2篇 ARM9嵌入式系统基础实例篇》来讲解,所以视频里没有完全从零编写代码,需要结合书本来学习。 ①书和视频并不是完全配套的,不要照搬,其中的差异并不难解决。 《嵌入式Linux应用开发完全手册》发表于2008年,使用了很多款开发板,并且那时的开发板配置较低(Nand Flash是64M); 《裸机程序开发》视频使用JZ2440开发板录制。 ②书和视频,适用于所有S3C2440开发板,包括mini2440、tq2440等 天下S3C2440配置都是相似的,基本也就是LED、按键所用引脚不同,LCD型号不同;你学习了书、视频,如果连这些差异都搞不定的话,那就是你我的失败了。 学习方法是这样的: ①先看《环境搭建》视频来搭建开发环境 ②书(第2篇)和视频(裸机程序开发)结合,看完一章,练习一章 一定要编写代码,即使是照抄也要写。 ③如果对于ARM架构相关的知识,觉得模糊或是想了解得更深入,参考《ARM体系结构与编程》 学习程度: ①理解一个裸机程序的必要结构:异常向量、硬件初始化、代码重定位、栈 ②知道如何操作GPIO、Flash、LCD、触摸屏等硬件 ③很多人觉得MMU难以理解,可以放过它 2.2.7 bootloader的学习 bootloader有很多种,vivi、u-boot等等,最常用的是u-boot。 u-boot功能强大、源码比较多,对于编程经验不丰富、阅读代码经验不丰富的人,一开始可能会觉得难以掌握。 但是,u-boot的主要功能就是:启动内核。它涉及:读取内核到内存、设置启动参数、启动内核。按照这个主线,我们尝试自己从零编写一个bootloader,这个程序相对简单,可以让我们快速理解u-boot主要功能的实现。 从零编写bootloader的视频有:《嵌入式Linux应用开发完全手册》上对u-boot的讲解有如下章节: 15.1 Bootloader简介学习方法如下: ①先学习《从零编写bootloader的视频》,这可以从最少的代码理解bootloader的主要功能 ②再看书上对u-boot的讲解,并结合《分析u-boot 1.1.6的视频》来理解 ③最后,有时间有兴趣的话,看《移植一个全新u-boot的视频》,这不是必须的。 学习程度: ①理解u-boot的启动过程,特别是u-boot代码重定位:怎么从Flash上把自己读入内存 ②理解u-boot的核心:命令 ③知道bootloader如何给内核传递参数 ④知道bootloader是根据“bootcmd”指定的命令启动内核 ⑤作为入门:只求理解,不要求能移植u-boot 2.2.8 Linux内核的学习 前面说过,内核本身不是我们学习的重点,但是了解一下内核的启动过程,还是很有必要的:工作中有可能要修改内核以适配硬件,掌握了启动过程才知道去修改哪些文件。 分析内核的视频有: 第10课第1节 内核启动流程分析之编译体验.wmv移植内核的视频有: 毕业班第3课第1节_移植3.4.2内核之框架介绍及简单修改.wmv《嵌入式Linux应用开发完全手册》上对内核的讲解有如下章节: 16.1 Linux版本及特点学习方法如下: ①先看书,并结合《分析内核的视频》进行理解 ②如果有兴趣,再根据《移植内核的视频》自己掌握移植内核,这不是必须的 学习程度: ①知道机器ID的作用,根据机器ID找到单板对应的文件 ②知道Makefile、Kconfig的作用,知道怎么简单地配置内核 ③知道怎么修改分区 ④作为入门:只求理解,不要求能移植 2.2.9 根文件系统 在驱动程序开发阶段,我们喜欢搭建一个最小根文件系统来调试驱动; 在开发应用程序时,也需要搭建文件系统,把各种库、配置文件放进去; 在发布产品时,你还需要修改配置文件,使得产品可以自动运行程序; 甚至你想实现插上U盘后自动启动某个程序,这也要要修改配置文件; 这一切,都需要你理解根文件系统的构成,理解内核启动后是根据什么配置文件来启动哪些应用程序。 分析根文件系统的视频有: 第11课第1节 构建根文件系统之启动第1个程序.wmv《嵌入式Linux应用开发完全手册》上对文件系统的讲解有如下章节: 17.1 Linux文件系统概述学习方法:结合书和视频学习。 学习程度: ①理解配置文件的作用 ②知道根文件系统中lib里的文件来自哪里 ③可以制作、烧写文件系统映象文件 2.3 驱动程序的学习 《嵌入式Linux应用开发完全手册》对驱动程序的讲解不多,我们推出的“韦东山Linux视频第2期_驱动现场编写调试”,可以认为完全脱离了书本。 所以,驱动程序的学习完全按照视频来就可以了。 第2期的视频,对每一个驱动,先讲解硬件原理,然后从零写代码,从简单到复杂,逐渐完善它的功能。 我们不会罗列专业术语,会参考日常生活的例子,力争用最形象的比喻让你轻松入门,同时又会很深入。 注意:我们可以让你入门时很轻松,但是要深入理解的话,这需要你跟着视频练习代码,这是个要慢慢思考的过程,不会轻松。 轻松的话,凭什么拿高工资? 再次申明:即使照抄也要写代码!很多人视频看得很高兴,但是写代码时就傻了。 2.3.1 经典字符设备驱动程序 视频中以LED、按键驱动为例,讲解并练习开发过程中碰到的机制:查询、休眠-唤醒、中断、异步通知、poll、同步、互斥等等。 后续更复杂的驱动程序,就是在这些机制的基础上,根据硬件特性设计出精巧的软件框架。 相关的视频有(文件名中带“_P”的属于第2期加密视频): 第12课第1节 字符设备驱动程序之概念介绍.wmv《嵌入式Linux应用开发完全手册》上对字符设备驱动程序的讲解有如下章节: 第19章 字符设备驱动程序 19.1 Linux驱动程序开发概述第20章 Linux异常处理体系结构 20.1 Linux异常处理体系结构概述学习方法: ①沿着数据流向,从应用程序的对驱动程序的使用进行情景分析。 所谓情景分析,就是假设应用程序发起某个操作,你去分析其中的运作过程。比如应程序调用open、read、ioctl等操作时涉及驱动的哪些函数调用。 你要思考一个问题:一个应用程序,怎么获得按键信息,怎么去控制LED。把其中数据的流向弄清楚了,对字符驱动程序也就基本理解了。 ②学习异常和中断时,可以结合书和视频;对于驱动程序中其他内容的学习,可以不看书。 2.3.2 工作中各类驱动程序 我们的视频中讲解的驱动程序非常多,目的有二: ①在你工作中遇到同类驱动时提供借鉴 ②供你学习、练习,煅炼阅读驱动程序的“语感”,提升编写程序的能力,增加调试经验 我们还打算扩充驱动视频,把它打造成“Linux驱动程序大全”视频,基本上都会采取从零现场编写的方式。 也许有人说:在工作中我们基本上只是移植、修改驱动而已,很少从头编写。这话没错,但是能修改的前提是理解;想更好地理解,最好的方法是从零写一个出来。在学习阶段,不要怕耗费太多时间,从零开始编写,慢慢完善它,在这过程中你既理解了这个驱动,也煅炼了能力,做到触类旁通。 如果有时间,建议你学完这些所有的视频,直到你自认为: ① 给你一个新板,你可以很快实现相关驱动 ② 给你一个新硬件,你可以很快给它编写/移植驱动。 我们录制的视频很多,下面只罗列到“课”,不罗列到“节”。 第2期视频:学习方法: ①再次强调,不能光看不练:一定要写程序,即使照抄也得写 ②必学:LCD、触摸屏、NAND Flash、Nor Flash、hotplug_uevent机制 ③学完之后,强烈建议换一个不同的开发板,尝试在新板上写驱动程序。 按视频学习会一切顺利,很多问题你可能没想到、没想通,换一个新板会让你真正掌握。 2.3.3 调试方法 有一种说法,程序是三分写七分调,我们从操作系统的角度提供了一些很有用的调试方法。 相关的视频有: 第29课第1节_裸板调试之点灯法_P.wmv2.4 Linux应用程序的学习 对于大多数人来说,第1个C程序是在Windows的Visual Studio C++(简称VC)上写的,所以你们关心的也许是:嵌入式Linux应用程序,跟VC应用程序之间的区别: ①编译方法不同: 在VC上点点鼠标即可编译,对于嵌入式Linux应用程序,我们需要“交叉编译”:程序要在PC Linux上编译,但是运行时要放到单板上。 并且,它的编译环境需要你自己搭建:解压出工具链后设计PATH,还要自己构造一套Makefile系统。 ②调试方法不同: 在VC上点点鼠标就可以调试,对于嵌入式Linux应用程序,你可以更喜欢用打印;或是在PC Linux上通过GDB观察应用程序在单板上的运行状况。 ③可用的资源不同: 对于VC程序,你可以直接使用微软公司提供的各种类库;对于嵌入式Linux应用程序,很多时候需要去寻找、下载、编译、使用开源库。 ④功能不同: VC程序运行在PC上,一般是用来解决某些纯软件的问题,比如整理数据、修图、联网播放音乐之类。嵌入式Linux应用程序一般都要操作若干种硬件,比如监控设备中要操作摄像头、存储音视频,无人机中要操作GPS、螺旋桨,POS机中要操作银行卡等等。它跟单板上的硬件联系很大,很多时候需要你懂点硬件知识,至少是知道怎么通过驱动程序来操作这些硬件。 上述4点的不同,花很少的时间就可以掌握。 如果你有志于开发应用程序,那么一定要有算法、数据结构、网络编程等基础,然后再掌握一些设计模式,最后就是多参加一些实际项目的开发了。 基于我们提供的视频,你可以这样学习: ①先掌握第1期讲解的根文件系统: 在后续学习中你会经常构建根文件系统,比如往里面添加库、修改配置文件让你的程序自动运行。 ②掌握怎么编译、烧写u-boot、内核: 在实际工作中,一般来说不需要你去烧写u-boot、内核,但是在自学阶段还是自己掌握吧,免得去麻烦别人。 按开发板手册即可操作,你甚至不用管里面的原理。 ③掌握Makefile: 可以看如下第3期视频,以后编译程序时只要执行make命令即可: 第1课第4节_数码相框_编写通用的Makefile ④学习第1个项目:数码相框 该项目不使用任何开源的GUI项目,完全是自己构建一套GUI系统,实现了文件浏览、文件显示(文本和图片)、图片操作(放大、缩小、自动播放)等功能;涉及网络编程、多线程编程、开源库使用等等。 虽然数码相框作为一个产品已经落伍了,但是该项目所涉及的技术,特别是以面向对象的编程思想设计出一个模块化的、易扩展的系统,非常适合没有大型项目开发经验的人。很多同学,都是根据该项目所教会的编程思想找到了心怡的工作。 第3期视频取名为“项目开发”,而非“应用开发”,它的第2、3个项目跟内核、驱动耦合很大。如果只关心应用开发,或是急于找一份工作,可以先看第1个项目。 第2个项目涉及摄像头、ALSA声卡、WIFI网卡、3G网卡,这些都是在实际工作过程中经常用到的设备,比如我们后面补充的QQ物联就用到摄像头、声卡、WIFI网卡。 第3个项目是电源管理,讲解怎么讲你的单板休眠以省电。 |
|
|
|
只有小组成员才能发言,加入小组>>
2548 浏览 0 评论
1146浏览 2评论
745浏览 1评论
499浏览 0评论
265浏览 0评论
426浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 00:52 , Processed in 1.464736 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号