作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来答复一下。
在学习嵌入式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。这个bootloader要去Flash上读入Linux内核,并发动它。发动windows的意图是什么?当然是上网谈天什么的了。这些上网、谈天东西在哪?在C盘、D盘上。所以,windows要先识别出C盘、D盘。在Linux下我们称为根文件系统。windows能识别出C盘、D盘,那么必定能读写硬盘才行。这触及的东西称为驱动程序。当然不仅仅是硬盘,还有网卡、USB等等。嵌入式Linux能从Flash上读出并履行使用程序,必定也得有Flash的驱动程序啊,当然也不仅仅是Flash。
先提到这儿吧,嵌入式LINUX里含有bootloader,内核,驱动程序、根文件系统这4大块。
一、bootloader:
它便是一个略微杂乱的裸板程序。可是要把这裸板程序看懂写好一点都不简单。Windows下好用的东西弱化了我们的编程才能。
很多人一玩嵌入式就用ADS、KEIL。你能答复这几个问题吗?
一上电,CPU从哪里取指令履行?答:一般从Flash上指令。可是Flash一般是只能读不能直接写的,假如我用到全局变量,这些全局变量在哪里?答:全局变量应该在内存里。那么谁把全局变量放到内存里去?答:长期用ADS、KEIL的朋友,你能答复吗?这需求”重定位”。在ADS或KEIL里,重定位的代码是制作这些东西的公司帮你写好了。你可曾去阅读过?内存那么大,我怎样知道把”原来存在Flash上的内容”读到内存的”哪个地址去”?答:这个地址用”链接脚本”决定,在ADS里有scatter文件,KEIL里也有类似的文件。可是,你去研究过吗?你说重定位是把程序从Flash复制到内存,那么这个程序能够读Flash啊?答:是的,要能操作Flash。当然不仅仅是这些,还有设置时钟让系统运行得更快等等。先自问自答到这儿吧。bootloader这一个裸板程序,其实有3部分要点:
对硬件的操作对ARM系统处理器的了解程序的基本概念:重定位、栈、代码段数据段BSS段什么的。对硬件的操作,需求看原理图、芯片手册。这需求必定的硬件常识,不求你能规划硬件,可是至少能看懂;不求能看懂模仿电路,可是要能看懂数字电路。这方面的才能我是在校园里学到的,微机原理、数字电路这2本书(书名忘了)就足够了。可是我置疑你有无耐性把这2本书看完。
我不知道现在有没有更方便的书。想速成的话,就先放掉这块吧,不明白就问GOOGLE、发贴。别的,芯片手册是必定要读的,别去找中文的,就看英文的。开始是十分苦楚,今后就会发现那些语法、词汇一旦了解后,读任何芯片手册都很简单。对ARM系统处理器的了解,看杜春蕾的吧,里面讲有汇编指令,有反常模式、MMU等。也就这3块内容需求你了解。
程序的基本概念:重定位、栈、代码段数据段BSS段什么的。对硬件的操作,需求看原理图、芯片手册。这需求必定的硬件常识,不求你能规划硬件,可是至少能看懂;不求能看懂模仿电路,可是要能看懂数字电路。这方面的才能我是在校园里学到的,微机原理、数字电路这2本书(书名忘了)就足够了。
可是我置疑你有无耐性把这2本书看完。我不知道现在有没有更方便的书。想速成的话,就先放掉这块吧,不明白就问GOOGLE、发贴。别的,芯片手册是必定要读的,别去找中文的,就看英文的。开始是十分苦楚,今后就会发现那些语法、词汇一旦了解后,读任何芯片手册都很简单。对ARM系统处理器的了解,看杜春蕾的吧,里面讲有汇编指令,有反常模式、MMU等。也就这3块内容需求你了解。
程序的基本概念,王道当然是去看编译原理了。可惜,这类书绝对是天书级别的。劝你若非超级天才仍是别去看了。就看我写的<嵌入式Linux使用开发彻底手册>和第1期视频吧,别忧虑,不用花钱。照着视频把硬件相关的实验做了,这些概念就清楚了。
我还没有发现第2套讲这些概念的书或视频,答应我盲目揄扬一回。关于bootloader,我学习时是先看了,然后自己写程序把各个硬件的实验都做了一遍,比方GPIO、时钟、SDRAM、UART、NAND。把它们都弄清楚了,组台在一起就很简单看懂u-boot了
总结一下:
看懂硬件原理图、看芯片手册,这需求你自己去找资料。剩余的,就按《嵌入式Linux使用开发彻底手册》和第1期视频的章节目录去学习吧。
,嵌入式linux介绍下怎么自学,告知你一个残酷的实践,即便告知你学习方法和途径,能坚持下来的也寥寥无几。
除此以外,还有学习进程中的突发状况,比如走弯路不知道,碰到问题没人辅导。
我觉得自学技能就是和人道缺点的博弈,单调、焦虑、苍茫、无助都是自学必经的妖魔乖僻。
能否取得西经,更多是对你气魄和毅力的检测,哪怕你走过的弯路能绕地球一圈,终究仍是能到达结尾。
假设你理解这些,还想检验,请持续往下看,否则不要简略检验,功败垂成还不如不要初步。
以上,是我10年前自学转行的感悟。
其时,从电气专业转行到嵌入式单片机软件开发,终究找到作业花了4个多月。
虽然现在门槛不一样,但是方法可以通用。
提到嵌入式开发,大多数人想到的是ARM、Linux、STM32。
这都太广泛,嵌入式开发包括的常识体系太庞大了,做了10年,我依然觉得我只是嵌入式开发这个常识海洋里的一根针罢了。
但这不代表你需求花费1年,乃至几年的时间才华学会。
只需定位清晰,学习途径正确,再加点点坚持,3-5个月完全能从零基础到达作业的程度。
先以找作业成功入行为首要目的,是一个成年人该有的醒悟,入行后有薪酬支撑了,一起也能在作业中进修,才华形成良性循环。
千万不要一上来就想学成专家,简略饿死。
一、定位
嵌入式开发分为许多方向,从大方向来看分为嵌入式硬件开发和嵌入式软件开发。
1.嵌入式硬件开发
首要担任规划产品电路、PCBlayout、样品焊接和调试、后期出产跟进。
学习硬件,我个人感觉性价比是比较低的,首要有几点原因。
①.硬件首要仍是要通过实物不断实践学习,不同的电路你要建立不同的配套硬件检验你的理论是否正确。
这就导致需求付出的本钱比较大,比如说要买示波器、万用表、电烙铁、焊锡、面包板、元器件等等。
还有就是不必定每个人都有这种学习环境,在自己睡觉的小房间焊接可不是一件积德行善。
②.现在具有实践产品参阅意义的硬件教程很少,大多都是几年乃至十几年前的老教材,早都用不上了。
③.大多数普通硬件工程师岗位的薪酬都低于嵌入式软件工程师。
④.现在电路集成度很高,动不动就是芯片计划解决,一般公司很难接触到核心技能,都是拿他人现成的电路用。
这种一般软件开发个几年都能自己规划电路了。
⑤.硬件抄板价值小,几千块能完完整整把你的硬件电路抄出来,软件抄袭比较难,需求的本钱高。
所以,我一向着重先把软件学好,假设想走全栈再针对性去学硬件。
2.嵌入式软件开发
嵌入式软件开发又分为许多方向,比如说干流的有单片机开发、Linux驱动开发、Linux运用开发、安卓运用开发、FPGA/DSP开发等等。
两大方向,还细分许多小方向,每个方向都是一个职位,每个方向所需求的学习的内容体系都不同。
假设这个定位你不搞清楚,你就会觉得嵌入式开发很难,又要学硬件、又要学STM32、又要学ARM、又要学Linux,猴年马月才华学完。
二、根据定位规划学习途径
开始我处于对文凭、非本专业的自卑感,让我选择了比较好入门的单片机开发方向。
做的越久,我越发现,单片机开发并不是和我们梦想那样比Linux方向简略。
相反,Linux方向的开发许多都有现成的库可以调用,而单片机开发大多数要从控制芯片引脚初步。
还有就是一些协议栈,比如说蓝牙协议栈、Zigbee协议栈等等,也是非常检测你的编程功底的。
这些协议栈有非常多值得学习学习的当地,你完全可以取舍、移植、改编、优化成自己的程序架构为自己产品所用。
现成的体系,不管是实时操作体系,仍是Linux,既要做到通用性、又要做到移植性等苛刻条件,所以普遍比较占用微控制器和处理器资源。
而自己写架构就不同,你完全可以根据自己的产品定制,这样既保证体系的优点,又能最大程度减少芯片资源浪费。
这比你直接用所谓的RTOS和操作体系水平高多了。
下面,针对我最了解的单片机开发方向,根据当下商场对这个职位的需求,体系解说下这个方向的学习途径。
1.C言语基础
单片机支持c言语和汇编言语来编写程序,现在干流都用c言语,汇编首要做小家电消费类产品,或许你10年都用不上,所以以学c言语为主。
这块的教程也众多了,但是针对单片机的c言语不多,大多数以做纯软件为基础解说的。
虽然都是c言语,实践仍是有差别的,比如说寄存器装备这些。
无边单片机编程有一套针对单片机c言语编程的教程,结合了作业傍边最常用到的语法,节约我们学习时间。
教程也是完全开源的,可以到小坡站找无边单片机编程直接看。
2.电路基础
这个环节进坑最多的就是死磕模电,我也走过这种坑,学到三极管扩展就初步各种数学公式,学不动了。
为此也差点扔掉,作业久了才发现,书本教程数学公式都用不上,三极管实践运用最多的就是开关作用。
假设是NPN型的三极管,你只需记住B极电压大于E极电压0.7V以上,三极管就能导通就行了。
不同类型的三极管或许不必定是0.7V导通,也有更小的,但实践电路规划要让三极管导通时,E极一般接地,B极由单片机引脚控制,电压都会远远大于0.7V。
就是这种细节的差异,假设你去死磕三极管截止、扩展、丰满,学习功率会慢几倍。
3.51单片机
许多人说51单片机筛选了,没必要学,纯属外行瞎扯。
越原始的单片机,你越能接触到底层开发,51单片机能让你了解单片机的底层原理,怎样装备运用芯片资源。
STM32单片机虽然火,但是都是封装好的库,做运用多一点,一般不需求装备寄存器。
这样,你永久无法知道单片机的原理。
这个阶段必需求配备一个开发板或者通过项目去学习。
单片机是一门倾向硬件控制的技能,不像纯软件一台电脑就行。
建议新手从STC89C52RC单片机下手,现在市面上开发板许多也是用这个芯片做的,烧录东西廉价、材料教程丰厚。
4.51单片机项目
这一个阶段最重要,可以说比你后边学STM32还重要。
你熟练运用STM32,不必定有用51单片机做过2-3个项目的人牛逼。
单片机只是一个东西,怎样把这个东西通过自己天马行空的梦想做成落地产品才是我们终究目标。
这个阶段就是查验你前面学习效果最好的时分,开头会比较摧残,由于脑子里没有思路,有思路有不知道怎样用代码去完结。
最好的方法就是先学习他人做的项目,看下他人功用完结思路是什么,代码是怎样写的。
终究自己再根据自己主意写一遍,写完剖析一下自己的代码和他人的代码各有什么优缺点。
就是这摧残的进程,别去想捷径了。
5.C言语进阶
大多数51单片机程序仍是比较简略的,不用c言语的高级语法指针、结构体也照样能完结功用。
但是后边这些c言语高级语法的用法就显得尤为重要了,可以说不理解指针、结构体这些基础常识,你永久只能停留在初级水平。
STM32单片机的固件库也许多运用了指针、结构体。
这块我们无边单片机编程也有配套比较完善的体系教程,其中包括枚举、指针、结构体、回调函数、行列算法、使命处理等非常有用的常识。
为你后续学习STM32,RTOS打下扎实基础,教程也是完全开源的,在小破站直接找到。
当然假设只是单纯学习STM32,只需求学指针、结构体就足够了,假设你没必定的项目阅历,里面许多常识点或许听不理解。
6.STM32单片机
我学STM32单片机是通过项目学会的,其时公司有新产品,要把本来NXP的替换掉,价格太贵了。
有实践项目驱动,你学习会更有针对性一点,功率也更高。
当然通过开发板学习也是可以的,不用把一切外设资源学完,只需求学习最常用的就可以了,后续作业需求了再针对性学习也很简略。
具体要学哪些外设,可以参阅我上面那个思想导图。
7.STM32项目
到这儿,现已是入门了,剩余的要点就是进步你的编程思想和水平。
虽然我们最理想的自学,省钱嘛..
但我建议最快的方法就是找一个大神带项目,一个项目顶你自学几年。
我并没夸大的意思,由于自己做了10年,其实真正前进最大的也就那2,3年接触到大神代码的时分。
不过其时他现已离职了,完全靠自己死磕,磕了几年才完全吃透。
假设真实不舍得花大钱,可以到某宝买一些项目套件自己DIY,比如说无人机、寻迹小车之类的项目。
不过这种项目只能让你熟练编程,不能进步你的认知水平,大多数都是以完结功用为主。
实践产品开发的时分需求考虑到程序可扩展性、可移植性、执行功率这些东西。
Tips:本站所有资源均收集自互联网,分享目的仅供学习参考,资源版权归该资源的合法拥有者所有。
Tips:若本站所发布的资源侵犯到您的合法权益,请及时联系 hqteam@qq.com 删除!
暂无评论内容