适合初学者的嵌入式课程。

原始链接:网页链接

嵌入式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烧录的替代方法。野型腮腺炎病毒

.................

原始链接:网页链接

/div>