zoukankan      html  css  js  c++  java
  • 作为一个新人,如何学习嵌入式Linux?

    作为一个新人。如何学习嵌入式Linux?我一直在问太多次,特写文章来回答这个问题。

        在学习嵌入式Linux之前。肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。C语言要学到什么程度呢?越熟当然越好。不熟的话也要具备基本技能。比方写一个数组排序、输入数字求和什么的。学C语言唯一的方法是多敲代码多练习。编译出错没关系,自己去解决;运行出错没关系。自己去分析。曾经我是用VC来练习C语言的,常常去尝试着写一些C语言竞赛的题目。

    它们是纯C、纯数学、纯逻辑的题目。不涉及界面这些东西。非常适合煅炼你的编程能力。


        
        回到主题,首先我们要明确你的目的是什么,大概来说所谓嵌入式Linux能够分为两部分:底层系统、应用开发。


        假设你是想做应用开发,那么你去把C语言、JAVA、数据结构什么的学好吧。嵌入式应用开发和PC上的应用开发并没有什么特别要注意的。或许你说在嵌入式上要做些优化。是的,要优化,可是未经优化的程序和PC上的程序开发没什么区别。

    另外。当你有能力去优化时,你已经不用来问这个问题了。

    详细到某个样例。比方说开发界面,在PC上我们用VC。在嵌入式Linux里或许我们用QT或许用Android。这个时候你应该去学学QT、Android的编程。可是基础还是C或JAVA。在此基础上去熟悉它们的接口。你学过VC的话,也是要花时间去了解那些类、控件的。
        假设你的目的是想学习底层系统。这是我的专长,倒是能够说一点。
        在回答这个问题之前,我先回答:不少人问我,究竟是学驱动还是学应用?
        我仅仅能说凭兴趣,而且驱动和应用并非截然分开的
    1.  我们说的驱动。事实上并不局限于硬件的操作,还有操作系统的原理、进程的休眠唤醒调度等概念。想写出一个好的应用。想比較好的解决应用碰到的问题。这些知识你应该懂
    2.  做应用门槛低,特别是如今的ANDROID,纯JAVA。

    做应用的发展路径个人觉得就是业务纯熟。比方在通信行业、IPTV行业、手机行业,你了解行业的需求。所以,当领导的人,多是做应用出身的。
    3.  做驱动,事实上我不想称为“做驱动”,而是想称为“做底层系统”,做好了这是通杀各行业。

    我工作几年,做过手机、IPTV、会议电视,可是这些产品对我毫无区别。由于我仅仅做底层。他们的业务跟我没关系。

    当应用出现故障,他们解决不了时,我就会从内核角度给他们出主意,给他们提供工具。做底层的发展方向,个人觉得是技术专家。
    4.  事实上,做底层还是做应用,之间并没有一个界线,有底层经验。再去做应用,你会感觉非常踏实。

    有了业务经验。你再了解一下底层。非常快就能够组成一个团队。
      
        回到怎么学的问题上。

    嵌入式Linux底层系统包括哪些东西?不要急。举一个样例你就知道了。
    1.  电脑一开机,那些界面是谁显示的?是BIOS。它做什么?一些自检,然后从硬盘上读入windows,并启动它类似的,这个BIOS相应于嵌入式Linux里的bootloader。

    这个bootloader要去Flash上读入Linux内核。并启动它。
    2.  启动windows的目的是什么?当然是上网聊天什么的了。这些上网、聊天工具在哪?在C盘、D盘上。所以, windows要先识别出C盘、D盘。在Linux下我们称为根文件系统。
    3.  windows能识别出C盘、D盘。那么肯定能读写硬盘才行。这涉及的东西称为驱动程序。当然不不过硬盘。还有网卡、USB等等。嵌入式Linux能从Flash上读出并运行应用程序,肯定也得有Flash的驱动程序啊。当然也不不过Flash。


          
        先讲到这里吧。嵌入式LINUX里含有bootloader, 内核, 驱动程序、根文件系统这4大块。


    一、bootloader:
        它就是一个略微复杂的裸板程序。

    可是要把这裸板程序看懂写好一点都不easy。Windows下好用的工具弱化了我们的编程能力。
        非常多人一玩嵌入式就用ADS、KEIL。你能回答以下这几个问题吗?
    1.  一上电。CPU从哪里取指令运行?
        答:一般从Flash上指令。
    2.  可是Flash通常是仅仅能读不能直接写的,假设我用到全局变量。这些全局变量在哪里?
        答:全局变量应该在内存里
    3.  那么谁把全局变量放到内存里去?
        答:长期用ADS、KEIL的朋友,你能回答吗?这须要"重定位"。在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。你可曾去阅读过?
    4.  内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?
        答:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。可是。你去研究过吗?
    5.  你说重定位是把程序从Flash拷贝到内存,那么这个程序能够读Flash啊?
        答:是的,要能操作Flash。

    当然不不过这些。还有设置时钟让系统执行得更快等等。
      
        先自问自答到这里吧。bootloader这一个裸板程序。事实上有3部分要点:
    1.  对硬件的操作
    2.  对ARM体系处理器的了解
    3.  程序的基本概念:重定位、栈、代码段数据段BSS段什么的。
      
        对硬件的操作,须要看原理图、芯片手冊。这须要一定的硬件知识。不求你能设计硬件,可是至少能看懂; 不求能看懂模拟电路可是要能看懂数字电路。这方面的能力我是在学校里学到的,微机原理、数字电路这2本书(书名忘了)就足够了。可是我怀疑你有无耐心把这2本书看完。我不知道如今有没有更快捷的书。想速成的话。就先放掉这块吧,不懂就问GOOGLE、发贴。另外,芯片手冊是肯定要读的。别去找中文的,就看英文的。

    開始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后,读不论什么芯片手冊都非常easy。
        对ARM体系处理器的了解, 看杜春蕾的ARM体系架构与编程吧。里面讲有汇编指令,有异常模式、MMU等。也就这3块内容须要你了解。


        程序的基本概念,王道当然是去看编译原理了。可惜,这类书绝对是天书级别的。劝你若非超级天才还是别去看了。

    就看我写的<嵌入式Linux应用开发全然手冊>和第1期视频吧,别操心,不用花钱。照着视频把硬件相关的实验做了。这些概念就清楚了。我还没有发现第2套讲这些概念的书或视频,同意我盲目吹嘘一回。

        对于bootloader,我学习时是先看了<ARM体系架构与编程>。然后自己敲代码把各个硬件的实验都做了一遍,比方GPIO、时钟、SDRAM、UART、NAND。把它们都弄清楚了,组在一起就非常easy看懂u-boot了
        总结一下,看懂硬件原理图、看芯片手冊,这须要你自己去找资料。剩下的,就按<嵌入式Linux应用开发全然手冊>和第1期视频的章节文件夹去学习吧。


    二、内核:
    想速成的人,先跨过内核的学习,直接学习怎么写驱动。想成为高手,内核必须深刻了解。注意,我说的是了解。我没奢望去写出一个内核。

    要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。
        推荐两本书:
    1.  通读<linux内核全然凝视>,请看薄的那本(浮燥的社会讲求速度, 呵)


    2.  选读<Linux内核情景分析>, 想了解哪一块就读哪一节

    三、驱动:
        驱动包括两部分:硬件本身的操作、驱动程序的框架。又是硬件,还是要看得懂原理图、读得懂芯片手冊。多练吧。


        说到驱动框架,有一些书介绍一下。LDD3,即<Linux设备驱动>,老外写的那本,里面介绍了不少概念。值得一读。可是,它的作用也就限于介绍概念了。我基本上是入门之前用它来熟悉一下概念。入门后就扔掉了。驱动方面比較全的介绍,应该是宋宝华的<linux设备驱动开发具体解释>了。老实说我仅仅看过文件夹,有不少人说好,这里推荐一下。要想深入了解某一块,<Linux内核情景分析>绝对是超5星级推荐。你别指望把它读完,1800多页。上下两冊呢。我是某一块不清楚时,就去翻一下它。

    不论什么一部分,这书都能够讲上2、3百页。很具体。

    而且是以某个目标来带你分析内核源代码。

    它以linux 2.4为例,可是原理相通,相同适用于其他版本号的linux。
        把你手上的开发板所涉及的硬件,都去尝试写一个驱动吧。有问题就先"痛苦地思考",思考的过程中你会把非常多不相关的知识串联起来。终于贯通。

    四、根文件系统:
        大家有没有想过以下这2个问题:
    1.  对于Linux做出来的产品。有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后。应该启动哪一个应用程序呢?
        答:内核不知道也无论应该启动哪一个用户程序。它仅仅启动init这一个应用程序。它相应/sbin/init。显然。这个应用程序就要读取配置文件,依据配置文件去启动用户程序(监控、手冊界面、平板界面等等)

    这个问题提示我们,文件系统的内容是有一些约定的,比方要有/sbin/init。要有配置文件
    2.  你写的hello,world

    程序,有没有想过里面用到的printf是谁实现的?
        答:这个函数不是你实现的,是库函数实现的。

    它执行时,得找到库。

    这个问题提示我们。文件系统里还要有库。


          
        简单的自问自答到这里。要想深入了解,能够看一下busybox的init.c,就能够知道init进程做的事情了。当然,也能够看<嵌入式Linux应用开发全然手冊>里构建根文件系统那章。

        说一下我的学习经历吧。
    1.  我在学校时读的是物理电子专业,事实上课程里没有教怎么设计电路,仅仅是教了些电子电路方面的知识。PCB的设计是在实验室里自学的,仅仅设计过2层板,如今忘记得差点儿相同了。可是保留了看原理图、看芯片手冊的能力。


    2.  选修了软件学位,对软件设计挺感兴趣,可是也仅仅是学了C语言、数据库而已。

    凭着兴趣做了不少竞赛题。没能力去參加竞赛,可是把C语言练得非常扎实。
    3.  在实验室、在第1家公司。就是设计些简单的PCI卡,写一下windows的驱动程序
    4.  在第2家公司。用51单片机做车载电话,開始走上纯软件的道路。


    5.  開始感到单片机的不足,辞职半年闭门学Linux。从red hat怎么操作開始。步骤就是先看<ARM体系架构与编程>。再自己写裸板程序操作硬件。接着到分析u-boot。

    同一时候看<linux内核全然凝视>。对LINUX框架有所了解。在写裸板时,建议各位加强对中断的理解。内核就是用中断来完毕各种功能的。


    6.  分析完u-boot,就開始进行简单的驱动编程了,这时候,能力还非常弱。


    7.  開始去中兴上班,工作2年,编写各类驱动、解决各类问题(驱动问题、帮助定位应用问题),能力得到煅炼。


    从教师的国家镶嵌品输送

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4853061.html
Copyright © 2011-2022 走看看