新手怎么学嵌入式.docx

上传人:b****7 文档编号:23723675 上传时间:2023-05-20 格式:DOCX 页数:32 大小:47.22KB
下载 相关 举报
新手怎么学嵌入式.docx_第1页
第1页 / 共32页
新手怎么学嵌入式.docx_第2页
第2页 / 共32页
新手怎么学嵌入式.docx_第3页
第3页 / 共32页
新手怎么学嵌入式.docx_第4页
第4页 / 共32页
新手怎么学嵌入式.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

新手怎么学嵌入式.docx

《新手怎么学嵌入式.docx》由会员分享,可在线阅读,更多相关《新手怎么学嵌入式.docx(32页珍藏版)》请在冰豆网上搜索。

新手怎么学嵌入式.docx

新手怎么学嵌入式

《新人怎么学嵌入式》

作为一个新人,怎样学习嵌入式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:

  它就是一个稍微复杂的裸板程序。

但是要把这裸板程序看懂写好一点都不容易。

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、发贴。

另外,芯片手册是肯定要读的,别去找中文的,就看英文的。

开始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后,

读任何芯片手册都很容易。

对ARM体系处理器的了解,看杜春蕾的吧,里面讲有汇编指令,有异常模式、MMU等。

也就这3块内容需要你了解。

程序的基本概念,王道当然是去看编译原理了。

可惜,这类书绝对是天书级别的。

劝你若非超级天才还是别去看了。

就看我写的

<嵌入式Linux应用开发完全手册>和第1期视频吧,别担心,不用花钱。

照着视频把硬件相关的实验做了,这些概念就清楚了。

我还没有

发现第2套讲这些概念的书或视频,允许我盲目吹嘘一回。

对于bootloader,我学习时是先看了,然后自己写程序把各个硬件的实验都做了一遍,比如GPIO、时钟、

SDRAM、UART、NAND。

把它们都弄清楚了,组台在一起就很容易看懂u-boot了

总结一下,看懂硬件原理图、看芯片手册,这需要你自己去找资料。

剩下的,就按<嵌入式Linux应用开发完全手册>和第1期视频的章

节目录去学习吧。

二、内核:

想速成的人,先跨过内核的学习,直接学习怎么写驱动。

想成为高手,内核必须深刻了解。

注意,我说的是了解,我没奢望去写出一个内核。

要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。

推荐两本书:

1.通读,请看薄的那本(浮燥的社会讲求速度,呵),

2.选读,想了解哪一块就读哪一节

三、驱动:

驱动包含两部分:

硬件本身的操作、驱动程序的框架。

又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。

说到驱动框架,有一些书介绍一下。

LDD3,即,老外写的那本,里面介绍了不少概念,值得一读。

但是,它的作用

也就限于介绍概念了。

我基本上是入门之前用它来熟悉一下概念,入门后就扔掉了。

驱动方面比较全的介绍,应该是宋宝华的了,老实说我只看过目录,有不少人说好,这里推荐一下。

要想深入了解某一块,绝对是超5星级推荐。

你别指望把它读完,1800多页,上下两册呢。

我是某一块不清楚

时,就去翻一下它。

任何一部分,这书都可以讲上2、3百页,非常详细。

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

它以linux2.4为例,

但是原理相通,同样适用于其它版本的linux。

还有没有其他介绍?

呵呵,当然有了,韦东山Linux视频第2期。

<嵌入式Linux应用开发完全手册>里对驱动讲得不多,不够深入。

于是我录制了这期视频。

不仅仅教你怎么写怎么改驱动,还教你为什么这样写这样改驱动。

每一个驱动都是现场编写:

1.用绘图板画图讲解──相当于学校里老师在黑板上画图讲解,很直观

  绝对不是对着PPT念。

2.用sourceinsight当场写程序,从第1行开始写,每一课都是这样。

我讲了20多个驱动,就写了20多个程序。

3.写完就编译、测试。

4.很全面,字符设备驱动、块设备、网卡驱动3大类齐全,硬件介绍、驱动框架分析、测试3大类齐全。

  培训机构里教的内容,远不及这期视频丰富。

我在多个培训机构讲过课,从没看到哪个老师敢每一课都当场讲解当场编写代码

当场测试,除我之外!

也没看到哪个培训机构讲完这些内容──因为时间不够,讲完起码要一个月,但是这部分基本只有2周授课时间。

