作为一个新人,如何学习嵌入式Linux
分类:网校动态日期:2024-09-03 03:33:51人气:
在学习嵌入式Linux之前,必须有C语言基础。有没有组装基础也没关系(组装说明只有几条,看到就用)。 C语言需要学到什么程度?当然,越熟悉越好。如果不熟悉的话,还是需要有基本功的。比如写一个数组进行排序,输入数字进行求和等等。学习C语言的唯一途径就是多写程序、多练习。编译有错误没关系,可以自己解决;执行中出错没关系,可以自己分析。我以前是用VC练习C语言的,也经常尝试写一些C语言的竞赛题。都是纯C、纯数学、纯逻辑题,不涉及接口之类的东西,非常适合磨练你的编程能力。回到主题,首先我们要明白你的目的是什么。一般来说,所谓的嵌入式Linux可以分为底层系统和应用开发两部分。如果你想做应用程序开发,那么你应该学习C语言、数据结构、JAVA等。嵌入式应用开发和PC上的应用开发没有什么特别需要注意的地方。也许你说嵌入式系统需要做一些优化。是的,需要优化,但是未优化的程序和PC上的程序开发没有区别。另外,当你有优化的能力时,就不再需要问这个问题了。具体到某个例子,比如开发界面,我们在PC上使用VC;在嵌入式Linux中,也许我们使用QT或Android。这个时候你就应该学习QT和Android编程。但基础还是C或者JAVA,在此基础上,你可以熟悉他们的界面。如果你学过VC,你还需要花时间理解那些类和控件。
如果你的目的是学习底层系统,这是我的专长,我可以说一点。在回答这个问题之前,我先回答一下:很多人问我到底该学开车还是应聘?
我只能说是基于兴趣,驱动和应用程序并没有完全分开。
我们所说的驱动程序不仅仅局限于硬件的运行,还包括操作系统的原理以及进程的睡眠和唤醒调度等概念。如果你想写出一个好的应用程序,想更好的解决应用程序遇到的问题,这些知识你就应该知道,而且制作应用程序的门槛很低,尤其是现在的ANDROID,是纯JAVA的。我个人认为应用开发的发展路径就是业务熟练程度。比如通信行业、IPTV行业、手机行业,你了解行业的需求。所以,领导者大多是做应用的。其实我不想称之为“做驱动”,而是“做底层系统”。如果我们做得好,它将杀死所有行业。我工作了几年,做过手机、IPTV、会议电视,但这些产品对我来说没有什么区别,因为我只做底层。他们的事与我无关。当应用程序出现问题他们解决不了的时候,我会从内核的角度给他们出主意,给他们提供工具。至于底层的发展方向,我个人认为我是一个技术专家。其实做底层和做应用是没有界限的。如果你有底层的经验,然后开始做应用,你会觉得很有安全感。有了业务经验和对底层的了解,就可以快速组建团队。
回到如何学习的问题。嵌入式Linux底层系统包括哪些内容?别担心,给我举个例子你就知道了。
当计算机打开时,谁显示那些界面?它是BIOS吗?它有什么作用?一些自检,然后从硬盘读取Windows,并启动它。同样,这个BIOS对应于嵌入式Linux中的bootloader。该引导加载程序将从闪存读取Linux 内核并启动它。启动windows的目的是什么?当然就是网上聊天什么的。这些互联网和聊天工具在哪里?分别在C盘和D盘。因此,Windows首先要识别C盘和D盘。在Linux下我们称其为根文件系统。如果windows能够识别C盘和D盘,那么它一定能够读写硬盘。这涉及到一个叫做驱动程序的东西。当然不仅仅是硬盘,还包括网卡、USB等。嵌入式Linux可以从Flash中读取和执行应用程序,它必须有Flash驱动程序,当然不仅仅是Flash。
我们先到此为止。嵌入式LINUX包含四个主要部分:引导加载程序、内核、驱动程序和根文件系统。
一、bootloader:
这只是一个稍微复杂的裸板程序。但要理解和编写这个裸板程序却一点也不容易。 Windows下的易用工具削弱了我们的编程能力。
很多人玩嵌入式的时候都会用到ADS和KEIL。你能回答这些问题吗?
上电后,CPU从哪里取指令执行?答:一般来说,命令是从Flash发出的。但Flash一般只能读取,不能直接写入。如果我使用全局变量,这些全局变量在哪里?答:全局变量应该在内存中。那么谁将全局变量放入内存呢?答:长期使用ADS和KEIL的朋友,您能回答一下吗?这就需要“搬迁”。在ADS或KEIL中,重定位代码是由制造这些工具的公司为您编写的。你有去读过吗?内存这么大,我怎么知道把原来存储在Flash中的内容读到内存中呢?答:该地址是使用“链接脚本”确定的。 ADS中有分散文件,KEIL中有类似文件。但你研究过吗?
Bootloader,一个裸板程序,其实有三个要点。
1、硬件操作
2.ARM系统处理器的理解
3、程序的基本概念:重定位、堆栈、代码段、数据段、BSS段等。
对于硬件操作,需要阅读原理图和芯片手册。这需要一定的硬件知识。不要求你会设计硬件,但至少要能理解它;不要求您能够理解模拟电路,但要求您能够理解数字电路。这个能力我是在学校学到的,这两本书(书名我忘记了)就足够了。但我怀疑你是否有耐心读完这两本书。
不知道现在有没有更快的书。如果你想快点完成,就先把这部分放掉。如果不懂就去GOOGLE问或者发帖。另外,一定要阅读芯片手册。不要找中文版,只看英文版。一开始是很痛苦的,但是后来你会发现,一旦熟悉了语法和词汇,读任何芯片手册都很容易。要了解ARM系统处理器,可以看杜春雷的《ARM系统架构与编程》,里面讲了汇编指令、异常模式、MMU等,这是你需要了解的三块内容。
编程的基本概念当然是看编译原理。可惜的是,这样的书绝对是一本天书。我建议你不要读它,除非你是超级天才。只需观看有关嵌入式Linux 应用程序开发的完整手册和我编写的第一个视频即可。别担心,你不必花钱。跟着视频并做硬件相关的实验后,这些概念就会变得清晰起来。我还没有找到关于这些概念的第二套书籍或视频可以让我盲目吹牛。对于bootloader,我在学习的时候,首先看了ARM的架构和编程,然后自己写了程序,尝试了各种硬件,比如GPIO、时钟、SDRAM、UART、NAND等。一旦你把它们全部弄清楚并将它们放在一起,理解u-boot就会很容易了。
综上所述,看懂硬件原理图、阅读芯片手册,需要自己去找资料。其余的就按照《嵌入式Linux应用开发完全手册》以及第一个视频的章节列表来学习即可。
二、内核:
想要快速学习的人应该先跳过内核学习,直接学习如何编写驱动程序。想要成为高手,就必须对核心有深刻的理解。注意,我说的是理解,我并没有想到要写一个内核。需要了解里面的调度机制、内存管理机制、文件管理机制等。推荐两本书:
1.通读Linux内核完整注释,请看Bo的书(浮躁的社会讲究速度,哈哈)
2.选择阅读Linux内核场景分析。如果您想知道哪一部分,请阅读哪一部分。
三、驱动:
驱动程序由两部分组成:硬件本身的操作和驱动程序框架。又是硬件,还是要看懂原理图和芯片手册,多练习。说到驱动框架,有一些书籍对其进行了介绍。 LDD3,Linux设备驱动程序,是老外写的一本书。它介绍了很多概念,值得一读。然而,它的作用仅限于介绍概念。我基本上在上手前用它来熟悉概念,上手后就扔掉了。
对驱动比较全面的介绍应该是宋保华对Linux设备驱动开发的详细讲解。说实话,我只看过目录。很多人都说我推荐这里。如果你想深入了解某个领域,Linux内核场景分析绝对是超5星推荐。别指望能完成它。该书共1,800 多页,由两卷组成。当我对某个部分不清楚时,我就会复习它。这本书可以涵盖其中的任何部分,200或300页,非常详细。并且它会带领你带着一定的目标去分析内核源代码。以Linux 2.4为例,但原理是相同的,适用于其他版本的Linux。还有其他的介绍吗?哈哈,当然,魏东山Linux视频第2期。嵌入式Linux应用开发完全手册,关于驱动的讲得不多,不够深入。所以我录制了这个视频。它不仅教你如何编写和更改驱动程序,还教你为什么要这样编写和更改驱动程序。
每个驱动都现场写:
用画板画图讲解——相当于学校老师在黑板上画图讲解。非常直观,绝对不是看PPT。使用Source Insight 现场编写程序,从第1 行开始,并在每节课中执行此操作。我讲了20多个驱动程序,写了20多个程序。编写完成后进行编译和测试。非常全面,包括字符设备驱动、块设备、网卡驱动,还有硬件介绍、驱动框架分析、测试。培训机构教授的内容远没有这个视频丰富。我在很多培训机构讲过课,从来没见过有哪个老师敢现场讲解每节课,现场写代码,现场测试,除了我!我还没有看到哪个培训机构讲完这些内容——由于时间不够,至少需要一个月才能讲完,但这部分基本上只有两周的教学时间。
尝试为您拥有的开发板中涉及的所有硬件编写驱动程序。当你遇到问题时,先“痛苦地思考”。在思考的过程中,你会把很多不相关的知识连接在一起,最终把它搞通。
四、根文件系统:
您是否想过这两个问题:
至于Linux做的产品,有的是用于监控的,有的是用于手机的,有的是用于平板电脑的。那么内核启动并挂载根文件系统后,应该启动哪个应用程序呢?答:内核不知道也不关心应该启动哪个用户程序。它只启动init应用程序,对应于/sbin/init。显然,这个应用程序必须读取配置文件,并根据配置文件启动用户程序(监控、手动界面、平板界面等)。这个问题提醒我们,文件系统的内容是有一些约定的,比如/sbin。 /init,你需要有一个你编写的hello和world程序的配置文件。你有没有想过其中使用的printf是谁实现的?答:这个函数不是你自己实现的,而是库函数实现的。当它运行时,它必须找到该库。这个问题提醒我们,文件系统中也存在库。简单的自问自答到此结束。如果想更深入的了解,可以看一下busybox的init.c,了解init进程做了什么。当然,您也可以阅读《完整的嵌入式Linux应用开发手册》中关于构建根文件系统的章节。
说一下我的学习经历吧。
我上学的时候学的是物理电子学专业。其实课程并没有教如何设计电路,只是教了一些电子电路的知识。我在实验室自学了PCB设计。我只设计过2层板,现在都快忘记了。但它保留了阅读原理图和芯片手册的能力。我拿了软件学位,对软件设计很感兴趣,但只学了C语言和数据库。出于兴趣我做了很多竞赛题。我没有能力参加比赛,但是C语言我已经练习得很扎实了。在实验室和第一家公司,我只是设计了一些简单的PCI卡并编写了Windows驱动程序。在第二家公司,我用51单片机做了车载电话,开始走上纯软件的道路。我开始感受到单片机的缺点,于是辞掉工作,闭门学习Linux半年,从如何操作红帽开始。步骤是先看ARM架构和编程,然后自己写裸板程序来操作硬件,然后分析u-boot。同时阅读Linux内核的完整注释,了解LINUX框架。在写裸板的时候,建议大家加强一下对中断的理解。内核利用中断来完成各种功能。分析完u-boot后,开始简单的驱动编程。这个时候我的能力还很弱。我开始在中兴工作,工作了2年,编写各种驱动,解决各种问题(驱动问题,帮助定位应用问题),能力得到了磨练。
总结一下:
1、硬件书籍: 微机原理、数字电路、高等院校教材。毕业已经很多年了,我已经忘记了自己的名字。
2.Linux书籍:
ARM架构与编程嵌入式Linux应用开发完全手册Linux设备驱动,老外写的Linux设备驱动开发Linux内核详解完全注释Linux内核场景分析3.视频:
魏东山Linux视频第1期(基于S3C2440录制): ARM实验、u-boot、文件系统、初级驱动
魏东山Linux 视频第1 期(基于S3C6410 录制) : 裸板程序魏东山Linux 视频第2 期: 高级驱动
用户评论
作为一个新人,刚开始接触嵌入式Linux确实有点头大,这篇教程对我来说是个好开始,希望能一步步跟上。
有8位网友表示赞同!
学习嵌入式Linux,先从了解Linux基础开始吧,这篇博文给了我一个清晰的路径。
有7位网友表示赞同!
这篇文章太实用了,作为一个新手,感觉学嵌入式Linux的信心都增强了。
有6位网友表示赞同!
学嵌入式Linux,资料很多,这篇博文帮我筛选了一些必看的书籍和资源。
有18位网友表示赞同!
嵌入式Linux入门,从这篇教程开始,希望能少走弯路。
有13位网友表示赞同!
新人学嵌入式Linux,先了解这些基础知识,这篇博文说得挺到位。
有9位网友表示赞同!
对嵌入式Linux感兴趣,这篇博文让我对这个领域有了更深的认识。
有13位网友表示赞同!
学习嵌入式Linux,这篇教程真的很全面,感谢分享!
有5位网友表示赞同!
嵌入式Linux的学习门槛不低,但只要用心,这篇博文能帮你入门。
有17位网友表示赞同!
作为一个编程小白,这篇博文让我对嵌入式Linux有了兴趣,想试试看。
有5位网友表示赞同!
嵌入式Linux的教程太多,这篇博文推荐的资源很实用,感谢!
有20位网友表示赞同!
学习嵌入式Linux,这篇博文让我觉得入门并不难。
有5位网友表示赞同!
这篇博文对嵌入式Linux的讲解很清晰,新手也能轻松理解。
有11位网友表示赞同!
嵌入式Linux的学习曲线陡峭,这篇博文给了我不少信心。
有17位网友表示赞同!
作为一个有编程基础的人,这篇博文让我对嵌入式Linux有了新的认识。
有14位网友表示赞同!
嵌入式Linux的学习,这篇博文给了我一些实用的建议。
有11位网友表示赞同!
看了这篇博文,感觉嵌入式Linux离我并不遥远,想挑战一下。
有19位网友表示赞同!
学习嵌入式Linux,这篇博文让我有了明确的计划。
有6位网友表示赞同!
这篇博文让我对嵌入式Linux有了更深的理解,谢谢分享!
有7位网友表示赞同!