操作系统领域所包含的内容,简单地说,就是制作出一台装好系统的专用“电脑”,可以分为:

① 为产品规划硬件:

按需求、性能、成本选择主芯片,搭配周边外设,交由硬件开发人员设计。

② 给单板制作、安装操作系统、编写驱动

③ 定制维护、升级等系统方案

④ 还可能要配置、安装Android等GUI系统:

⑤ 为应用开发人员配置开发环境

⑥ 从系统角度解决疑难问题

这个领域,通常被称为“底层系统”或是“驱动开发”。

先解决2个常见误区:

① 这份工作是写驱动程序吗?

看看上面罗列的6点,应该说,它包含驱动开发,但远远不只有驱动开发。

② 我们还需要写驱动吗?不是有原厂吗?或者只需要改改就可以?

经常有人说,芯片原厂都做好驱动了,拿过来改改就可以了。如果,你的硬件跟原厂的公板完全一样,原厂源码毫无BUG,不想优化性能、削减成本,不想做一些有特色的产品,那这话是正确的。

但是在这个不创新就是找死的年代,可能吗?!原因有二:

① 即使只是修改代码,能修改的前提是能理解;能理解的最好煅炼方法是从零写出若干

驱动程序

② 很多时候,需要你深度定制系统。

以前做联发科手机只需要改改界面就可以出货了,现在山寨厂一批批倒下。大家都使用原厂的方案而不加修改时,最后只能拼成本。举个例子,深圳有2家做交通摄像头、监控摄像头的厂家,他们曾经找我做过4个项目:

① 改进厂家给的SD卡驱动性能,使用DMA。

② 换了Flash型号后,系统经常出问题,需要修改驱动BUG。

③ 触摸屏点击不准,找原因,后来发现是旁路电容导致的。

④ 裁减成本,把4片DDR换为2片DDR,需要改bootloader对DDR的初始化。

这些项目都很急,搞不定就无法出货,这时候找原厂?除非你是中兴华为等大客户,否则谁理你?

我在中兴公司上班时,写驱动的时间其实是很少的,大部分时间是调试:系统调优,上帮APP工程师、下帮硬件工程师查找问题。我们从厂家、网上得到的源码,很多都是标准的,当然可以直接用。但是在你的产品上也许优化一下更好。比如我们可以把摄像头驱动和DMA驱动揉合起来,让摄像头的数据直接通过DMA发到DSP去。

我们可以在软件和硬件之间起桥梁作用,对于实体产品,有可能是软件出问题也可能是硬件出问题,一般是底层系统工程师比较容易找出问题。当硬件、软件应用出现问题,他们解决不了时,从底层软件角度给他们出主意,给他们提供工具。再比如方案选择:芯片性能能否达标、可用的BSP是否完善等等,这只能由负责整个方案的人来考虑,他必须懂底层。

在操作系统领域,对知识的要求很多:

① 懂硬件知识才能看懂电路图

② 英文好会看芯片手册

③ 有编写、移植驱动程序的能力

④ 对操作系统本身有一定的理解,才能解决各类疑难问题

⑤ 理解Android内部机制

⑥ 懂汇编、C语言、C++、JAVA

它绝对是一个大坑,没有兴趣、没有毅力的人慎选。

① 这行的入门,绝对需要半年以上,即使全天学习也要半年。

② 它的职位,绝对比APP的职位少

③ 并且你没有1、2年经验,招你到公司后一开始你做的还是APP。

优点就是

① 学好后,行业通杀,想换行就换行;想自己做产品就自己做产品。

② 相比做应用程序的人,不会被经常变动的需求搞得天天加班。

③ 门槛高,当然薪水相对就高。

操作系统领域,我认为适合于这些人:

① 硬件工程师想转软件工程师,从底层软件入门会比较好

② 单片机工程师,想升级一下。会Linux底层的人肯定会单片机,会单片机的人不一定

会Linux。

③ 时间充足的学生:如果你正读大二大三,那么花上半年学习嵌入式Linux底层多有益处。

④ 想掌握整个系统的人,比如你正在公司里写APP,但是想升为系统工程师,那么底层

不得不学。

⑤ 想自己创业做实体产品的工程师,你有钱的话什么技术都不用学,但是如果没钱又想

做产品,那么Linux底层不得不学。

⑥ 做Linux APP的人,没错,他们也要学习。

这部分人不需要深入,了解个大概就可以:bootloader是用来启动内核,Linux的文件系统(第1个程序是什么、做什么、各目录干嘛用)、APP跟驱动程序的调用关系、工具链,有这些概念就可以了

本文中,就把操作系统默认为Linux,讲讲怎么学习嵌入式Linux+Android系统。

嵌入式Linux+Android系统包含哪些内容

嵌入式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、内核、驱动程序、根文件系统、应用程序这5大块。而应用程序,我们又可以分为:C/C++、Android。

所以,嵌入式Linux+Android系统包含以下6部分内容:

① bootloader

② Linux内核

③ 驱动程序

④ 使用C/C++编写的应用程序

⑤ Android系统本身

⑥ Android应用程序

Android跟Linux的联系实在太大了,它的应用是如此广泛,学习了Linux之后没有理由停下来不学习Android。在大多数智能设备中,运行的是Linux操作系统;它上面要么安装有Android,要么可以跟Android手机互联。现在,Linux+Android已成标配

怎么学习嵌入式Linux操作系统

本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。在实际工作中,我们从事的是“操作系统”周边的开发,并不会太深入学习、修改操作系统本身。

① 操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常

稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序

② 学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程

序后,也会加深对操作系统其他部分的理解

③ Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成

