1、嵌入式学习心得如何学习嵌入式系统(基于 ARM 平台) 前 言网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。 一、嵌入式系统的概念 着重理解“嵌入”的概念 主要从三个方面上来理解。 1、从硬件上,将基于 CPU 的处围器件,整合到 CPU 芯片内部,比如早期基于 X86 体系结构下的计算机,CPU 只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的 16C550/2 的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到 CPU 内部,还有 PC 机有显卡,而多数嵌入式处理
2、器都带有 LCD 控制器,但其种意义上就相当于显卡。比较高端的ARM 类 Intel Xscale 架构下的 IXP 网络处理器 CPU 内部集成 PCI 控制器(可配成支持 4 个 PCI 从设备或配成自身为 CPI 从设备) ;还集成 3 个 NPE 网络处理器引擎,其中两个对应于两个 MAC 地址,可用于网关交换用,而另外一个 NPE 网络处理器引擎支持 DSL,只要外面再加个 PHY 芯片即可以实现DSL 上网功能。IXP 系列最高主频可以达到 1.8G,支持 2G 内存,1G10 或 10G1 的以太网口或Febre channel 的光通道。IXP 系列应该是目标基于 ARM 体系
3、统结构下由 intel 进行整合后成 Xscale 内核的最高的处理器了。 2、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到 ROM 中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入” ,比如 WinCE 在内核定制时,会有相应选择,其中就是 wordpad,PDF,MediaPlay 等等选择,如果我们选择了,在 CE 启动后,就可以在界面中找到这些东西,如果是以前 PC 上将的 windows 操作系统,多半的东西都需要我们得新再装。 3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的 ROM 中就实现了一个真正的“嵌入” 。 以上的
4、定义是我在 6、7 年前给嵌入式系统下自话侧重于理解型的定义,书上的定义也有很多,但在这个领域范围内,谁都不敢说自己的定义是十分确切的,包括那些专家学者们,历为毕竟嵌入式系统是计算机范畴下的一门综合性学科 二、嵌入式系统的分层与专业的分类。 嵌入式系统分为层,硬件层、驱动层、操作系统层和应用层。 1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用 C 和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成 CPLD 的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是
5、基础,增值还要靠软件。 硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C 语言。 2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows 下我们打开一个程序运行后,再打开一个程序时,要不就是中断以
6、前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。 驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。 3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP
7、 操作系统是微软投入 300 人用两年时间才搞定的,总时工时是 600 人年,中科院软件所自己的女娲 Hopen 操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。 4、应用层,相对来讲较为容易的,如果会在 windows 下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及 Java 方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、 H.323、Astrisk)方面又较为复杂,并
8、且有难度了。 三、目标与定位。 先有目标,再去定位。 学 ARM,从硬件上讲,一方面就是学习接口电路设计,另一方面就是学习汇编和 C 语言的板级编程。如果从软件上讲,就是要学习基于 ARM 处理器的操作系统层面的驱动、移植了。这些对于初学都来说必须明确,要么从硬件着手开始学,要么从操作系统的熟悉到应用开始学,但不管学什么,只要不是纯的操作系统级以上基于 API 的应用层的编程,硬件的寄存器类的东西还是要能看懂的,基于板级的汇编和 C 编程还是要会的。因此针对于嵌入式系统的硬件层和驱动程的人,ARM 的接口电路设计、ARM 的 C 语言和汇编语言编程及调试开发环境还是需要掌握的。 因此对于初学者
9、必然要把握住方向,自己的目标是什么,自己要在那一层面上走。然后再着手学习较好,与 ARM 相关的嵌入式系统的较为实际的两个层面硬件层和驱动层,不管学好了那一层都会很有前途的。 如果想从嵌入式系统的应用层面的走的话,可能与 ARM 及其它体系相去较远,要着重研究基嵌入式操作系统的环境应用与相应开发工具链,比如 WinCe 操作系统下的 EVC 应用开发(与 windows 下的 VC 相类似) ,如果想再有突破就往某些音视频类的协议上靠,比如 VOIP 领域的基于 SIP 或 H.323协议的应用层开发,或是基于嵌入式网络数据库的开发等等。 对于初学者来讲,要量力而行,不要认为驱动层工资高就把它
10、当成方向了,要结合自身特点,嵌入式系统四个层面上那个层面上来讲都是有高人存在,当然高人也对应的高工资,我是做硬件层的,以前每月工资中个人所得税要被扣上近 3 千大元,当然我一方面充当工程师的角色,一方面充当主管及人物的角色,两个职位我一个人干,但上班时间就那些。硬件这方面上可能与我 PK 的人很少了,才让我拿到那么多的工资。 四、开发系统选择。 很多 ARM 初学者都希望有一套自己能用的系统,但他们住住会产生一种错误认识就是认为处理器版本越高、性能越高越好,就象很多人认为 ARM9 与 ARM7 好,我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的那个方向上走
11、,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,那当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。 在某种意义上请,ARM7 与 9 的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如 286 和 386。对于用户来讲可能觉查不到什么,只能是感觉速度有些快而已。 ARM7 比较适合于那些想从硬件层面上走的人,因为 ARM7 系列处理器内部带 MMU 的很少,而且比较好控制,就比如 S3C44B0 来讲,可以很容易将 Cache 关了,而且内部接口寄存器很容易看明白
12、,各种接口对于用硬件程序控制或 AXD 单步命令行指令都可以控制起来,基于 51 单片机的思想很容易能把他搞懂,就当成个 32 位的单片机,从而消除很多 51 工程师想转为嵌入式系统硬件 ARM 开发工程师的困惑,从而不会被业界某此不是真正懂嵌入式烂公司带到操作系统层面上去,让他们望而失畏,让业界更加缺少这方面的人才。 而嵌入式系统不管硬件设计还是软件驱动方面都是十分注重接口这部分的,选择平台还要考察一个处理器的外部资源,你接触外部资源越多,越熟悉他们那你以后就业成功的机率就越高,这就是招聘时所说的有无“相关技能” ,因为一个人不可能在短短几年内把所有的处理器都接触一遍,而招聘单位所用的处理器
13、就可能是我们完全没有见过的,就拿台湾数十家小公司(市价几千万)的公司生产的ARM 类处理器,也很好用,但这些东西通用性太差,用这些处理器的公司就只能招有相关工作经验的人了,那什么是相关工作经验,在硬件上讲的是外围接口设计,在软件上讲是操作系统方面相关接口驱动及应用开发经验。我从业近十年,2000 年 ARM 出现,我一天始做 ARM7,然后直接跑到了Xscale(这个板本在 ARM10-11 之间) ,一做就是五年,招人面试都不下数百人,在这些方面还是深有体会的。 我个人认为三星的 S3C44b0 对初学者来说比较合适,为什么这么说哪?因为接口资源比较丰富,技术成熟,资料较多,应该十分适合于初
14、学者,有问题可能很容易找人帮且解决,因为大多数人都很熟悉,就如同 51 类的单片机,有 N 多位专家级的人物可以给你帮忙,相关问题得以很快解答,所然业界认为这款 ARM 都做用得烂了,但对于初学者来,就却是件好事。 因此开发系统的选择,要看自己的未来从来目标方向、要看开发板接口资源、还要看业界的通用性。 五、如何看待培训。 首先说说我自己,我目前从业近十年,与国内嵌入式系统行业共同起步,一直站在嵌入式系统行业前沿,设计过多款高端嵌入式系统平台产品并为众多公司提供过解决方案,离职前为从事 VOIP 的美资公司设计 IP-PBX,历任项目经理、项目主管、技术总监、部门经理,积累众多人脉,并集多年经
15、验所得,考虑到学生就业与公司招人的不相匹配,公司想招人招不到,而学生和刚毕业的工程师想找份工作也不太容易,于此力创知天行科技有限公司,开展嵌入式系统教育培训。 因一线的科研人员和一线的教师不相接触,导至国内嵌入式人才缺乏,国外高校的技术超前于业界公司,而国内情况是业界公司方面的嵌入式系统技术要远远领先于高校。为架构业界与高校沟通的桥梁,把先进技能带给高校学子,为学生在就业竞争中打造一张王牌,并为业界工程师快速提升实现自我创造机遇,我就这样辞去了外企年薪 20 多万的职位,做嵌入式系统方面的培训了。 对于培训来讲,是花钱来买时间,很多工程师都喜欢自己学,认为培训不值,这也是有可能的,纯为赚钱的培
16、训当然不会太有价值,但对于实力型的培训他们可能就亏大了,有这样一笔帐不知他们算过没有,如果一个一周的培训,能带给他们自学两年后才能掌握的知识,在培训完后他们用三个月到半年时间消化培训内容,这样他会省约至少一年半的时间来学其它的或重新站在另一个高度上工作,那么他将最迟一年后会拿到他两年后水平所对应的工资,就是在工资与水平对应的关系上比同批人缩短一年,每月按最少 1 千计,再减去培训费用至少多 1.0 万,同时也省了一年时间,不管是休闲也好,再继续提高也好,总之是跑到了队伍的前面了。 另一层面上讲,对于新人的培训相当于他们为自己提前买了份失业保险,有师傅会带领他们入道,我今年暑假时班里最年轻的一个
17、学生是大二的,今年才上大三,这学期才刚学单片机,但现在 ARM 方面的编程工作已经搞得有声有色了,再过一年多毕业,他还会失业吗? 再者通过培训,你可以知道很多业界不为常人所知的事,同时也为自己找了个师傅,就比如说,两个工程师分别用 S3C2410 和 PXA255 来做手持设备,同样两人都工作四年,再出去找工作,两人工资可能最多可相差一倍,为什么?这就是业界不为常人所知的规则,2410 属于民品,被业界用烂了,做产品时成本特敏感,当然也对人才成本敏感了,PXA255 是 intel 的东西,一个 255 CPU 能买三个2410,一直被业界定义为贵族产品,用的公司都是大公司或为军方服务的公司,
18、不会在乎成本,只要把东西做好,一切都好说,但这方面做的人也少啊,因为开发系统贵啊。 对于说为自已找了个好师傅,我想是这样的,因为同级工程师间存在着某此潜在的竞争关系,有很多人不愿意把自己知道的东西教给别人,这意味着他将要失业,就是所说的教会徒弟,饿死师傅,但对于我们这些人就不存在这样的关系了,我是在嵌入式系统平台设计上走到了一定程序,目前在国内这块的技术上已经是自己很难再突破自己,因此很多东西我对大家都是 OPEN 的,就比如说下面那部分关于接口设计中所提到的时序接口东西,我要是不讲,却使是高级硬件工程师我想也几乎只有 10%的人能知道吧。 六、成为高级嵌入式系统硬件工程师要具备的技能。 首先
19、我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通,或去网站看看 www.zt-。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。 对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的 Modem 射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,
20、只要达到一般程度可能月薪都在 15K 以上。 另一类就是数字部分了,在大方向上又可分为 51/ARM 的单片机类,DSP 类,FPGA 类,国内FPGA 的工程师大多是在 IC 设计公司从事 IP 核的前端验证,这部分不搞到门级,前途不太明朗,即使做个 IC 前端验证工程师,也要搞上几年才能胜任。DSP 硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而 ARM 单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互 PK,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,
21、比如 PXA255 处理器 I2C要求速度在 100Kbps,如果把一个 I2C 外围器件,最高还达不到 100kbps 的与它相接,必然要导致设计的失败。这样的情况有很多,比如 51 单片机可以在总线接 LCD,但为什么这种 LCD 就不能挂在 ARM的总线上,还有 ARM7 总线上可以外接个 Winband 的 SD 卡控制器,但为什么这种控制器接不到ARM9 或是 Xscale 处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡
22、乱的来,我遇到一个工程师把方案中的 5V 变1.8V 的 DC 芯片,直接更换成 LDO,有时就会把 CPU 烧上几个。前几天还有人希望我帮忙把他们以前基于 PXA255 平台的手持 GPS 设备做下程序优化,我问了一下情况,地图是存在 SD 卡中的,而 SD 卡与 PXA255 的 MMC 控制器间采用的 SPI 接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题,因此我提了几条建议,让他们更新试下再说。因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你终究能看明白多少,看不明白 80%以上的话,说明你离优秀的工程师
23、还差得远哪。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计 PCB 绘制,逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出 ECAD 工程师,就是专业的画 PCB 板的工程师,和 EMC 设计工程师,帮人家解决 EMC 的问题。硬件工程师再往上就是板级测试工程师,就是 C 语功底很好的硬件工程师,在电路板调试过程中能通过自已编写的测试程序对硬件功能进行验证。然后再交给基于操作系统级的驱动开发人员。 总之,硬件的内容很多很杂,硬件那方面练成了都会成为一个高手,我时常会给人家做下方案评估,很多高级硬件工程师设计的东西,经常被我一句话否定,因此工程师做到我这种
24、地步,也会得罪些人,但硬件的确会有很多不为人知的东西,让很多高级硬件工程师也摸不到头脑。 那么高级硬件件工程师技术技能都要具备那些东西哪,首先要掌握 EDA 设计的辅助工具类如ProtelORCADPowperPCBMaplux2ISE、VDHL 语言,要能用到这些工具画图画板做逻辑设计,再有就是接口设计审图能力,再者就是调试能力,如果能走到总体方案设计这块,那就基本上快成为资深工程师了。 硬件是要靠经验,也要靠积累的,十年磨一剑,百年磨一针。 把一个月前想写的东西,今天终于用一上午的进间整理完了,希望对喜爱嵌入式系统开发的工程师和学生们有所帮助。一阶段:学习 Linux 开发 1、掌握 Li
25、nux 的使用和维护,熟悉 Linux 编程环境 2、深入学习操作系统原理,分析 Linux 内核 3、掌握 Linux 驱动程序开发;二阶段:学习嵌入式 Linux1、学习 ARM 处理器体系结构 2、学习嵌入式 Linux3、嵌入式 Linux 设备驱动程序开发 4、Linux 的移植和裁剪;计划学习书籍:1、鸟哥的 Linux 私房菜:基础学习篇 2、Linux 程序设计 3、Unix 环境高级编程 4、操作系统的设计与实现 5、Linux 内核完全剖析 6、Linux 内核源代码 7、ARM 嵌入式系统开发:软件设计与优化怎样才能学好 linux?随着 Linux 应用的扩展许多朋友开
26、始接触 Linux,根据学习 Windwos 的经验往往有一些茫然的感觉:不知从何处开始学起。这里介绍学习 Linux 的一些建议。 一、从基础开始: 常常有些朋友在 Linux 论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linux 的基础之后,应该就可以很轻易的解决掉这方面的问题。而有些朋友们常常一接触 Linux 就是希望构架网站,根本没有想到要先了解一下 Linux 的基础。这是相当困难的。二、Linux 命令是必须学习的:虽然 Linux 桌面应用发
27、展很快,但是命令在 Linux 中依然有很强的生命力。Linux 是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平这个原理是不会变的,Linux 命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。举一个例子:Linux 的常用命令 find,察看 man 文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手.它的功能实在太强了,在配合 exec 参数或者通过管道重定向到 xargs 命令和grep 命令 ,可以完成非常复杂的操作,如果同样的操作用图形界面的工具来完成 ,恐怕要多花十几陪的时间. 不同版本的 Linux 命
28、令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解 Linux 系统: 安装和登录命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh 文件处理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff 、 cat、 ln 系统管理相关命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last 网
29、络操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup 系统安全相关命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr 、sudo、 pswho 三、选择一本好的工具书:工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于 Linux 的书籍有很多不过精品的不多,笔者强烈建议阅读影印本的“OReilly 原版 Linux 图书 http:/ ”,而且出版社还提供了一个非常好的路线图:ht
30、tp:/ 四、选择一个适合你的 Linux 发行版本:目前全球有超过 1 百多个 Linux 发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,Redhat Linux 和 Debian Linux 是网络管理员的理想选择。对于英语不是很好的读者红旗 Linux、中标 Linux 这些中文版本比较适合。现在一些 Linux 网站有一些 Linux 版本的免费下载,这里要说的是并不适合 Linux 初学者。 五、 养成在命令行下工作: 一定要养成在命令行下工作的习惯,要知道 Xwindow 只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您
31、未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统。六、 选择一个适合你的 Linux 社区: 随着 Linux 应用的扩展,出现了不少 Linux 社区。其中有一些非常优秀的社区:(国内最高水平 GNU 站点)、http:/ (中国最大的 Unix 技术社区),但是这几个论坛往往是 Linux 高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。 七、勤于实践: 要增加自己 Linux 的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一
32、个 Linux 发行版本,然后进入精彩的 Linux 世界。相信对于你自己的 Linux 能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则储存的资料将永远而且立刻的记忆在硬盘中。在人类记忆的曲线中,你必须要不断的重复练习才会将一件事情记得比较熟。同样的,学习 Linux 也一样,如果你无法经常学习的话,学了后面的,前面的忘了。你对 Linux命令熟悉后你可以开始搭建一个小的 Linux 网络,这是最好的实践方法。Linux 是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web 服务器、 DNS 服务器等都非常完善。当然你不需搭建所有
33、服务,可以慢慢来。需要说明的是这个 Linux 网络对于初学者有两三台计算机即可,其中一台计算机最好安装 Windows 系统。自己多动手,不要非要等着别人帮你解决问题。 八、 如何得到联机帮助:和私有操作系统不同,各个 Linux 的发行版本的技术支持时间都较短,这对于 Linux 初学者是往往不够的。其实当你安装了一个完整的 Linux 系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。1. 主流 Linux 发行版都自带非常详细的文档(包括手册页和 FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后 40%问题都可在此解决。2. 查阅经典工
34、具书和 Howto,特别是 Howto 是全球数以万计的 Linux、Unix 的经验总结非常有参考价值通常 40的问题同样可以解决。 九、在 Linux 论坛获取帮助:如果上面的措施没有解决问题,此时你就需要 Linux 社区的帮助了。Linux 的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人,Linux 高手更具有鼓励新手的文化精神。如何在 Linux 社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问,否则只会得到到草率的回答或者根本得 不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。最好先搜寻一下论坛是否有您需要的
35、文章。这样可以获得事半功倍的效果。 下面笔者在论坛看到的一个好问题:“安装红旗 4.0 后,系统紫光输入法自带的双拼方案和我的习惯不一样,如何自定义双拼方案解决?谢谢?”这个问题很简练,笔者五分钟后就给出了解决方法:“首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑/usr/local/unispim/unispimsp.ini ,最后重启动计算机,生成新的 unispimsp.ksc”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案
36、,这可能对他们也很有用。 下面看看一个让人无法回答的问题:“救命各位高手,向你们请教一些问题:如何在 Linux 下配制HTTP、FTP 、Samba 、DNS 、DHCP、Sendmail 服务器,谢谢” 这样的问题我想即使 Linux 高手也很难快速准确精练的回答你。 你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。另外把这个问题放在其他 Linux 社区请求帮助也是一种选择。如果得不到答案,请不要以为我们觉得
37、无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。 另外发问的时候一定要注意到某些礼节。因为 Linux 社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。十、用 Unix 思维学习 Linux:L inux 是参照 Unix 思想设计的,理解掌握 Linux 必须按照 Unix 思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。 十一、学习专业英文:如果你想深入学习 Linux,看不懂因为文档实在是太难了。写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先
38、翻译成英语在国际学术杂志和网络上发表。安装一个新的软件时先看 README,再看 INSTALL 然后看 FAQ,最后才动手安装 ,这样遇到问题就知道为什么。如果说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。十二、最后是 Linux 学习的路线图:1 掌握至少 50 个以上的常用命令。2 熟悉 Gnome/KDE 等 X-windows 桌面环境操作 。 3 掌握.tgz、.rpm 等软件包的常用安装方法 4 学习添加外设,安装设备驱动程序(比如网卡)5 熟悉 Grub/Lilo 引导器及简单的修复操作 。 6 熟悉 Linux 文件系统和目录结构。 7 掌握 vi,gcc,gdb
39、等常用编辑器,编译器,调试器。Linux 下编程,主要是选用一个文本编辑工具(如 vi eclipse nano gedit 等)编写,再用 GCC 编译链接,最后用 gdb 调试。8 理解 shell 别名、管道、I/O 重定向、输入和输出以及 shell 脚本编程。9 学习 Linux 环境下的组网。 十三、深入学习 linux 的大致方向 1文件系统:linux 的相关的系统设定,各种 linux 环境下的软件的使用与调试。这类知识是基础,但并不简单,学好了,绝对可以当讲师的。2网络服务:linux 这种类 UNIX 的操作系统其另一个作用域是网络服务器。 linux 本身自带几乎所有网
40、络上的用得到的服务,可以充当任何网络服务器,比如 DNS、DHCP、ftp、NFS、Proxy 等等。而且其特点是,所有这些服务的配置与设定都可以通过文本形式的配置文件进行配置。所以学好 linux 下网络服务的配置与使用,完全可以当 CIO(首席信息官)了,因为已经具备 linux 网络工程师的能力了。3软件设计:linux 是开源的大环境,也是较原始的编成环境,其下的 C/C+、PHP 等都是比 windows下更纯语言。但 linux 下高级的开发环境较少,不像 VC 等工具好使,所以 linux 下的软件工程师要具备的知识更多。要是学好了 linux 下的软件设计,也算编成是高手了。l
41、inux 这三大块知识的学习不相互影响,但也有相互依赖和促进的作用,想深入某一个领域,不见得要其它领域都掌握,但建议也对其它领域也有所涉及,会有事半功倍的效果。十四、学习嵌入式 linux 的三个方向1、嵌入式 linux 应用软件开发2、linux 内核的剪裁和移植3、嵌入式 linux 底层驱动的开发无论选择哪一方向,基本的 linux 的知识是需要具备的,其他还需要掌握的知识有 ARM(最常用的一款嵌入式处理器)和 C 语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式 linux 开发的综合能力。嵌入式 Linux 学前建议(初学者必读)目前,Linux 作为嵌入式系统的主
42、力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。随着嵌入式行业的迅猛发展,嵌入式 Linux 凭借其系统发展的成熟度、市场应用的高份额也受到更多工程师朋友的青睐,越来越多的企业和研发机构都转向嵌入式 Linux 的开发和研究,这使得嵌入式 Linux 在新兴的嵌入式操作系统领域内也获得了飞速发展和广泛应用。而对于那些希望尽快进入嵌入式行业从事产品研发的朋友们,选择嵌入式 Linux 方向作为切入点无疑是最好的途径之一。近期,有许多面临毕业、找工作的大学生来到华清远见嵌入式培训中心咨询了解有关嵌入式 Linux 方向的学习安排。
43、在与他们交流沟通的过程中,被问到最多的几个问题就是“如何做好嵌入式 Linux 学习前的准备?”,“学习嵌入式 Linux 需要补习哪些基础课程?”,“嵌入式 Linux 开发跟普通软件开发在学习方法上有什么不同?”,“ 项目实战环节多吗?” ,“有专业人员带领吗?” ,相信这些也是很多准备入行的初学者都会关心的问题,为了帮助大家做好嵌入式 Linux 的学前准备,我们对这些常见的问题逐一进行解答,提供给大家参考,希望能够有所帮助。1、如何做好嵌入式 Linux 学习前的准备?要成为一名合格的嵌入式 Linux 工程师,就需要系统的学习软、硬件相关领域内的知识,需要在最开始就掌握开发的规范和原
44、则,养成良好的工作习惯。为了确保学习的效果,华清远见安排的整个课程体系是非常集中、高效的,这就要求准备参加嵌入式 Linux 就业课程学习的同学要调整好自己的时间,务必要确保在 4 个多月的学习时间内能够高度集中精力。在整个集中学习过程中,既要保证课上认真听讲、实战演练的时间,也要保证课下继续实战演练、查阅资料的时间。只有经过这种高强度的、实战为主的训练,才能够在比较短的时间内掌握规范的嵌入式开发工作流程,让自己符合嵌入式企业对应岗位的需求。除了在学习时间上要做好充分的准备之外,在学习的心态和方法的调整上也要做好准备。许多朋友只了解嵌入式 Linux 方向美好的发展前景,只关注高收入、就业机会
45、多等热点,却忽略了学习过程本身。为了能够让集中培训的效果发挥到最佳,建议大家在学习开始前更多地去了解嵌入式产品研发的特点、所需要掌握的技术规范和工作要点,关注需具备基础的补充和学习,从而为后续的强化学习过程做好心态上的准备,毕竟态度往往决定了最后做事的结果。2、学习嵌入式 Linux 需要补习哪些基础课程?嵌入式 Linux 工程师的学习需要具备一定的 C 语言基础,因此面对许多朋友只是在大一或者大二学习过 C(还不一定认真学了,呵呵!),之后基本就不再用过的情况,建议大家在来华清远见学习之前先复习一下 C 语言基础这块。要提醒大家的是,复习时不能只关注基本语法,对于常用的数据存储及处理方式,
46、例如:数组、结构体等也要关注,有条件的话一定在机器上亲自敲敲代码、分析理解一下具体案例代码编写的思路,让自己慢慢进入一名嵌入式开发人员的状态。此外,在时间允许的情况下,建议大家看一下有关计算机操作系统工作原理以及计算机组成原理等方面的专业书籍。对于进程、线程、任务调度、总线、I/O 等基本概念及工作原理有一个初步的了解和掌握,这部分知识的准备对于后续更好地学习嵌入式 Linux 系统开发将会起到很好的帮助作用。3、嵌入式 Linux 开发跟普通软件开发在学习方法上有什么不同?要成为一名成功的嵌入式软件开发人员,程序的设计能力是首要技能,这一点与普通的软件开发人员的要求是一样的。但是作为“软硬兼
47、施”的嵌入式开发,则要求大家不仅要了解较底层软件的工作过程和工作原理(例如操作系统级、驱动程序级软件),在软件开发的专业水平上也需要充分考虑软件设计的时间和空间效率,这样才能设计出高性能嵌入式程序。因此面对相对复杂的嵌入式系统的研发过程,在学习的过程中需要更多关注完整的知识体系结构的建立。特别是对于原理性知识的掌握程度则相对普通的软件开发人员提出了更高的要求。因此在学习的过程中,“要知其然,更要知其所以然”。同时由于一直以来嵌入式行业中专业人才的紧缺,许多经验性的东西都有待交流和分享,因此充分关注与每一位讲师的实际经验交流就显得至关重要。华清远见的每一位专业讲师都拥有多年的嵌入式Linux 开
48、发经验,他们在各自擅长的领域内都有很多值得分享和交流的体会,因此通过他们课堂的讲解、示范,通过充分的交流沟通,无疑可以大大缩短在行业中摸索的时间,记住不要以为原理性的东西通过看书就能解决,借助这些行业高手的透彻分析,才能让你的学习过程更有价值、更加实用。4、华清远见的课程体系中项目实战环节多吗?有专业人员带领吗?由于大多数人对嵌入式开发过程的陌生,因此实战环节的训练就显得格外重要。在嵌入式 Linux 课程学习的每个阶段,都需要在专业人员的引导下,通过全真的案例设计与实现来巩固所学的知识点。同时我们要求大家尽可能在课堂上多出问题、多暴露问题,只有这样,才能通过专业人员的及时帮助和指导,最高效地
49、掌握解决实际问题的方式和方法,积累足够的技术经验和项目经验。同时也只有通过最终综合项目实战环节的密集训练,才能够逐步建立起嵌入式产品开发的工程化概念。在这个过程中,除了可以达到所学知识综合、实际应用的目的,还可以让大家更真实地体验到如何编写工程化程序?如何在设计中与团队协作开发?如何为后续有效地升级与维护做好准备?如何编写规范的文档等?而这些体验都将为后续真正从事企业内工程化的软件设计做好充分的准备。记住贯穿始终的是:要知道为什么学?要知道学的是什么?要知道怎么学?要知道学了如何用?最后还要知道用的时候出了问题该如何解决?相信以这些问题为线索的学习过程一定可以帮助大家快速成为一名优秀的嵌入式开发工程师。