想进入嵌入式行业,需要学习的内容有以下几个阶段学习。
1、入式高级C语言
2、嵌入式设备及GUI开发
3、嵌入式Linux高级程序设计
4、Linux高级网络程序设计
5、数据库开发
6、C++面向对象高级语言程序设计
7、物联网
8、CotexA53 Linux平台驱动开发
嵌入式的应用比较广泛,适用于各个领域,比如:电子、医疗、军工等等。这些表示嵌入式应用灵活,丰富的应用,可为我们提供多样选择。所以,学习好嵌入式就业的方向和范围也很广泛。
原文链接:网页链接
嵌入式Linux学习路线图我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的经历、当下的学习,在未来的一天肯定会影响到你。毕业后我们也各自找到了自己的职业:出国深造转行做金融、留校任教做科研、设计芯片、写程序、创办公司等等,这一切都离不开在校时学到的基础技能(数学、IT、电子电路)、受过煅炼的自学能力。
所以,各位正在迷茫的在校生,各位正在尝试转行的程序员,未来一定有你的位置,是好是坏取决于你当下的努力与积累。
我不能预言几年后什么行业会热门,也不能保证你照着本文学习可以发财。我只是一个有十几年经验的程序员,给对编程有兴趣的你,提供一些建议。
1程序员的三大方向程序员的方向,一般可以分为3类:专业领域、业务领域、 *** 作系统领域。你了解它们后,按兴趣选择吧。
对于专业领域,我提供不了建议。
业务,也就是应用程序,它跟 *** 作系统并不是截然分开的:
①开发实体产品时,应用程序写得好的人,有时候需要 *** 作系统的知识,比如调度优先级的设置、知道某些函数可能会令进程休眠。
②写应用程序的人进阶为系统工程师时,他需要从上到下都了解,这时候就需要有 *** 作系统领域的知识了,否则,你怎么设计整个系统的方案呢?
③做应用程序的人,需要了解行业的需求,理解业务的逻辑。所以,当领导的人,多是做应用的。一旦钻入了某个行业,很难换行业。
④而 *** 作系统领域,做好了这是通杀各行业:他只负责底层系统,在上面开发什么业务跟他没关系。这行很多是技术宅,行业专家。
⑤ *** 作系统和业务之间并没有一个界线。有 *** 作系统经验,再去做应用,你会对系统知根知底,碰到问题时都有解决思路。有了业务经验,你再了解一下 *** 作系统,很快就可以组成一个团队自立门户,至少做个CTO没问题。
11 专业领域它又可以分为下面2类。
111 学术研究
比如语音、图像处理、人工智能,这类工作需要你有比较强的理论知识,我倾向于认为这类人是“科学家”,他们钻研多年,很多时候是在做学术研究。
在嵌入式领域,需要把他们的成果用某种算法表达出来,针对某种芯片进行优化,这部分工作也许有专人来做。
112 工程实现
也有这样一类人,他们懂得这些专业领域的概念,但是没有深入钻研。可以使用各类开源资料实现某个目标,做出产品。比如图像处理,他懂得用opencv里几百个复杂函数来实现头像识别。有时候还可以根据具体芯片来优化这些函数。
“专业领域”不是我的菜,如果你要做这一块,我想最好的入门方法是在学校学习研究生、博士课程。
12 业务领域换句话说,就是应用程序,这又可以分为下面2类。
121 界面显示
做产品当然需要好的界面,但是,不是说它不重要,是没什么发展后劲。
现在的热门词是Android APP和IOS APP开发。你不要被Android、IOS两个词骗了,它们跟以前的VC、VB是同一路货色,只是、仅仅是一套GUI控件的实现。
希望没有冒犯到你,我有理由。
一个程序需要有GUI界面,但是程序的内在逻辑才是核心。Android、IOS的开发工具给我们简化了GUI的开发,并提供了这些控件的交互机制,封装并提供了一些服务(比如网络传输)。但是程序内部的业务逻辑、对视频图像声音的处理等等,这才是核心。另外别忘了服务器那边的后台程序:怎样更安全地保存数据、保护客户的隐私,怎样处理成千上万上百万的并发访问,等等,这也是核心。
但是,从Android、IOS APP入门入行,这很快!如果你是大四,急于找到一份工作,那么花上1、2个月去学习Android或IOS,应该容易找到工作,毕竟APP的需求永远是最大的,现在这两门技术还算热门。在2011、2012年左右,Android程序员的起薪挺高,然后开始下滑。Android APP的入门基本只要1个月,所以懂的人也越来越多。2013、2014年,IOS开发的工资明显比Android高了,于是各类IOS培训也火曝起来。中华大地向来不缺速成人才,估计再过一阵子IOS工程师也是白菜价了。
会Android、IOS只是基本要求,不信去51job搜搜Android或IOS,职位要求里肯定其他要求。
122 业务逻辑
举个简单例子,做一个打卡软件,你需要考虑这些东西:
①正常流程是上班下班时都要打卡
②有人忘记了怎么办?作为异常记录在案,推送给管理员
③请假时怎么处理?
④加班怎么处理?
对于更复杂的例子,视频会议系统里,各个模块怎么对接,各类协议怎么兼容,你不深入这个行业,你根本搞不清楚。
应用开发的职位永远是最多的,入门门槛也低。基本上只要你会C语言,面试时表现比较得体,一般公司都会给你机会。因为:
①你进公司后,还需要重新培训你:熟悉它们的业务逻辑。
②你要做的,基本也就是一个个模块,框架都有人给你定好了,你去填代码就可以了。
说点让你高兴的事:软件公司里,做领导的基本都是写应用程序的(当然还有做市场的)。写应用程序的人,对外可以研究市场接待客户,对内可以管理程序员完成开发,不让他做领导让谁做?
如果你的志向是写应用程序,那么我建议你先练好基本功:数据结构、算法是必备,然后凭兴趣选择数据库、网络编程等等进行深入钻研。
最后,选择你看好的、感兴趣的行业深耕个10年吧。做应用开发的人选择了某个行业,后面是很难换行业的,选行很重要!
13 *** 作系统领域UCOS太简单,VxWorks太贵太专业,Windows不玩嵌入式了,IOS不开源,所以对于 *** 作系统领域我们也只能玩Linux了。
在嵌入式领域Linux一家独大!
Android呢?Android跟QT一样,都是一套GUI系统。只是Google的实力太强了,现在Android无处不在,所以很多时候Linux+Android成了标配。注意,在这里我们关心的是Android的整个系统、里面的机制,而不是学习几个API然后开发界面程序。 *** 作系统领域所包含的内容,简单地说,就是制作出一台装好系统的专用“电脑”,可以分为:
①为产品规划硬件:
按需求、性能、成本选择主芯片,搭配周边外设,交由硬件开发人员设计。
②给单板制作、安装 *** 作系统、编写驱动
③定制维护、升级等系统方案
④还可能要配置、安装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系统。
14 嵌入式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已成标配。
2 怎么学习嵌入式Linux *** 作系统本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。
在实际工作中,我们从事的是“ *** 作系统”周边的开发,并不会太深入学习、修改 *** 作系统本身。
① *** 作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序
②学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程序后,也会加深对 *** 作系统其他部分的理解
③Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成
但是,要成为该领域的高手,一定要深入理解Linux *** 作系统本身,要去研读它的源代码。
在忙完工作,闲暇之余,可以看看这些书:
①赵炯的《linux内核完全注释》,这本比较薄,推荐这本。他后来又出了《Linux 内核完全剖析》,太厚了,搞不好看了后面就忘记前面了。
②毛德 *** 、胡希明的《LINUX核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。
③其他好书还有很多,我没怎么看,没有更多建议
基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习。
21 入门路线图假设您是零基础,我们规划了如下入门路线图。前面的知识,是后面知识的基础,建议按顺序学习。每一部分,不一定需要学得很深入透彻,下面分章节描述。
22 学习驱动程序之前的基础知识221 C语言
只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的,一上机就傻了,我怀疑他们都没在电脑上写过程序。
理论再好,没有实践不能干活的话,公司招你去干嘛?
反过来,实践出真知,学习C语言,必须练练练、写写写!
当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;
当你写过几个C程序后,就可以进入下一阶段的裸机开发了。
①不需要太深入
作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法 *** 作,暂时就够了。
指针 *** 作是重点,多练习;
不需要去学习过多的数据结构知识,只需要掌握链表 *** 作,其他不用学习,比如:队列、二叉树等等都不用学;不需要去学习任何的函数使用,比如文件 *** 作、多线程编程、网络编程等等;这些知识,在编写Linux应用程序时会用,但是在 *** 作系统特别是驱动学习时,用不着!
永往直前吧,以后碰到不懂的C语言问题,我们再回过头来学习。
在后续的“裸机开发”中,会让你继续练习C语言,那会更实战化。
C语言是在写代码中精进的。
②可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令,我们暂时没有提供C语言的教程,找一本C语言书,网上找找免费的C语言视频(主要看怎么搭建环境),就可以自学了。
222 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 // 创建文件夹abcmkdir -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 1921681123:/work/nfs_root /mntmount -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后练习。
223 硬件知识
我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。
对于正统的方法,你应该这样学习:
①学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。
②学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。
③《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。
就我个人经验来说,这些课程是有用的,但是:
①原理有用,实战性不强。
比如《微机原理》是基于x86系统,跟ARM板子有很大差别,当然原理相通。
我是在接触嵌入式编程后,才理解了这些课程。
②每本书都那么厚,内容都很多,学习时间过长,自学有难度。
针对这些校园教材的不足,并结合实际开发过程中要用到的知识点,我们推出了《学前班_怎么看原理图》的系列视频:
学前班第1课第1节___怎么看原理图之GPIO和门电路wmv
学前班第1课第21节_怎么看原理图之协议类接口之UARTwmv
学前班第1课第22节_怎么看原理图之协议类接口之I2Cwmv
学前班第1课第23节_怎么看原理图之协议类接口之SPIwmv
学前班第1课第24节_怎么看原理图之协议类接口之NAND Flashwmv
学前班第1课第25节_怎么看原理图之协议类接口之LCDwmv
学前班第1课第3节___怎么看原理图之内存类接口wmv
学前班第1课第41节_怎么看原理图之分析S3C2410开发板wmv
学前班第1课第42节_怎么看原理图之分析S3C2440开发板wmv
学前班第1课第43节_怎么看原理图之分析S3C6410开发板wmv
即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。
这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。
224 要不要专门学习Windows下的单片机开发
很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。
问题来了,要不要专门学习Windows下的单片机开发?
①如果这是你们专业的必修课,那就学吧
②如果你的专业跟单片机密切相关,比如机械控制等,那就学吧
③如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows下学习单片机吧!
理由如下:
①Windows下的单片机学习,深度不够
Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。
它们封装了很多技术细节,比如:
你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的;
你可以编写中断处理函数,但是却不知道它是怎么被调用的;
你不知道程序怎么从Flash上被读入内存;
也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪;
当你想裁剪程序降低对Flash、内存的使用时,你无从下手;
当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂;
等等等。
②基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。
在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。
一切从零编写代码、管理代码,可以让我们学习到更多知识:
你需要了解芯片的上电启动过程,知道第1条代码如何运行;
你需要掌握怎么把程序从Flash上读入内存;
需要理解内存怎么规划使用,比如栈在哪,堆在哪;
需要理解代码重定位;
需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场;
你会知道,main函数不是我们编写的第1个函数;
你会知道,芯片从上电开始,程序是怎么被搬运执行的;
你会知道,函数调用过程中,参数是如何传递的;
你会知道,中断发生时,每一个寄存器的值都要小心对待;
等等等。
你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。
驱动程序=Linux驱动程序软件框架+ARM开发板硬件 *** 作,我们可以从简单的裸机开发入手,先掌握硬件 *** 作,并且还可以:
①掌握如何在PC Linux下编译程序、把程序烧录到板子上并运行它
②为学习bootloader打基础:掌握了各种硬件 *** 作后,后面一组合就是一个bootloader
225 为什么选择ARM9 S3C2440开发板,而不是其他性能更好的?
有一个错误的概念:S3C2440过时了、ARM9过时了。
这是不对的,如果你是软件工程师,无论是ARM9、ARM11、A8还是A9,对我们来说是没有差别的。
一款芯片,上面有CPU,还有众多的片上设备(比如UART、USB、LCD控制器)。我们写程序时,并不涉及CPU,只是去 *** 作那些片上设备。
所以:差别在于片上设备,不在于CPU核;差别在于寄存器 *** 作不一样。
因为我们写驱动并不涉及CPU的核心,只是 *** 作CPU之外的设备,只是读写这些设备的寄存器。
之所以推荐S3C2440,是因为它的Linux学习资料最丰富,并有配套的第1、2期视频。
226 怎么学习ARM+Linux的裸机开发
学习裸机开发的目的有两个:
①掌握裸机程序的结构,为后续的u-boot作准备
②练习硬件知识,即:怎么看原理图、芯片手册,怎么写代码来 *** 作硬件
后面的u-boot可以认为是裸机程序的集合,我们在裸机开发中逐个掌握各个部件,再集合起来就可以得到一个u-boot了。
后续的驱动开发,也涉及硬件 *** 作,你可以在裸机开发中学习硬件知识。
注意:如果你并不关心裸机的程序结构,不关心bootloader的实现,这部分是可以先略过的。在后面的驱动视频中,我们也会重新讲解所涉及的硬件知识。
推荐两本书:杜春蕾的《ARM体系结构与编程》,韦东山的《嵌入式Linux应用开发完全手册》。后者也许是国内第1本涉及在PC Linux环境下开发的ARM裸机程序的书,如果我说错了,请原谅我书读得少。
对于裸机开发,我们提供有2部分视频:
①环境搭建
第0课第1节_刚接触开发板之接口接线wmv
第0课第2节_刚接触开发板之烧写裸板程序wmv
第0课第3节_刚接触开发板之重烧整个系统wmv
第0课第4节_刚接触开发板之使用vmwae和预先做好的ubuntuwmv
第0课第5节_刚接触开发板之u-boot打补丁编译使用及建sourceinsight工程wmv
第0课第6节_刚接触开发板之内核u-boot打补丁编译使用及建sourceinsight工程wmv
第0课第7节_刚接触开发板之制作根文件系统及初试驱动wmv
第0课第8节_在TQ2440,MINI2440上搭建视频所用系统wmv
第0课第9节_win7下不能使用dnw烧写的替代方法wmv
未完
原文链接:网页链接
朱有鹏老师嵌入式linux核心课程-免费课程 免费下载
2em3
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX *** 作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的 *** 作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络 *** 作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
韦东山:6000字长文告诉你如何学习嵌入式linux
链接:网页链接
第1章 单片机和Linux的区别
11 有哪些产品使用单片机或Linux
所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。
也许你不服!不是还有ucos、vxwork、wince、IOS吗?下面这个图是关于 *** 作系统的占比,是2016年的,我没找到更新的图,但是很有参考意义:
我们说的单片机不使用 *** 作系统,在上图中没有体现出来。但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业
日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:
我们设计一个产品时,是使用单片机还是Linux,取决于成本:硬件成本、软件成本、维护成本、升级成本。而不应该根据个人偏好来选择:我喜欢单片机,所以就排斥使用Linux;我喜欢Linux,就排斥使用单片机。为了有更多的选择,我们需要既懂单片机,又懂Linux。
12 在硬件 *** 作上单片机和Linux是类似的
以点灯为例,
无论是单片机还是Linux,我们要做的事情都一样:
① 看原理图,确定引脚是哪一个,确定它输出什么电平才可以
② 看芯片手册,确定要怎么 *** 作寄存器
③ 写程序
但是,怎么编写程序,单片机和Linux有很大不同。
13 在单片机中点灯、使用LCD
使用单片机开发程序时,我们一上来就写一个main函数,下面是一些简化的代码:
LED程序里面的init_led、led_on、led_off函数是你一个人写的,爱取什么名就取什么名,爱怎么写就怎么写。
LCD程序里的函数也是你写的,完全是自由发挥。
很多单片机项目不是很复杂,2、3个人从上到下统统搞定,里面的函数大多时间是直接去读写寄存器。
很多单片机项目严重依赖于硬件,换一个芯片后怎么办?重写一套代码呗。
在单片机程序里,没有应用程序、驱动程序的概念,很可能一个人包揽了硬件设计、模块调试(或称之为驱动)、功能开发(或称之为应用)的全部活。
14 在Linux中点灯、使用LCD
在Linux中,不允许应用开发人员直接去 *** 作硬件,比如你想点个灯,不好意思,你无法直接访问寄存器;你需要通过驱动程序来访问寄存器。
为什么?有几大原因:
① Linux系统中运行着众多程序,必须保证质量差的程序无法破坏系统:
假设你写的程序比较烂,那我不能让你去随便访问寄存器,把系统搞崩溃了怎么办?你本意是去点灯,但是你看错了寄存器,你把电源关了怎么办?
所以这些 *** 作硬件的活,还是交给信得过的人来做吧:交给驱动工程师,他既懂硬件又懂软件。
② 保证程序的可移植性:
编写应用程序时,大家都使用统一的函数,以后换一个芯片时,应用程序不用变;只需要根据这个接口提供驱动程序就可以了。
③ 团队协作:
。使用Linux系统的项目一般比较大,术业有专攻,一个人不太可能从上到下都全部掌握。比如做人脸识别项目,有擅长做图像处理的,他可不管你要用多少种摄像头,有图像给他就可以。而多种摄像头的硬件 *** 作方法各有不同,这些交给驱动程序工程师。
所以,在Linux中应用程序和驱动程序是分开的。
以LED、LCD程序为例,简化的代码如下:
也许你已经大概猜出来了,应用程序怎么调用驱动程序?通过标准的接口:
①open:
打开驱动程序。
② read/write:
读、写数据。
③ ioctl:
传入各种参数,获得各种参数。
④ mmap:
内存映射,比如映射之后,应用程序可以直接读写LCD的显存。
你看!从这些接口里,我们根本看不到寄存器的 *** 作。底层的程序驱动会根据这些调用,去设置寄存器、 *** 作硬件。
所以,我高大上的应用工程师,干嘛苦哈哈地去看原理图、看在片手册、读写寄存器,搞不好还要去调试硬件BUG。这些脏活、累活就交给驱动工程师吧。客户的需求千变万化,我996时间都不够用了。
切,我上懂软件、下懂硬件的驱动工程师,肯定不能把这么重要的活交给你去做了,把我的系统搞崩溃了怎么办。
开玩笑、开玩笑、开玩笑的,有应用工程师、驱动工程师的优劣之分,大家都是为了做出产品。现在有一个趋势,一个任务从上到下你都需要懂,这就是所谓的全栈工程师。
还是以LED为例,应用程序和驱动程序的协作如下图所示:
在Linux中,“一切皆文件”,要访问某个硬件,也是要打开文件、读写文件。应用程序要根据标准的文件接口:open/read/write/ioctl/mmap等来访问驱动程序。
既然如此,怎么写驱动程序呢?最简单的方法就是:APP要调用open来打开驱动程序,那驱动‘程序里就提供一个xxx_open函数来初始化硬件;APP要调用write来写数据,驱动程序里就提供一个xxx_write函数来接收数据并 *** 作硬件。
用xxx_open、xxx_write来构成一个驱动程序,这就是驱动框架。
怎么实现这些xxx_open、xxx_write函数?我们要做的事情跟单片机是类似的,一样要去看电路图、看芯片手册,然后在这些函数里读写寄存器:这称为硬件 *** 作。
所以,Linux驱动程序= 驱动框架 + 硬件 *** 作。
有单片机基础的人,对硬件 *** 作比较熟悉了,把重点放在驱动框架上就可以。
高能预警:驱动框架可不简单,对于LED来说是简单,但是还有更复杂的驱动程序,它要考虑“通用”,这很要命。
第2章 嵌入式Linux快速入门
这几天在群里跟学员聊天,有一位学员的学习方法很好:先观其广,再究其深。有时候要“不求甚解”,很多时候保持疑问先学下去,这些疑问就自然解决了。
比如课程中涉及汇编知识,如果你要彻底弄清楚,你需要去学习《ARM架构与编程》;当你学完这本书,你的同学搞不好已经可以上手工作了。
21 短期的目标是什么
我们先把学习目标定下来:快速了解嵌入式Linux开发的流程,知道要学什么,具备跟从业者交流的能力。
下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。
从上图可以知道:
① 组成:
嵌入式Linux系统
= bootloader + linux内核 + 根文件系统(里面含有APP)。
② bootloader:
它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。
所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。
③ Linux内核
Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。
不仅如此,Linux内核还有进程调度能力、内存管理等功能。
所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。
23 要学习bootloader吗
Bootloader有很多种,常用的叫作u-boot。
在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。
花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。
所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。
如果你的工作就是修改、完善bootloader,那么再去研究它吧。
24 要学习Linux内核、要学习驱动程序吗
之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。
但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。
作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。
所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
① LED驱动程序:
这是最简单的驱动程序。
② 按键驱动程序:
它也比较简单,从它引入“中断”。
③ 中断:
从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。
所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。
入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。
摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。
25,要学习Linux应用程序吗?先学一些基础技能
要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:
① 基本设备的访问,比如LCD、输入设备
② 进程、线程、进程通信、线程同步与互斥
③ 休眠-唤醒、POLL机制、信号
④ 网络编程
①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。
掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。
26,应用程序是怎么启动的?要了解一下根文件系统
你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?
你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?
怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?
这些都需要我们了解一下根文件系统。
先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。
了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。
第3章 学习方法
31,先不要打破砂锅问到底
嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。
嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。
比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。
不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?
比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。
甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去百度一下这些命令就可以了。
不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。
32,思路要清晰,不怕抄代码
视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,
每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。
记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。
但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。
有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。
33,对自己的方向很了解,我只能带你到这里了
我的专长是 *** 作系统,是快速地带领大家掌握一些项目开发的基础知识。
如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。
比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。
当你想从事某个行业时,就需要深入研究行业相关的知识。
比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。
想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。
每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。
-☆ END ☆-
国嵌老谢老NB了,态度极差
1、视频讲的不深、死板、项目视频几乎毫无价值是垃圾;2、服务很差,QQ什么服务都是虚设的,还不能批评老师,批评直接拉黑;3、购买视频后几乎是一次性生意,如果你要电脑后重新索要账户密码,各种理由不给拖着,淘宝投诉国嵌时候,他们就用其他不同日期交易的客户或者自己的马甲截图假的解决问题成功的伪证信息欺骗淘宝客服;4、如果你再QQ或者旺旺批评过他们 ,过一段时间就等着视频看不了吧,会做手脚报复用户。
原文链接:网页链接
我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的经历、当下的学习,在未来的一天肯定会影响到你。毕业后我们也各自找到了自己的职业:出国深造转行做金融、留校任教做科研、设计芯片、写程序、创办公司等等,这一切都离不开在校时学到的基础技能(数学、IT、电子电路)、受过煅炼的自学能力。
所以,各位正在迷茫的在校生,各位正在尝试转行的程序员,未来一定有你的位置,是好是坏取决于你当下的努力与积累。
我不能预言几年后什么行业会热门,也不能保证你照着本文学习可以发财。我只是一个有十几年经验的程序员,给对编程有兴趣的你,提供一些建议。
1程序员的三大方向程序员的方向,一般可以分为3类:专业领域、业务领域、 *** 作系统领域。你了解它们后,按兴趣选择吧。
对于专业领域,我提供不了建议。
业务,也就是应用程序,它跟 *** 作系统并不是截然分开的:
①开发实体产品时,应用程序写得好的人,有时候需要 *** 作系统的知识,比如调度优先级的设置、知道某些函数可能会令进程休眠。
②写应用程序的人进阶为系统工程师时,他需要从上到下都了解,这时候就需要有 *** 作系统领域的知识了,否则,你怎么设计整个系统的方案呢?
③做应用程序的人,需要了解行业的需求,理解业务的逻辑。所以,当领导的人,多是做应用的。一旦钻入了某个行业,很难换行业。
④而 *** 作系统领域,做好了这是通杀各行业:他只负责底层系统,在上面开发什么业务跟他没关系。这行很多是技术宅,行业专家。
⑤ *** 作系统和业务之间并没有一个界线。有 *** 作系统经验,再去做应用,你会对系统知根知底,碰到问题时都有解决思路。有了业务经验,你再了解一下 *** 作系统,很快就可以组成一个团队自立门户,至少做个CTO没问题。
11 专业领域它又可以分为下面2类。
111 学术研究比如语音、图像处理、人工智能,这类工作需要你有比较强的理论知识,我倾向于认为这类人是“科学家”,他们钻研多年,很多时候是在做学术研究。
在嵌入式领域,需要把他们的成果用某种算法表达出来,针对某种芯片进行优化,这部分工作也许有专人来做。
112 工程实现
也有这样一类人,他们懂得这些专业领域的概念,但是没有深入钻研。可以使用各类开源资料实现某个目标,做出产品。比如图像处理,他懂得用opencv里几百个复杂函数来实现头像识别。有时候还可以根据具体芯片来优化这些函数。
“专业领域”不是我的菜,如果你要做这一块,我想最好的入门方法是在学校学习研究生、博士课程。
12 业务领域换句话说,就是应用程序,这又可以分为下面2类。
121 界面显示
做产品当然需要好的界面,但是,不是说它不重要,是没什么发展后劲。
现在的热门词是Android APP和IOS APP开发。你不要被Android、IOS两个词骗了,它们跟以前的VC、VB是同一路货色,只是、仅仅是一套GUI控件的实现。
希望没有冒犯到你,我有理由。
一个程序需要有GUI界面,但是程序的内在逻辑才是核心。Android、IOS的开发工具给我们简化了GUI的开发,并提供了这些控件的交互机制,封装并提供了一些服务(比如网络传输)。但是程序内部的业务逻辑、对视频图像声音的处理等等,这才是核心。另外别忘了服务器那边的后台程序:怎样更安全地保存数据、保护客户的隐私,怎样处理成千上万上百万的并发访问,等等,这也是核心。
但是,从Android、IOS APP入门入行,这很快!如果你是大四,急于找到一份工作,那么花上1、2个月去学习Android或IOS,应该容易找到工作,毕竟APP的需求永远是最大的,现在这两门技术还算热门。在2011、2012年左右,Android程序员的起薪挺高,然后开始下滑。Android APP的入门基本只要1个月,所以懂的人也越来越多。2013、2014年,IOS开发的工资明显比Android高了,于是各类IOS培训也火曝起来。中华大地向来不缺速成人才,估计再过一阵子IOS工程师也是白菜价了。
会Android、IOS只是基本要求,不信去51job搜搜Android或IOS,职位要求里肯定其他要求。
122 业务逻辑
举个简单例子,做一个打卡软件,你需要考虑这些东西:
①正常流程是上班下班时都要打卡
②有人忘记了怎么办?作为异常记录在案,推送给管理员
③请假时怎么处理?
④加班怎么处理?
对于更复杂的例子,视频会议系统里,各个模块怎么对接,各类协议怎么兼容,你不深入这个行业,你根本搞不清楚。
应用开发的职位永远是最多的,入门门槛也低。基本上只要你会C语言,面试时表现比较得体,一般公司都会给你机会。因为:
①你进公司后,还需要重新培训你:熟悉它们的业务逻辑。
②你要做的,基本也就是一个个模块,框架都有人给你定好了,你去填代码就可以了。
说点让你高兴的事:软件公司里,做领导的基本都是写应用程序的(当然还有做市场的)。写应用程序的人,对外可以研究市场接待客户,对内可以管理程序员完成开发,不让他做领导让谁做?
如果你的志向是写应用程序,那么我建议你先练好基本功:数据结构、算法是必备,然后凭兴趣选择数据库、网络编程等等进行深入钻研。
最后,选择你看好的、感兴趣的行业深耕个10年吧。做应用开发的人选择了某个行业,后面是很难换行业的,选行很重要!
13 *** 作系统领域UCOS太简单,VxWorks太贵太专业,Windows不玩嵌入式了,IOS不开源,所以对于 *** 作系统领域我们也只能玩Linux了。
在嵌入式领域Linux一家独大!
Android呢?Android跟QT一样,都是一套GUI系统。只是Google的实力太强了,现在Android无处不在,所以很多时候Linux+Android成了标配。注意,在这里我们关心的是Android的整个系统、里面的机制,而不是学习几个API然后开发界面程序。 *** 作系统领域所包含的内容,简单地说,就是制作出一台装好系统的专用“电脑”,可以分为:
①为产品规划硬件:
按需求、性能、成本选择主芯片,搭配周边外设,交由硬件开发人员设计。
②给单板制作、安装 *** 作系统、编写驱动
③定制维护、升级等系统方案
④还可能要配置、安装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系统。
14 嵌入式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已成标配。
2 怎么学习嵌入式Linux *** 作系统
本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。
在实际工作中,我们从事的是“ *** 作系统”周边的开发,并不会太深入学习、修改 *** 作系统本身。
① *** 作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序
②学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程序后,也会加深对 *** 作系统其他部分的理解
③Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成
但是,要成为该领域的高手,一定要深入理解Linux *** 作系统本身,要去研读它的源代码。
在忙完工作,闲暇之余,可以看看这些书:
①赵炯的《linux内核完全注释》,这本比较薄,推荐这本。他后来又出了《Linux 内核完全剖析》,太厚了,搞不好看了后面就忘记前面了。
②毛德 *** 、胡希明的《LINUX核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。
③其他好书还有很多,我没怎么看,没有更多建议
基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习。
21 入门路线图
假设您是零基础,我们规划了如下入门路线图。前面的知识,是后面知识的基础,建议按顺序学习。每一部分,不一定需要学得很深入透彻,下面分章节描述。
22 学习驱动程序之前的基础知识221 C语言
只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的,一上机就傻了,我怀疑他们都没在电脑上写过程序。
理论再好,没有实践不能干活的话,公司招你去干嘛?
反过来,实践出真知,学习C语言,必须练练练、写写写!
当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;
当你写过几个C程序后,就可以进入下一阶段的裸机开发了。
①不需要太深入
作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法 *** 作,暂时就够了。
指针 *** 作是重点,多练习;
不需要去学习过多的数据结构知识,只需要掌握链表 *** 作,其他不用学习,比如:队列、二叉树等等都不用学;不需要去学习任何的函数使用,比如文件 *** 作、多线程编程、网络编程等等;这些知识,在编写Linux应用程序时会用,但是在 *** 作系统特别是驱动学习时,用不着!
永往直前吧,以后碰到不懂的C语言问题,我们再回过头来学习。
在后续的“裸机开发”中,会让你继续练习C语言,那会更实战化。
C语言是在写代码中精进的。
②可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令,我们暂时没有提供C语言的教程,找一本C语言书,网上找找免费的C语言视频(主要看怎么搭建环境),就可以自学了。
222 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 1921681123:/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后练习。
223 硬件知识
我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。
对于正统的方法,你应该这样学习:
①学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。
②学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。
③《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。
就我个人经验来说,这些课程是有用的,但是:
①原理有用,实战性不强。
比如《微机原理》是基于x86系统,跟ARM板子有很大差别,当然原理相通。
我是在接触嵌入式编程后,才理解了这些课程。
②每本书都那么厚,内容都很多,学习时间过长,自学有难度。
针对这些校园教材的不足,并结合实际开发过程中要用到的知识点,我们推出了《学前班_怎么看原理图》的系列视频:
学前班第1课第1节___怎么看原理图之GPIO和门电路wmv
学前班第1课第21节_怎么看原理图之协议类接口之UARTwmv
学前班第1课第22节_怎么看原理图之协议类接口之I2Cwmv
学前班第1课第23节_怎么看原理图之协议类接口之SPIwmv
学前班第1课第24节_怎么看原理图之协议类接口之NAND Flashwmv
学前班第1课第25节_怎么看原理图之协议类接口之LCDwmv
学前班第1课第3节___怎么看原理图之内存类接口wmv
学前班第1课第41节_怎么看原理图之分析S3C2410开发板wmv
学前班第1课第42节_怎么看原理图之分析S3C2440开发板wmv
学前班第1课第43节_怎么看原理图之分析S3C6410开发板wmv
即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。
这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。
224 要不要专门学习Windows下的单片机开发
很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。
问题来了,要不要专门学习Windows下的单片机开发?
①如果这是你们专业的必修课,那就学吧
②如果你的专业跟单片机密切相关,比如机械控制等,那就学吧
③如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows下学习单片机吧!
理由如下:
①Windows下的单片机学习,深度不够
Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。
它们封装了很多技术细节,比如:
你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的;
你可以编写中断处理函数,但是却不知道它是怎么被调用的;
你不知道程序怎么从Flash上被读入内存;
也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪;
当你想裁剪程序降低对Flash、内存的使用时,你无从下手;
当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂;
等等等。
②基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。
在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。
一切从零编写代码、管理代码,可以让我们学习到更多知识:
你需要了解芯片的上电启动过程,知道第1条代码如何运行;
你需要掌握怎么把程序从Flash上读入内存;
需要理解内存怎么规划使用,比如栈在哪,堆在哪;
需要理解代码重定位;
需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场;
你会知道,main函数不是我们编写的第1个函数;
你会知道,芯片从上电开始,程序是怎么被搬运执行的;
你会知道,函数调用过程中,参数是如何传递的;
你会知道,中断发生时,每一个寄存器的值都要小心对待;
等等等。
你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。
驱动程序=Linux驱动程序软件框架+ARM开发板硬件 *** 作,我们可以从简单的裸机开发入手,先掌握硬件 *** 作,并且还可以:
①掌握如何在PC Linux下编译程序、把程序烧录到板子上并运行它
②为学习bootloader打基础:掌握了各种硬件 *** 作后,后面一组合就是一个bootloader
225 为什么选择ARM9 S3C2440开发板,而不是其他性能更好的?
有一个错误的概念:S3C2440过时了、ARM9过时了。
这是不对的,如果你是软件工程师,无论是ARM9、ARM11、A8还是A9,对我们来说是没有差别的。
一款芯片,上面有CPU,还有众多的片上设备(比如UART、USB、LCD控制器)。我们写程序时,并不涉及CPU,只是去 *** 作那些片上设备。
所以:差别在于片上设备,不在于CPU核;差别在于寄存器 *** 作不一样。
因为我们写驱动并不涉及CPU的核心,只是 *** 作CPU之外的设备,只是读写这些设备的寄存器。
之所以推荐S3C2440,是因为它的Linux学习资料最丰富,并有配套的第1、2期视频。
226 怎么学习ARM+Linux的裸机开发
学习裸机开发的目的有两个:
①掌握裸机程序的结构,为后续的u-boot作准备
②练习硬件知识,即:怎么看原理图、芯片手册,怎么写代码来 *** 作硬件
后面的u-boot可以认为是裸机程序的集合,我们在裸机开发中逐个掌握各个部件,再集合起来就可以得到一个u-boot了。
后续的驱动开发,也涉及硬件 *** 作,你可以在裸机开发中学习硬件知识。
注意:如果你并不关心裸机的程序结构,不关心bootloader的实现,这部分是可以先略过的。在后面的驱动视频中,我们也会重新讲解所涉及的硬件知识。
推荐两本书:杜春蕾的《ARM体系结构与编程》,韦东山的《嵌入式Linux应用开发完全手册》。后者也许是国内第1本涉及在PC Linux环境下开发的ARM裸机程序的书,如果我说错了,请原谅我书读得少。
对于裸机开发,我们提供有2部分视频:
①环境搭建
第0课第1节_刚接触开发板之接口接线wmv
第0课第2节_刚接触开发板之烧写裸板程序wmv
第0课第3节_刚接触开发板之重烧整个系统wmv
第0课第4节_刚接触开发板之使用vmwae和预先做好的ubuntuwmv
第0课第5节_刚接触开发板之u-boot打补丁编译使用及建sourceinsight工程wmv
第0课第6节_刚接触开发板之内核u-boot打补丁编译使用及建sourceinsight工程wmv
第0课第7节_刚接触开发板之制作根文件系统及初试驱动wmv
第0课第8节_在TQ2440,MINI2440上搭建视频所用系统wmv
第0课第9节_win7下不能使用dnw烧写的替代方法wmv
原文链接:网页链接
鸿蒙 *** 作系统(Harmony OS),从2019年第一次开天辟地出现在世人面前,到如今已接近2年。但是到现在,大多数人仍然难以说清楚“鸿蒙”究竟是什么。
6月2日晚,华为举办发布会,正式发布新一代鸿蒙 *** 作系统HarmonyOS 2以及多款搭载该系统的产品,并宣布“百”款手机设备将陆续启动鸿蒙 *** 作系统升级。也就是说,搭载鸿蒙 *** 作系统的手机已经变成面向市场的正式产品。
自从鸿蒙诞生以来,“国产”、“第三大 *** 作系统”都是贴在它身上的标签,那么,搭载在手机上的鸿蒙 *** 作系统是什么样的?和安卓、iOS相比,它有什么特点?其他手机厂商是否会支持搭载?
搭载鸿蒙系统的手机来了:
从万能卡片到畅联流转,新功能登场
在这场发布会上,华为消费者业务CEO余承东、消费者业务软件部总裁王成录和手机产品线总裁何刚等先后亮相。
王成录用一句话概括了鸿蒙 *** 作系统(以下简称“鸿蒙”)给当前的手机系统带来的变化:
“在智能手机的时代,让消费者有机会根据自己的需要来组装软件(指APP)。那么,鸿蒙相对于今天的 *** 作系统,又有一个飞跃,让消费者可以根据自己的需要来组装不同的硬件。”
红星资本局注意到,智能手机在搭载了鸿蒙以后,消费者能明显感觉到的变化主要体现在三个功能上,即畅联流转、多机位模式和万能卡片。
要解释清楚这三个功能,我们首先要明确的是,鸿蒙系统是基于物联网推出的。
截图自发布会
对于鸿蒙,华为给出的官方定义是“面向全场景的分布式 *** 作系统”。大概意思是: 鸿蒙可以通过分布式技术,把物理上相互分离的多个设备,融合成一个“超级终端”。
比如说,现在很多人家里都有智能家居设备,通过特定的APP和系统,我们可以控制电灯的亮灭、窗帘的开合;但是,由于不同的生产商往往没有互联互通,用户可能需要使用多个APP甚至是多种 *** 作系统。
而鸿蒙要做的就是打破这个困局,就像王成录说的那样,“鸿蒙系统是不同设备的统一语言。”
现在我们回过头来看看搭载鸿蒙的手机有些什么新功能:
大多数人没看懂的鸿蒙:
和安卓、iOS的区别到底在哪里?
在对鸿蒙 *** 作系统(以下简称“鸿蒙”)进行解读时,难免会和安卓、iOS这两个 *** 作系统上的巨头进行比较。
据StatCounter数据显示,在2020年4月至今年4月,移动端 *** 作系统市场份额上,谷歌安卓系统占比达722%,苹果iOS系统占比为2699%,其他均不足1%。
安卓和iOS几乎垄断了全球市场,在这样的背景下,鸿蒙要如何突围?
“华为绝不会再做一个安卓或者再做一个iOS,如果再做一个一样的智能终端的 *** 作系统,是没有价值的。”王成录称。
和安卓、iOS相比,鸿蒙最大的特点在于:它不仅是一个手机 *** 作系统,更是一个面向万物互联的 *** 作系统。手机、电视、平板、 汽车 等终端只要搭载鸿蒙系统,软件在不同平台之间都可以适配,不再需要单独开发。
通信专家项立刚在接受红星资本局采访时,把鸿蒙称为 “下一代 *** 作系统” 。
“我们以前的 *** 作系统——电脑用的是电脑 *** 作系统,手机用的是手机的; 那到了现在,我们希望能把电脑、手机甚至是 汽车 的 *** 作系统都打通,传统的系统架构做不到,必须有新的架构。” 项立刚对红星资本局说。
图据微博@华为终端公司
按照目前的发布情况来看,鸿蒙更像是锚定物联网时代推出的系统。
据经济参考报援引GSMA数据,预测在2025年全球物联网的设备联网数量将达到252亿。在预测期内,市场规模将几乎是原来的四倍。
鸿蒙作为第一个基于物联网时代的 *** 作系统,可以说占据了“天时”和“地利”。至于“人和”,则需要华为努力为鸿蒙搭建起一条完整的产业生态链。
3亿和16%的生死线:
*** 作系统的生态链要如何搭建起来?
“做一个 *** 作系统,技术上不难,生态才是核心。生态涉及的广度、深度和复杂度远远超过所有的单个技术。”王成录曾说。
项立刚也告诉红星资本局,目前对鸿蒙来说,最大的难题在于生态链。“鸿蒙需要更多的应用来支持,让用户可以在其中使用不同的应用,而且体验感不受影响。”
红星资本局了解到,华为的生态链搭建主要有两个方向,南向和北向。其中,南向是指设备制造厂家,比如九阳、美的等家电品牌;而北向指的是应用开发者。
据媒体报道,在今年3月,安卓有约2000万开发者,iOS有约2400万开发者,而鸿蒙的开发者则在数百万级。 不过,有提前体验了鸿蒙的用户告诉红星资本局,部分安卓APP可以兼容鸿蒙,目前使用正常。
图据华为年报
那要把生态链发展到什么程度,鸿蒙才算是存活了下来?
华为消费者业务AI与智慧全场景业务部副总裁杨海松给出了一个数字——16%。
“对于 *** 作系统这类底层平台而言,软件使用量、市场占有率是它能否活下来、能否成功的核心因素,而16%的市占率则是一个生死线。”杨海松说 。
为了迈过这16%市占率的生死线, 华为在2021年需要完成的目标是:搭载鸿蒙的设备数量需达到3亿。 其中,自有设备占2亿,生态合作伙伴的设备数量为1亿。
据余承东此前透露,目前华为已售出超过10亿台全场景智慧连接设备,其中在网手机超过7亿台,大约90%的华为存量和在售手机都可以升级为鸿蒙系统。
10亿台中约有7亿台是手机,也就是说,鸿蒙的绝大部分希望仍是寄托于手机产品上的。
用户们会愿意将现有的系统升级为尚未成熟的鸿蒙吗?
其他手机品牌会搭载吗?
连荣耀似乎也不愿轻易“冒险”
红星资本局发现, 目前,国内主流的手机厂商均没有明确表示生产的手机会搭载鸿蒙。就连刚从华为分出去的“亲儿子”荣耀,似乎也不敢轻易“冒险”。
“荣耀已是一个完全独立的手机品牌,会根据行业发展适当的时候选择不同的 *** 作系统。”荣耀的CEO赵明称, 当下安卓依然是荣耀首选,但未来不排除使用鸿蒙。
值得一提的是,在华为过去的出货量中,荣耀品牌下的手机是不可或缺的一部分。
红星资本局发现,有数据统计称,中国手机用户换机周期为2年。
据华为2019年年报,当年的智能手机发货量超过24亿台(包括荣耀);另据IDC数据,在2020年,华为全年的出货量为189亿台(包括荣耀)。
也就是说,正在被用户们使用的华为手机大约有429亿台,每两位华为手机用户中,至少要有一位升级为鸿蒙系统,华为设立的2亿自有设备搭载鸿蒙的目标才有可能达到。
现在,就连荣耀也没有立刻搭载鸿蒙,华为距离16%的生死线似乎又远了一点。
除了荣耀外,也有其他手机厂商——魅族站出来力挺鸿蒙,但是,魅族用来搭载鸿蒙的并非是手机产品,而是智能家居业务线。
为什么会出现这样的情况?
“一方面是,这些手机厂商和安卓本身合作得很不错;另一方面,这些手机厂商可能更多地把华为当做竞争对手看待。 ”项立刚对红星资本局称,如果党政机关的工作人员都使用搭载国产 *** 作系统的手机,部分手机厂商不愿意放弃这个市场,可能会搭载鸿蒙。
如果华为既生产手机、又推鸿蒙系统,对于其他手机厂商来说,这像是既当运动员又当裁判,恐怕难以在手机端收获支持。
华为“ 1+8+N ”“ 农村包围城市” :
还有很长的路要走
一般来说,系统主要分为两种运营模式:一种是苹果的模式,软硬件都抓,不开放给第三方;另一种是安卓模式,会开放给第三方一起合作。
现在来看,华为走的是后者的路线。
早在2020年9月,在鸿蒙20正式亮相后,率先搭载的不是华为手机,而是九阳和美的等品牌的家电。
对于华为在鸿蒙搭载上的先后顺序,有业内人士将其形容为“农村包围城市”,或者说得更准确一点,是“从智能家居产品包围手机”。
某种意义上来说,这和华为“1+8+N”战略是契合的。其中,“1”是指手机,“8”是平板、PC和车机等,而“N”是指泛IoT(物联网)设备。
鸿蒙,正是从“N”开始起步,现在逐渐攻入“1+8”领域。
不过,红星资本局注意到,数码圈内有声音认为,鸿蒙系统的颠覆性实质上并不强。目前,苹果、小米等也在尝试做物联网,可以通过手机连接家庭中的其他产品。
“像苹果也有做家庭智能产品互联,两者的区别在于:一个只用自己的硬件,华为可以用其他品牌的硬件,而且旗帜鲜明地把‘万物互联’这个概念打出来了。” 有 科技 产业观察人士告诉红星资本局。
现在来看,没有其他任意一家手机厂商伸出援手,生态链也尚未完善,鸿蒙恐怕还有很长一段道路需要去走。
①用户体验者这样说
红星资本局了解到,对于华为手机用户来说,鸿蒙系统的公测版此前已向用户开放,在通过官方渠道报名筛选后,手机即可收到新系统的安装包。
方知(化名)是华为mate40的用户,他告诉红星资本局,在今年5月初,他收到了新系统安装包的推送,目前已经体验了20多天。
“整体来说很不错,很顺滑。”方知告诉红星资本局,虽然他的手机内安装了鸿蒙系统,但使用的仍是适配安卓的APP,鸿蒙可以兼容。
方知向红星资本局透露,鸿蒙系统内有一个APP图标上滑功能(指万能卡片),这是新功能,体验非常好。用户可以根据自己的喜好进行定制,让APP上滑后出现不同的服务卡片。
“和安卓相比,鸿蒙最大的优点就是万物互联,可以通过手机 *** 作把很多家电连接在一起。不过,我这样的配件不多,所以暂时没有什么很深的体会。”方知称。
另外,方知还告诉红星资本局,在目前的测试阶段,用户们发现一些小bug后,都可以反馈给反馈助手。对于反馈数量较多的问题,很快就会被修复。
②开发者们这样说
除了用户体验者外,开发者们也是接触鸿蒙 *** 作系统最多的人。
红星资本局发现,在鸿蒙学堂(分享鸿蒙系统资讯与技术的第三方平台)的官网上,有多位开发者讲述了对鸿蒙系统的看法。
曾担任Harmony OS开发者创新大赛导师的韦东山称,在2020年,他第一次接触到鸿蒙的源码, “(我)知道它不仅仅是去替代安卓,更是去超越安卓。”
韦东山称,鸿蒙是第一个看得见、摸得着、为物联网而产生的 *** 作系统。“从技术层面上来说,虽然国内外也有很多非常优秀的物联网 *** 作系统,但它们只局限于一个、一个单独的电子产品,鸿蒙是把一个、一个电子产品联系起来。”
另一位担任了Harmony OS开发者创新大赛导师的张荣超称,站在开发者的角度来看,鸿蒙绝不是另一个版本的安卓,而是一个全新的、面向全场景的 *** 作系统。
“鸿蒙支持一次开发、多端部署,就像开发单端APP一样简单,大大简化了开发者的工作量。 如果换用安卓实现同样的分布式功能,不仅工作量会大很多,而且在性能和用户体验上都会比较差。” 张荣超说。
责编 任志江 编辑 邓凌瑶
(下载红星新闻,报料有奖!)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)