但是,要成为该领域的高手,一定要深入理解Linux操作系统本身,要去研读它的源代码。

在忙完工作,闲暇之余,可以看看这些书:

① 赵炯的《linux内核完全注释》,这本比较薄,推荐这本。他后来又出了《Linux 内核

完全剖析》,太厚了,搞不好看了后面就忘记前面了。

② 毛德操、胡希明的《LINUX核心源代码情景分析》,此书分上下册,巨厚无比。当作

字典看即可:想深入理解某方面的知识,就去看某章节。

③ 其他好书还有很多,我没怎么看,没有更多建议

基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习

入门路线图

假设您是零基础,我们规划了如下入门路线图。

前面的知识,是后面知识的基础,建议按顺序学习。每一部分,不一定需要学得很深入透彻,下面分章节描述。

学习驱动程序之前的基础知识

C语言

只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的一上机就傻了,我怀疑他们都没在电脑上写过程序。

理论再好,没有实践不能干活的话,公司招你去干嘛?

反过来,实践出真知,学习C语言,必须练练练、写写写!

当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;

当你写过几个C程序后,就可以进入下一阶段的裸机开发了。

① 不需要太深入

作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法操作,暂时就够了。指针操作是重点,多练习;

不需要去学习过多的数据结构知识,只需要掌握链表操作,其他不用学习,比如:队列、二叉树等等都不用学;不需要去学习任何的函数使用,比如文件操作、多线程编程、网络编程等等;这些知识,在编写Linux应用程序时会用,但是在操作系统特别是驱动学习时,用不着!永往直前吧,以后碰到不懂的C语言问题,我们再回过头来学习。

在后续的“裸机开发”中,会让你继续练习C语言,那会更实战化。

C语言是在写代码中精进的。

② 可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令

我们暂时没有提供C语言的教程,找一本C语言书,网上找找免费的C语言视频(主要看怎么搭建环境),就可以自学了。

PC Linux基本操作:

对于PC Linux,我们推荐使用Ubuntu,在它上面安装软件非常简便。

我们的工作模式通常是这样:在Windows下阅读、编写代码,然后把代码上传到PC Linux去编译。实际上,Ubuntu的桌面系统已经很好用了,我们拿到各种智能机可以很快上手,相信Ubuntu的桌面系统也可以让你很快上手。为了提高工作效率,我们通常使用命令行来操作Ubuntu。不用担心,你前期只需要掌握这几条命令就可以了,它们是如此简单,我干脆列出它们:

① cd : Change
Directory(改变目录)

cd 目录名 // 进入某个目录

cd … // cd “两个点”:返回上一级目录

cd - // cd “短横”:返回上一次所在目录

② pwd : Print Work Directory(打印当前目录 显示出当前工作目录的绝对路径)

③ mkdir : Make
Directory(创建目录)

mkdir abc // 创建文件夹abc

mkdir -p a/b/c // 创建文件夹a,再a下创建文件夹b,再在b下创建文件夹c

④ rm : Remove(删除目录或文件)

rm file // 删除名为file的文件

rm -rf dir // 删除名为dir的目录

⑤ ls : List(列出目录内容)

⑥ mount : 挂载

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt

mount -t yaffs /dev/mtdblock3 /mnt

⑦ chown : Change
owner(改变文件的属主,即拥有者)

chown book:book /work -R // 对/work目录及其下所有内容,属主改为book用户,组改为book

⑧ chmod : Change mode(改变权限),下面的例子很简单粗暴

chmod 777 /work -R // 对/work目录及其下所有内容,权限改为可读、可写、可执行

⑨ vi : Linux下最常用的编辑命令,使用稍微复杂,请自己搜索用法。

要练习这些命令,你可以进入Ubuntu桌面系统后,打开终端输入那些命令;或是用SecureCRT、putty等工具远程登录Ubuntu后练习。

硬件知识

我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。对于正统的方法,你应该这样学习:

① 学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。

② 学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。

③ 《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。

就我个人经验来说,这些课程是有用的,但是:

① 原理有用,实战性不强。

比如《微机原理》是基于x86系统,跟ARM板子有很大差别,当然原理相通。

我是在接触嵌入式编程后,才理解了这些课程。

② 每本书都那么厚,内容都很多,学习时间过长,自学有难度。

针对这些校园教材的不足,并结合实际开发过程中要用到的知识点,我们推出了《学前班_怎么看原理图》的系列视频:

学前班第1课第1节_怎么看原理图之GPIO和门电路.wmv

学前班第1课第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课第3节_怎么看原理图之内存类接口.wmv

学前班第1课第4.1节_怎么看原理图之分析S3C2410开发板.wmv

学前班第1课第4.2节_怎么看原理图之分析S3C2440开发板.wmv

学前班第1课第4.3节_怎么看原理图之分析S3C6410开发板.wmv

即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。

要不要专门学习Windows下的单片机开发

很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。

问题来了,要不要专门学习Windows下的单片机开发?

① 如果这是你们专业的必修课,那就学吧

② 如果你的专业跟单片机密切相关,比如机械控制等,那就学吧

③ 如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows

学习单片机吧!理由如下:

① Windows下的单片机学习,深度不够

Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。

它们封装了很多技术细节,比如:

1课第4.3节_怎么看原理图之分析S3C6410开发板.wmv

即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。

要不要专门学习Windows下的单片机开发

很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。

问题来了,要不要专门学习Windows下的单片机开发?

① 如果这是你们专业的必修课,那就学吧

② 如果你的专业跟单片机密切相关,比如机械控制等,那就学吧

③ 如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows

学习单片机吧!理由如下:

① Windows下的单片机学习,深度不够

Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。

它们封装了很多技术细节,比如:

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