把你手上的开发板所涉及的硬件,都去尝试写一个驱动吧。

有问题就先"痛苦地思考",思考的过程中你会把很多不相关的知识

串联起来,最终贯通。

四、根文件系统:

大家有没有想过这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,从redhat怎么操作开始。

步骤就是先看

  再自己写裸板程序操作硬件,接着到分析u-boot。

同时看,对LINUX框架有所了解。

  在写裸板时,建议各位加强对中断的理解,内核就是用中断来完成各种功能的。

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

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

  

  总结一下:

1.硬件方面的书:

微机原理、数字电路,高校里的教材。

毕业多年,忘名了。

2.Linux方面的书:

  

    <嵌入式Linux应用开发完全手册>

  ,老外写的那本

  

  

  

 

提问必看!

作者:

EricStevenRaymond

译文

译文:

捷克语丹麦语爱沙尼亚语法语德语希伯来语匈牙利语意大利语日语波兰语俄语西班牙语瑞典语土耳其语.如果你想复制、镜像、翻译或引用本文,请参阅我的复制须知.

引言

在黑客的世界,你所提技术问题的回答很大程度上取决于你提问的方式与解决此问题的难度,本文将教你如何提问才更有可能得到满意的答复。

开源程序的使用已经很广,你通常可以从其它更有经验的用户而不是黑客那里得到回答。

这是好事,他们一般对新手常有的毛病更容忍一点。

然尔,使用我们介绍的方法象对待黑客那样对待这些有经验的用户,通常能最有效地得到问题的解答。

第一件需要明白的事是黑客喜欢难题和激发思考的好问题。

假如不是这样,我们也不会写本文了。

如果你能提出一个有趣的问题让我们咀嚼玩味,我们会感激你。

好的问题是种激励与礼物,帮助我们发展认知,揭示没有注意或想过的问题。

在黑客中,“好问题!

”是非常真挚的赞许。

除此而外,黑客有遇到简单问题就表现出敌视或傲慢的名声,有时候我们看起来还对新手和愚蠢的家伙有条件反射式的无礼,但并不真正是这样。

我们只是毫无歉意地敌视那些提问前不愿思考、不做自己该做之事的人。

这种人就象时间无底洞──他们只知道获取,不愿意付出,他们浪费了时间,这些时间本可用于其它更值得回答的人和更有趣的问题。

