适合初学者的嵌入式课程。
嵌入式Linux学习路线图我是1999上的大学,专业是物理。大一的时候,班里普遍弥漫着对未来的焦虑,不知道学完物理出去能干什么。你现在的经历,现在的学习,一定会影响你以后的生活。毕业后也找到了自己的工作:出国深造转行做金融,留校任教做科研,设计芯片,写程序,开公司等。这些都离不开我们在学校学到的基本功(数学、IT、电子电路)和锤炼出来的自学能力。
所以,你们是迷茫的学生,是想转行的程序员。以后肯定有你的位置。是好是坏取决于你现在的努力和积累。
我无法预测几年后什么行业会流行,也不能保证你学习这篇文章就能发财。我只是一个有十几年经验的程序员,如果你对编程感兴趣,我想给你一些建议。
1.程序员的三个方向。程序员的方向一般可以分为三类:专业领域、业务领域、操作系统领域。了解他们之后,根据自己的兴趣选择。
专业领域我给不了建议。
业务(即应用程序)并不完全独立于操作系统:
(1)开发物理产品时,写好应用的人有时需要操作系统的知识,比如设置调度优先级,知道某些功能可能会让进程休眠。
(2)写应用程序的人晋升为系统工程师,需要从上到下都知道,然后需要有操作系统领域的知识。不然怎么设计整个系统?
3做应用的人需要了解行业的需求,了解业务的逻辑。所以做领导的人,多是应用型的。一旦进入一个行业,就很难再换行业了。
(4)在操作系统领域,这是在扼杀所有行业:他只负责底层系统,他在上面开发什么业务与他无关。这一行很多人都是技术专家。
⑤操作系统和业务没有边界。有操作系统的经验,然后做应用,遇到问题就会知道系统的根源,有解决方案。有了业务经验,可以重新学习操作系统,很快就可以组建团队自立门户,至少做CTO是没问题的。
1.1的专业领域可以分为以下两类。
1.1.1学术研究
比如语音,图像处理,人工智能,这类工作需要你有很强的理论知识。我倾向于认为这样的人是“科学家”。他们学习多年,经常做学术研究。
在嵌入式领域,需要用某种算法来表达他们的成果,优化某些芯片。这部分工作可能会有人来做。
1.1.2工程实现
也有人了解这些专业领域的概念,但没有深入钻研。你可以利用各种开源材料来达到某个目标,做出产品。比如图像处理,他知道如何利用opencv中上百个复杂的函数实现头像识别。有时这些功能可以根据具体的芯片进行优化。
“专业领域”不是我喜欢的。如果你想做这个,我觉得最好的入门方式就是在校学习研究生和博士课程。
1.2业务领域,换句话说就是应用,可以分为以下两类。
1.2.1界面显示
当然你需要一个好的界面来做产品,但不是说不重要,是没有发展潜力。
现在的热词是Android APP和IOS APP开发。不要被Android和IOS这两个词所迷惑。它们和之前的VC和VB一样,只是,只是一套GUI控件。
我希望我没有冒犯你。我有我的理由。
一个程序需要一个GUI界面,但程序的内部逻辑才是核心。Android和IOS的开发工具为我们简化了GUI的开发,提供了这些控件的交互机制,封装并提供了一些服务(比如网络传输)。而是程序内部的业务逻辑,视频图像和声音的处理等。,都是核心。另外,别忘了服务器端的后台程序:如何更安全的保存数据,保护客户隐私,如何处理百万级并发访问等等,这些也是核心。
但是,安卓和IOS的APP上手很快!如果你是大四学生,急于找工作,花1或者2个月学习Android或者IOS,应该很容易找到工作。毕竟APP的需求永远是最大的,现在这两个技术还是比较热的。2011和2012左右,安卓程序员的起薪还挺高的,后来开始下降。安卓APP基本入门时间只有1个月,所以知道的人越来越多。2013,2014,IOS开发的工资明显比Android高,所以各种IOS培训也暴露出来了。国内一直不缺快节奏的人才,估计过段时间IOS工程师也是白菜价。
了解Android和IOS只是基本要求。不信的话,去51job搜索安卓或者IOS,其他要求会在职位需求中得到肯定。
1.2.2业务逻辑
举个简单的例子,要制作一个穿孔卡软件,你需要考虑这些事情:
(1)正常流程是上班打卡。
②有人忘记了怎么办?记录为异常,并将其推送给管理员。
(3)请假怎么处理?
4加班怎么处理?
再举一个比较复杂的例子,在视频会议系统中,各种模块如何连接,如何兼容各种协议,不深入行业你根本想不通。
应用开发岗位永远是最多的,入门门槛低。基本上只要你会说C语言,在面试中表现得体,一般公司都会给你机会。因为:
进入公司后,你需要接受再培训:熟悉他们的业务逻辑。
2你要做的基本上就是一个模块,框架已经给你定好了。你可以只填写代码。
说一件让你开心的事:在软件公司,领导基本都在写应用(当然还有营销)。写应用的人可以对外研究市场,接待客户,对内可以管理程序员完成开发。不让他当领导谁能做?
如果你的志向是写一个应用,那么我建议你先练好基本功:数据结构和算法是必须的,然后根据自己的兴趣选择数据库、网络编程等进行深入学习。
最后,选择自己感兴趣的行业,深耕10年。做应用开发的人选择了某个行业,以后很难换行业。选线很重要!
UCOS在1.3操作系统领域太简单,VxWorks太贵太专业,Windows不玩嵌入式系统,IOS不开源,只能在操作系统领域玩Linux。
嵌入式领域Linux一家独大!
安卓呢?和QT一样,Android也是一个GUI系统。只是谷歌的实力太强了,现在安卓无处不在,所以很多时候Linux+安卓成了标配。注意,这里我们关心的是Android的整个系统和机制,而不是学习几个API和开发接口程序。操作系统领域所包含的内容,简单来说就是做一台有好系统的专用“电脑”,可以分为:
①为产品规划硬件:
根据需求、性能、成本选择主芯片,并与外围设备匹配,由硬件开发商设计。
(2)制作并安装操作系统,编写单板驱动程序。
③定制维护、升级等系统方案。
④也可以配置安装Android等GUI系统:
⑤为应用开发者配置开发环境。
⑥从系统角度解决难题。
这个领域通常被称为“底层系统”或“驱动开发”。
先解决两个常见的误区:
这个工作是写驱动吗?
看上面列举的六点,应该说包含了驱动开发,但远远不止驱动开发。
②我们还需要写驱动吗?没有原厂吗?还是只需要改?
经常有人说原厂芯片开的好,拿过来换就行了。如果你的硬件和原板一模一样,原始源代码无BUG,你不想优化性能,削减成本,做一些有特色的产品,那么这个说法是对的。
但是在这个创新或者死亡的时代,可能吗?!有两个原因:
(1)即使只修改代码,可修改的前提是理解;最好的理解方式就是从头开始写几个驱动。
②很多时候需要对系统进行深度定制。
以前联发科手机只要换接口就能出货,现在山寨厂一批批倒了。当大家都不加修改的使用原方案,最后只能拼成本。
比如深圳有两家生产交通摄像头和监控摄像头的厂家,他们让我做了四个项目:
①提高厂商提供的SD卡的驱动性能,使用DMA。
②换了Flash型号后,系统经常出现问题,需要修改驱动BUG。
③触摸屏点击不正确,找到原因了。后来发现是旁路电容造成的。
(4)削减成本,4块DDR换成2块DDR,需要bootloader改变DDR的初始化。
这些项目非常紧急,如果我们不能处理它们,我们就不能发货。这个时候为什么不找原厂呢?除非你是中兴华为这样的大客户,不然谁管你?
我在中兴工作的时候,写驱动的时间其实很少,大部分时间都在调试:系统调优,帮APP工程师和硬件工程师找问题。我们从厂商和网上得到的很多源代码都是标准的,当然也可以直接使用。但是优化你的产品可能会更好。比如我们可以把摄像头驱动和DMA驱动结合起来,通过DMA把摄像头的数据直接发给DSP。我们可以充当软件和硬件之间的桥梁。对于实体产品来说,可能是软件或者硬件有问题,一般底层系统工程师更容易发现问题。
当软硬件应用出现他们解决不了的问题时,从底层软件的角度给他们建议,给他们提供工具。再比如方案选择:芯片性能能否达标,可用的BSP是否完善等。,这只能由整个方案的负责人来考虑,他必须了解底层。
在操作系统领域,对知识有很多要求:
(1)了解硬件知识了解电路图。
(2)英语好能看懂芯片说明书。
③编写和移植驱动程序的能力。
④对操作系统本身有一定的了解,可以解决各种疑难问题。
⑤了解Android的内部机制。
⑥懂汇编、C语言、C++和JAVA。
绝对是个大坑,没有兴趣和毅力的人要慎重选择。
干这行要半年以上才能入门,就算整天学习。
2它的地位肯定比不上APP。
而且你没有1或者2年的经验。你被公司录用后,就开始做APP。
优点是:
1学好了,行业必杀,想包就包;想做自己的产品,就做自己的产品。
②和做申请的人相比,不会被不断变化的需求逼得天天加班。
门槛高,当然工资也比较高。
在操作系统领域,我认为适合这些人:
(1)硬件工程师想转行做软件工程师,从底层软件入手会更好。
(2)单片机工程师,想升级。了解Linux底层的人一定会了解单片机,但是了解单片机的人不一定了解Linux。
③时间充裕的同学:如果你是大二或大三的学生,花上半年时间学习底层嵌入式Linux是有好处的。
4想掌握整个系统的人,比如你在公司写一个APP,但是想晋升为系统工程师,那么底层就得学。
⑤想自己创业做实体产品的工程师,如果你有钱,不需要学什么技术,但是如果你没钱,想做产品,那么Linux的底层就得学。
6做Linux APP的人,对,也要学。
这部分人不用深究,大概了解一下就行了:bootloader是用来启动内核的,Linux的文件系统(第1个程序是什么,目录是用来做什么的),APP和驱动的调用关系,工具链,这些概念都够了。
本文默认操作系统为Linux,讨论如何学习嵌入式Linux+Android系统。
1.4嵌入式Linux+Android系统包含什么?别急,举个例子就好。
谁在电脑开机时显示了那些界面?
是BIOS。它是做什么的?有的自检,然后从硬盘读取windows并启动。
同样,这个BIOS对应于嵌入式Linux中的引导装载程序。这个bootloader将刷新以读取Linux内核并启动它。
②启动windows的目的是什么?
当然是运行应用上网聊天了。
这些在线程序和聊天程序在哪里?
在c盘和d盘上。
因此,windows必须首先识别驱动器C和驱动器D..我们称之为Linux下的根文件系统。
(3) ③windows可以识别驱动器C和驱动器D,所以必须具备读写硬盘的能力。
这种能力叫做驱动力。当然不仅仅是硬盘,还有网卡,USB等硬件。嵌入式Linux可以从Flash中读取和执行应用,必须有Flash的驱动,当然不仅仅是Flash。
简单来说,嵌入式LINUX系统包含五大块:bootloader、内核、驱动、根文件系统和应用程序。而应用,我们可以分为:C/C++,Android。
因此,嵌入式Linux+Android系统包括以下六个部分:
①引导加载程序
②Linux内核
③驱动程序
④用C/C++编写的应用程序
⑤安卓系统本身
6.⑥安卓应用
Android和Linux的联系如此之大,其应用如此广泛,没有理由在学习完Linux之后就停止学习Android。在大多数智能设备中,运行的是Linux操作系统;它要么安装了Android,要么可以与Android手机互联。现在,Linux+Android已经成为标配。
2.如何学习嵌入式Linux操作系统本文假设你是零基础,以实用为主,让你在最快的时间内入门;我也会附上一些想深入学习时可以参考的资料。
在实际工作中,我们是围绕“操作系统”进行开发的,不会对操作系统本身进行太深入的研究和修改。
①操作系统具有进程管理、存储管理、文件管理、设备管理等功能,这些核心功能非常稳定可靠,基本上我们不需要修改代码。我们只需要为我们自己的硬件完善驱动程序。
②学习驱动肯定会涉及到其他知识,比如仓储管理、流程调度等。当你深刻理解了驱动,你也会加深对操作系统其他部分的理解。
③Linux内核中的代码大部分是设备驱动,可以认为Linux内核是由各种驱动组成的。
但是,要成为这方面的高手,就必须深入了解Linux操作系统本身,研究其源代码。
在繁忙的工作和闲暇之后,你可以看看这些书:
①赵炯的linux内核全笔记,比较薄,推荐。后来又出了《Linux内核全解析》,太厚了。不喜欢就忘了前面。
(2)毛和胡的《LINUX核心源代码的场景分析》,分上下两卷,极其厚。就当字典看:如果你想深入理解某件事,看一章就行了。
还有很多其他的好书,但是我没怎么看过,也没有更多的建议。
出于快速入门和入门的目的,不需要先看上面的书,先按照这篇文章学习。
2.1入门路线图假设你是零基础,我们规划了以下入门路线图。前面的知识是后面知识的基础,建议按顺序学习。每个部分不一定需要彻底研究,这将在下面的章节中描述。
2.2学习驱动前的基础知识2.2.1 C语言
只要是理工科的,好像都会教C语言。我见过很多C语言考了90,100的人,一上电脑就傻了。我怀疑他们曾经在计算机上写过程序。
理论再好,如果不实践就不能工作,那公司为什么还要聘用你呢?
另一方面,从实践中学习C语言,一定要练,写,写!
当你掌握了基本的语法,你就可以在电脑上练习一些C语言的练习了。
当你写了几个C程序,就可以进入下一阶段的裸机开发了。
(1)不需要太深。
作为一个快速的开始,只要你能写“你好,世界!”,会写冒泡排序,会做一些基本的语法操作,暂时够用了。
指针操作是重点,多练习;
不需要学习太多的数据结构知识,只需要掌握链表操作就可以了,其他的都不需要学,比如队列,二叉树。不需要学习任何函数用法,比如文件操作、多线程编程、网络编程等。这些知识在写Linux应用的时候会用到,但是在操作系统驱动学习的时候就不需要了!
永远往前走,遇到不懂的C语言问题我们再回来学习。
在后续的“裸机开发”中,你会继续练习C语言,这样会更实用。
c语言是在编写代码中提炼出来的。
②可以在Visual Studio或者Linux下学习。后者需要掌握一些编译命令。我们暂时不提供C语言教程。找一本C语言的书,在网上找免费的C语言视频(主要看如何搭建环境),就可以自学了。
2 . 2 . 2 PC Linux的基本操作:
对于PC Linux,我们推荐Ubuntu,它非常容易在上面安装软件。
我们的工作模式通常是这样的:在Windows下读写代码,然后将代码上传到PC Linux上进行编译。其实Ubuntu的桌面系统已经很好用了,各种智能手机我们都能很快上手。相信Ubuntu的桌面系统也能让你快速上手。为了提高工作效率,我们通常使用命令行来操作Ubuntu。
不用担心,你只需要在前期掌握这些命令就可以了。它们非常简单,我简单地列出来:
①cd:更改目录(更改目录)
Cd目录名?//输入目录cd..// cd“两点”:返回上一个目录cd-// cd“短横”:返回上一个目录。
②pwd:打印工作目录(打印当前目录,显示当前工作目录的绝对路径)。
③mkdir:制作目录(创建目录)
Mkdir abc //创建文件夹abcmkdir -p a/b/c //创建文件夹A,然后在A下创建文件夹B,再在B下创建文件夹C。
④rm: Remove(删除目录或文件)
rm?文件//删除文件rm -rf dir命名文件?//删除名为dir的目录。
⑤ls: List(列出目录的内容)
⑥安装:安装
mount -t nfs -o nolock,vers = 2 192.168.1.123:/work/NFS _ root/mnt mount-t yaffs/dev/MTD block 3/mnt
⑦chown:更改所有者(更改文件的所有者,即所有者)
chown book:book /work -R?//对于/work目录及其所有内容,所有者更改为book user,组更改为book。
⑧chmod:改变模式,下面这个例子很简单粗暴。
chmod 777 /work -R?//对于/work目录及其所有内容,权限改为可读、可写、可执行。
Linux下最常用的编辑命令,使用起来略复杂。请自行搜索用法。
要练习这些命令,可以进入Ubuntu桌面系统,打开终端,输入那些命令;或者用SecureCRT、putty等工具远程登录Ubuntu后练习。
硬件知识
学习硬件知识的目的是理解原理图、通信协议和芯片手册。我不想设计原理图,更不想设计电路板。
对于正统的方法,您应该像这样学习:
(1)学习微机原理,了解一台计算机的组成和各部件的相互作用原理。
②学习数字电路,了解各种门电路的原理和用途,掌握一些逻辑运算(与、或等。).
(3)模拟电路?我不需要学这个。至少我工作上不需要。现在我全忘了。
以我个人的经验,这些课程是有用的,但是:
原理有用,但实战性不强。
比如微机原理是基于x86系统的,和ARM板有很大区别,当然原理也是一样的。
直到接触嵌入式编程,我才明白这些课程。
(2)每本书都那么厚,有很多内容,学习时间太长,自学困难。
针对这些校园教材的不足,结合实际开发过程中要用到的知识点,我们推出了“学前_如何看示意图”系列视频:
学前班1第1段_ _你怎么看GPIO和原理图的门电路。野型腮腺炎病毒
学前班1 Section 2.1 _原理图协议接口UART.wmv怎么看
学前班1第2.2节_原理图协议接口I2C.wmv怎么看
学前班1第2.3节_原理图协议接口SPI.wmv怎么看
学前班1第2.4节_如何看待原理图协议接口NAND Flash.wmv?
学前班1第2.5节_原理图协议接口LCD.wmv怎么看
学前班1第三节_ _示意图等记忆界面怎么看。野型腮腺炎病毒
学前班1第4.1节_怎么看待原理图分析S3C2410开发板。野型腮腺炎病毒
学前班1第4.2节_如何看原理图分析S3C2440开发板?野型腮腺炎病毒
学前班1第4.3节_如何看原理图分析S3C6410开发板?野型腮腺炎病毒
即使你只有初中物理课的电路知识,也希望你能通过这些视频了解原理图和一些常用的通信协议。如果你想掌握更多的硬件知识,这些视频也可以作为一个索引,让你知道自己缺什么知识。
这些视频中提到的硬件知识,会用到“裸板开发”系列视频中,然后大家可以互相看看,加深了解。
2.2.4想学习Windows下的单片机开发吗?
很多学校都开设了单片机课程。很多人是从51单片机和AVR单片机开始的。现在比较新的STM32单片机已经开始接触嵌入式领域,使用Windows下的开发软件,比如keil,MDK。
问题来了,要不要学习Windows下的单片机开发?
如果这是你专业的必修课,那就去学吧。
②如果你的专业和单片机密切相关,比如机械控制,那就去学吧。
(3)如果你只是想入门单片机,然后学习更广泛的嵌入式Linux,那就放弃学习Windows下的单片机吧!
原因如下:
①Windows下的单片机学习不够深入。
Windows下有非常好的图形界面单片机开发软件,比如keil和MDK。
它们封装了许多技术细节,例如:
你只会写主函数的代码,却不知道1代码在通电后是如何执行的;
你可以写一个中断处理程序,但是你不知道它是如何被调用的。
你不知道程序是怎么从Flash读入内存的;
不知道内存是怎么划分和使用的。不知道栈在哪里,堆在哪里。
当你想截程序减少Flash和内存的使用时,你无从下手;
当您创建一个新文件时,它会自动添加到项目中,但是您完全不知道其中的机制。
等等,等等,等等
②基于ARM+Linux的裸机学习可以让你学习的更深入,更适合后续的Linux学习。其实就是Linux下的单片机学习,只是一切都比较原始:所有的代码都需要自己写;哪些文档添加到项目中,需要自己管理。
在工作中,我们当然倾向于使用Windows下更方便的工具,但是在学习阶段,我们要学习程序的精髓。
一切从头开始写代码,管理代码,我们可以学到更多的知识:
你需要知道芯片的上电和启动过程,知道1代码是如何工作的;
你需要知道如何将程序从闪存读入内存;
需要了解内存是如何规划和使用的,比如栈在哪里,堆在哪里;
需要了解代码重定位;
需要知道如何保护场景,跳转到中断入口,调用中断程序,在中断发生后还原场景;
你就知道主函数不是我们写的第1个函数;
你会知道从芯片通电开始程序是如何执行的。
你会知道函数调用过程中参数是如何传递的;
你会知道当一个中断发生时,每个寄存器的值都要小心对待;
等等,等等,等等
你掌握了ARM+Linux的裸机开发,再回到Windows下的单片机开发,你会惊呼:多么简单!而且你会完全理解这些工具没有向你展示的技术细节。
驱动=Linux驱动软件框架+ARM开发板硬件操作,我们可以从简单的裸机开发开始,先掌握硬件操作,也可以:
①掌握如何在PC Linux下编译程序,将程序烧到板上运行。
②奠定学习bootloader的基础:在掌握了各种硬件操作之后,后面的组合就是bootloader了。
2.2.5为什么选择ARM9 S3C2440开发板而不是其他性能更好的开发板?
有一个错误的概念:S3C2440过时了,ARM9过时了。
这是不对的。如果你是软件工程师,那么对于我们来说是ARM9、ARM11、A8还是A9都没有区别。
一个上面有CPU的芯片,片上有很多器件(比如UART,USB,LCD控制器)。我们写程序的时候,不涉及CPU,只是操作那些片上设备。
所以:区别在于片上器件,而不在于CPU内核;区别在于寄存器操作不同。
因为我们的写驱动不涉及CPU的核心,只操作CPU以外的设备,只读写这些设备的寄存器。
推荐S3C2440,因为它有Linux上最丰富的学习资料,有1号和2号的配套视频..
2.2.6如何学习ARM+Linux的裸机开发?
学习裸机开发有两个目的:
①掌握裸机程序结构,为后续u-boot做准备。
②练习硬件知识,即如何阅读原理图和芯片说明书,如何编写代码操作硬件。
后面的u-boot可以看作是裸机程序的集合。我们可以在裸机开发中一个一个的掌握所有的组件,然后组装起来,就可以得到一个u-boot。
后续的驱动开发也涉及到硬件操作。裸机开发可以学习硬件知识。
注:如果不关心裸机的程序结构和bootloader的实现,可以先跳过这部分。在下面的驱动视频中,我们也会对涉及到的硬件知识进行重新讲解。
推荐两本书:杜春蕾的《ARM架构与编程》,韦东山的《嵌入式Linux应用开发完全手册》。后者可能是国内PC Linux环境下开发的关于ARM裸机程序的1书。如果我错了,请原谅我读书少。
对于裸机开发,我们提供两个视频:
①环境建设
第0课第1节_接口布线刚好碰到开发板。野型腮腺炎病毒
第0课,第2节_为新开发板编写裸板程序。野型腮腺炎病毒
第0课第3节_接触开发板后立即重新燃烧整个系统。野型腮腺炎病毒
第0课,第4节_使用开发板新增的vmwae和ubuntu.wmv。
第0课,第5节_打补丁,编译使用刚接触开发板的u-boot,构建sourceinsight项目。野型腮腺炎病毒
第0课第6节_打补丁,编译使用u-boot,刚接触开发板的内核,构建sourceinsight项目。野型腮腺炎病毒
第0课,第7节_制作开发板的根文件系统和引导驱动程序。野型腮腺炎病毒
第0课第8节_在TQ2440和MINI 2440上构建视频系统。野型腮腺炎病毒
第0课第9节_win7不能用dnw烧录的替代方法。野型腮腺炎病毒
.................
原始链接:网页链接