我们将这种人叫做“失败者(loser)”(由于历史原因,我们有时将“loser”拼为“lusers")

我们注意到许多人只想用我们写的软件,他们对学习技术细节没有兴趣。

对大多数人而言,计算机只是种工具,是种达到目的的手段。

他们要生活并且有更要紧的事要做,我们承认这点,也从不指望每个人都对这些让我们着迷的技术问题感兴趣。

不过,我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与问题解决的人,这一点不会变,也不该变。

如果这都变了,我们就会在自己能做得最好的事情上不再那么犀利。

我们(多数)是自愿者,从自己繁忙的生活中抽时间来回答问题,有时会力不从心。

因此,我们会无情地滤除问题,特别是那些看起来象是失败者的,以便更有效地把回答问题的时间留给那些“胜利者”

如果你认为这种态度令人憎恶、以施惠者自居或傲慢自大,请检查你的假设,我们并未要求你屈服──事实上,假如你做了该做的努力使之成为可能,我们中的大多数人非常乐意平等地与你交流并欢迎你接纳我们的文化。

试图去帮助那些不愿自救的人对我们简直没有效率,不懂没有关系,但愚蠢地行事不行。

所以,你不必在技术上很在行才能吸引我们的注意,但你必须表现出能引导你在行的姿态──机敏、思考、善于观察、乐于主动参与问题的解决。

如果你做不到这些使你与众不同的事情,我们建议你付钱跟别人签商业服务合同,而不是要求黑客无偿帮助。

如果你决定向我们求助,你不会想成为一名失败者,你也不想被看成一个失败者。

得到快速有效回复的最好方法是使提问者看起来象个聪明、自信的人,并且暗示只是碰巧在某一特别问题上需要帮助。

(欢迎对本文指正,可以将建议发至esr@。

请注意,本文不想成为一般性的网络礼仪指南,我一般会拒绝那些与引出技术论坛中有用的回复不特别相关的建议)

提问前

在通过电子邮件、新闻组或网页论坛提技术问题之前,做以下事情:

尝试搜索互联网以找到答案

尝试阅读手册以找到答案

尝试阅读FAQ(常见问题)文档以找到答案

尝试自己检查或试验以找到答案

尝试请教懂行的朋友以找到答案

如果你是程序员,尝试阅读源代码以找到答案

提问时,请先表述你已经做了上述事情,这将有助于建立你不是寄生虫与浪费别人时间的印象。

最好再表述你从中学到的东西,我们喜欢回答那些表现出能从答案中学习的人。

使用某些策略,比如用Google搜索你遇到的错误提示(既搜索网页也查查讨论组),可能就直接找到了解决问题的文档或邮件列表线索。

即使没有结果,在电子邮件或新闻组张贴问题时提一句“我在Google中查过下列句子但没有找到什么有用的东西”也是件好事。

准备你的问题,彻底地思考。

轻率的提问只能得到轻率的回答,或者压根没有。

在提问时,越是表现出做过思考并在努力解决问题,你越有可能得到实际帮助。

注意别提错问题。

如果提问基于错误的假设,某黑客多半会一边想”愚蠢的问题……“,一边用按照问题字面的无用答案回复你,并且希望这种只是得到字面回答而不是真正所需的经历给你一个教训。

永远不要假设你有资格得到解答。

你没有这种资格,毕竟你没有为此服务付费。

如果你能够提出有内容、有趣和激励思考的问题──那种毫无疑问能够向社区贡献经验而不仅仅是消极地要求从别人那获取知识的问题,你将“挣到”答案。

另一方面,表明你能够也乐意参与问题的解决是个很好的开端。

“有没有人能指个方向?

”、“我这还漏点什么?

”、“我应该查哪些网站?

”通常要比“请给出我可以用的完整步骤”更容易得到回复,因为你表明了只要有人能指个方向你就很乐意完成剩下的过程。

提问时

仔细挑选论坛

要对在哪提问留心,如果你做了下述事情,多半会被一笔勾销或被看成“失败者”:

张贴与论坛主题完全无关的问题

在面向高级技术问题的论坛上提非常初浅的问题,或者反之。

在太多不同的新闻组同时交叉张贴

给既非熟人也没有义务解决你问题的个人张贴你私人的电子邮件

为保护通信的渠道不被无关的东西淹没,黑客会除掉那些没有找对地方的问题,你不会想有这种经历的。

所以第一步是找对论坛,Google与其它搜索引擎还是你的朋友,可以用它们搜索与你遇到困难的软硬件问题最相关的项目的网站。

那里通常都有项目的FAQ列表、邮件列表及其文档的链接。

如果你的努力(包括阅读FAQ)都没有结果,这些邮件列表就是最后能取得帮助的地方。

项目的网站也许还有报告臭虫的流程或链接,如果是这样,去看看。

向陌生的人或论坛发送邮件极有可能是在冒险。

譬如,不要假设一个富含信息的网页的编写者想充当你的免费顾问,不要对你的问题是否会受到欢迎做乐观的估计──如果你不确定,向别处发或者根本别发。

在选择网页论坛、新闻组或邮件列表时,不要太相信名字,先看看FAQ或者许可书以明确你的问题是否与其主题相关。

张贴前先翻翻已有的帖子可以帮助你感受一下那里行事的方式。

事实上,张贴之前在新闻组或邮件列表中搜索与你问题相关的关键词是个很好的主意,也许就找到答案了。

即使没有,也能帮助你整理出更好的问题。

别象机关枪似的一次性“扫射”所有的帮助通道,那就象大嚷大叫并使人不快。

一个一个地来。

弄清楚你的主题!

最典型的错误之一是在某种致立于跨Unix和Windows平台的语言、库或工具的论坛中提关于操作系统程序接口的问题。

如果你不明白为什么这是大错,最好在搞清楚概念前什么也别问。

一般来说,在仔细挑选的公共论坛中提问比在私有论坛中提同样的问题更容易得到有用的回复。

有许多理由支持这一点,一是看潜在的回复者有多少,二是看论坛的参与者有多少,黑客更愿回答能启发多数人的问题。

可以理解,老练的黑客和一些流行软件的作者正在收到超出他们承受能力的不当消息。

就象那根多出来就可以压垮骆驼背的稻草一样,你的加入也可能会使情况走向极端──已经好几次了,一些流行软件的作者退出了对其软件的支持,因为伴随而来的涌向其私人邮箱的大量无用消息变得无法忍受。

面向新手的网页论坛和IRC通常响应最快

本地的用户组织或者你所用的Linux发行版也许正在宣传新手取得帮助的网页论坛或IRC(互联网中继聊天)(在非英语国家,新手论坛很可能还是邮件列表),这些地方是开始提问的好去处,尤其是当你觉得遇到的也许只是相对简单或者一般的问题时。

经过宣传的IRC通道是个公开邀请提问的地方,通常可以得到实时的回复。

事实上,如果出问题的程序来自某发行版(这很常见),在程序的项目论坛或列表提问前最好先在发行版的论坛或列表中问问,(否则)项目的黑客可能仅仅回复“用我们的代码”

在任何网页论坛张贴之前,先看看是否有搜索功能。

如果有,就试试用问题的几个关键词搜索一下,也许就有帮助。

如果在此之前你已做过全面的网页搜索(你应该这样做),还是再搜索一下论坛,搜索引擎最近也许还没有索引此论坛的全部内容。

通过网页论坛或IRC频道提供项目的用户支持有增长的趋势,电子邮件交流则更多地为项目开发保留。

先在网页论坛或IRC中寻求与项目相关的帮助。

第二步,使用项目邮件列表

当某项目存在开发者邮件列表时,即使你确信谁能最好地回答问题,也要向列表而不是其中的个体提问。

检查项目的文档和主页,找到项目的邮件列表并使用它。

采用这种策略有几个好理由:

任何向单个开发者提的足够好的问题也将对整个项目组有益。

相反,如果你认为自己的问题对整个项目组来说太愚蠢,这也不能成为打扰单个开发者的理由。

向列表提问可以平衡开发者的负担,单个开发者(特别是项目领导)也许太忙以至于无法回答你的问题。

大多数邮件列表有历史文档并被搜索引擎索引,其它人可以通过网页搜索找到你的问题和答案而不用再次在邮件列表中发问。

如果某些问题经常被问到,开发者可以利用此信息改进文档或软件本身以使其更清楚。

如果只是私下提问,就没有人能看到最常见问题的完整场景。

如果一个项目既有“用户”也有“开发者”(或“黑客”)邮件列表或网页论坛,而你又不摆弄那些代码,向“用户”列表或论坛提问。

不要假设自己在开发者列表中会受欢迎,那些人多半会遭受你的噪音干扰。

然尔,如果你确信你的问题不一般,而且在“用户”列表或论坛中几天都没有回复,可以试试“开发者”列表或论坛。

建议你在张贴前最好先暗暗地观察几天以了解那的行事方式(事实上这是参与任何私有或半私有列表的好主意)

如果你找不到一个项目的邮件列表,而只能查到项目维护者的地址,只管向其发信。

即便在这种情况下,也别假设(项目)邮件列表不存在。

在你的电子邮件中陈述你已经试过但没有找到合适的邮件列表,也提及你不反对将自己的邮件转发给他人(许多人认为,即使没什么秘密,私人电子邮件也不应该被公开。

通过允许将你的电子邮件转发他人给了相应人员处置你邮件的选择)。

使用明确而有意义的主题

在邮件列表、新闻组或网页论坛中,主题是你在五十个或更少的字符以内吸引有资格的专家注意的黄金机会,不要用诸如“请帮我”(更别提大写的“请帮我!

”,这种主题的消息会被条件反射式地删掉)之类的唠叨浪费机会。

不要用你痛苦的深度来打动我们,相反,要在这点空间中使用超级简明扼要的问题描述。

使用主题的好惯例是“对象──偏差”(式的描述),许多技术支持组织就是这样做的。

在“对象”部分指明是哪一个或哪一组东西有问题,在“偏差”部分则描述与期望行为不一致的地方。

愚蠢:

救命啊!

我的笔记本视频工作不正常!

明智:

XFree864.1扭曲鼠标光标,某显卡MV1005型号的芯片组

更明智:

使用某显卡MV1005型号芯片组的XFree864.1的鼠标光标被扭曲

编写“对象──偏差”式描述的过程有助于你更具体地组织你的问题。

是什么被影响了?

仅仅是鼠标光标或者还有其它图形?

只在XFree86中出现?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1