我们自动化系是一个就业非常轻松的专业,可以让我们从事的行业非常丰富:
电子/电气工程师、电气工程师/技术员、自动化工程师、电气工程师、自动控制工程师/技术员、研发工程师、电子工程师/技术员、软件工程师、电子技术研发工程师、设备工程师(调试/安装/维护)、软件工程师、高级软件工程师、嵌入式软件工程师、研发工程师、软件开发工程师、嵌入式软件开发(Linux/单片机/DLC/DSP…)、程序员、系统集成工程师、互联网软件开发工程师、系统工程师、工程/设备工程师、自动化工程师、维修工程师、机电工程师、设备工程师、设备工程师(调试/安装/维护)、研发工程师、机械工程师、技术员、技术研发工程师、技术支持/维护工程师、系统工程师、信息技术经理/主管、技术支持/维护经理、网络工程师、信息技术专员等。
其中跟嵌入式专业有关的职业主要包括,嵌入式软件工程师、研发工程师、嵌入式软件开发(Linux/单片机/DLC/DSP…),我目前在学习的就是嵌入式软件有关的知识。
上面那么多的职业,其实可以分成五个大类:研发类、市场类、技术支持类、生产类、管理类。对于其他几个行业我并不是十分了解,但是对于技术开发的分类,还是有所了解的。
角色介绍:
根据岗位划分,软件开发的需要项目经理、系统工程师、硬件工程师、软件开发工程师、软件测试工程师、系统测试工程师等职位。
在软件开发的整个生命周期内,每个岗位都有各自职责,接下来介绍各岗位的职责。
项目经理(project team manger)直接与客户沟通,负责确定产品价格、产品功能、开发周期以及发布版本数目。该岗位对应互联网企业的产品经理,而且该岗位最容易升职为部门经理,也是我这两年的奋斗目标。
系统工程师(System Engineer)该岗位负责管理系统需求,同时也与主机厂客户沟通,并将用户需求转化为系统需求。
硬件工程师(Hardware Engineer)主要负责硬件开发,比如芯片及其他元器件的选择。当然,为了节约研发成本,企业会开发硬件平台,也就是说某款硬件平台能用满足多个项目的需求,所以公司硬件工程师数量不多。
软件开发工程师(Software Engineer)软件开发分为两种:平台软件开发和产品软件开发。
平台软件开发工程师是根据硬件平台开发底层软件模块,该岗位不负责具体产品,主要是为应用层开发提供各种接口,以及控制底层硬件。
产品软件开发负责产品功能开发,直接与产品打交道,主要是编写业务逻辑代码以及解决各种bug。同时,产品软件开发工程师负责将系统需求转化为软件需求,并将其实现。
目前,我希望从事的就是产品软件开发工程师,能够开发直接面向用户的产品是非常好的一件事,该岗位能够帮助我了解客户提出的各种需求以及提出这些需求的原因。
软件测试工程师(Software Validation Engineer)是负责软件发布之后的各项测试,日常就是采用各种姿势测试软件,然后把发现的bug给开发组。因此,一定与测试组小姐姐们搞好关系,加不加班全靠她们了, 哈哈。。。
系统测试工程师(System Validation Engineer)是负责产品的实测,这个岗位挺辛苦,经常出差不说,如果在客户那边测出重大问题,会被客户骂成狗。
总结
上述列出的岗位是在软件开发过程中与我了解的岗位。当然,由于很多岗位太过偏门,就不在这里一一列出。
总而言之,软件开发是一个系统化的工程,并不是写代码就算是软件开发了。
1.那么究竟什么是嵌入式?
在我们的日常生活中,我们经常使用许多使用嵌入式系统技术设计的电气和电子电路和套件。计算机,手机,平板,笔记本电脑,数字电子系统以及其他电子和电子设备都是使用嵌入式系统设计的。
将硬件电路与用于提供项目解决方案的软件编程技术集成的电子系统称为嵌入式系统。通过使用这种嵌入式系统技术,可以在很大程度上降低电路的复杂性,这进一步降低了成本和尺寸。
2.嵌入式系统设计
嵌入式系统基本上是电子系统,其可以被编程或非编程以基于应用来操作,组织和执行单个或多个任务。在实时嵌入式系统中,所有组装的单元基于嵌入微控制器的程序或规则集或代码一起工作。但是,通过使用这种微控制器编程技术,只能解决有限范围的问题。
嵌入式系统硬件
每个电子系统都由硬件电路组成,类似地,嵌入式系统包括硬件,如电源套件,中央处理单元,存储器件,定时器,输出电路,串行通信端口,以及系统应用专用电路元件和电路。
嵌入式系统软件编程
嵌入式系统是硬件和软件的集成,嵌入式系统中使用的软件是一组指令,称为程序。嵌入式系统的硬件电路中使用的微处理器或微控制器被编程为通过遵循该组指令来执行特定任务。这些程序主要使用编程软件、编程语言编写。然后,程序被转储到嵌入式系统电路中使用的微处理器或微控制器中。
嵌入式系统的分类
基于硬件和软件以及微控制器(8或16或32位)的复杂性,嵌入式系统主要分为不同类型。因此,基于微控制器的性能,嵌入式系统分为三种类型,小规模嵌入式系统,中型嵌入式系统,先进的嵌入式系统。
此外,基于系统嵌入式系统的性能和功能要求分为四类:实时嵌入式系统、独立嵌入式系统、
网络嵌入式系统、移动嵌入式系统。
说白了干嵌入式也就两个种类:软件和硬件。
我个人还是比较偏向于软件的设计,并不是因为做硬件不好,确实是发育太慢。做硬件没个大几年的工作经验别人都不敢用你。
3.做这行的平常要干些什么
1.嵌入式系统开发设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种操作系统,使用那些软件开发工具。系统分析师往往是较为完整的参与过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统本身的开发流程十分清楚的人。
2.嵌入式硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。通常需要硬件设计人员熟悉嵌入式系统的硬件构成。硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/视频编解码芯片,电源管理芯片,总线接口电路 (USB,PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth,WLAN,GPRS)等硬件电路构成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。在网络上能找到很多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
3.驱动程序和操作系统移植工作
现代嵌入式系统的开发同传统8位单片机系统的开发相比,一个显著的区别就是嵌入式操作系统的广泛使用。在拿到焊接完毕的电路板,并进行基本的测试后,就要进行驱动程序和操作系统的移植工作了。首先要进行的Bootloader的编写和移植工作。Bootloader相当于PC系统的BIOS。对于有些嵌入式操作系统,如uc/OSII没有bootloader同样可以开发调试。但是对于WindowsCE和嵌入式linux系统而言Bootloader就是必须的了。
4.嵌入式应用程序的开发
嵌入式系统的应用程序开发同在PC 机上开发应用程序的区别不是很大。对于Windows CE系统而言,Microsoft已经提供了较为完善的开发工具。开发人员可以使用Windows 的C# 语言直接在PC上进行应用程序的开发和模拟调试,也可将目标系统同PC 机相连,进行联机调试。现在有很多系统支持J2ME(JAVA的嵌入式系统版本) ,这使得JAVA 在嵌入式系统应用开发中占有较大的优势。另外,作为专业的嵌入式系统软件开发人员,还需要充分了解面向对象技术和设计模式等方面的知识,当然作为初学者可以先不深入研究这方面的内容。同学们在学习嵌入式的过程中要不断进行知识的探索,在一步一步学习之后就会有一个很大的进步。
4.干这行要学些什么
关于这个问题韦东山老师(就是我们这行里的扛把子)做过有关回答,我当初就是不小心看到这篇文章才决心入的坑。
下面是韦东山老师的原文:
我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的经历、当下的学习,在未来的一天肯定会影响到你。毕业后我们也各自找到了自己的职业:出国深造转行做金融、留校任教做科研、设计芯片、写程序、创办公司等等,这一切都离不开在校时学到的基础技能(数学、IT、电子电路)、受过煅炼的自学能力。
所以,各位正在迷茫的在校生,各位正在尝试转行的程序员,未来一定有你的位置,是好是坏取决于你当下的努力与积累。
我不能预言几年后什么行业会热门,也不能保证你照着本文学习可以发财。我只是一个有十几年经验的程序员,给对编程有兴趣的你,提供一些建议。
程序员的三大方向
程序员的方向,一般可以分为3类:专业领域、业务领域、操作系统领域。你了解它们后,按兴趣选择吧。对于专业领域,我提供不了建议。业务,也就是应用程序,它跟操作系统并不是截然分开的:
① 开发实体产品时,应用程序写得好的人,有时候需要操作系统的知识,比如调度优先级
的设置、知道某些函数可能会令进程休眠。
② 写应用程序的人进阶为系统工程师时,他需要从上到下都了解,这时候就需要有操作
系统领域的知识了,否则,你怎么设计整个系统的方案呢?
③ 做应用程序的人,需要了解行业的需求,理解业务的逻辑。所以,当领导的人,多是
做应用的。一旦钻入了某个行业,很难换行业。
④ 而操作系统领域,做好了这是通杀各行业:他只负责底层系统,在上面开发什么业务跟
他没关系。这行很多是技术宅,行业专家。
⑤ 操作系统和业务之间并没有一个界线。有操作系统经验,再去做应用,你会对系统知
根知底,碰到问题时都有解决思路。有了业务经验,你再了解一下操作系统,很快就可组成一个团队自立门户,至少做个CTO没问题。
专业领域
它又可以分为下面2类。
学术研究
比如语音、图像处理、人工智能,这类工作需要你有比较强的理论知识,我倾向于认为这类人是“科学家”,他们钻研多年,很多时候是在做学术研究。
在嵌入式领域,需要把他们的成果用某种算法表达出来,针对某种芯片进行优化,这部分工作也许有专人来做。
工程实现
也有这样一类人,他们懂得这些专业领域的概念,但是没有深入钻研。可以使用各类开源资料实现某个目标,做出产品。比如图像处理,他懂得用opencv里几百个复杂函数来实现头像识别。有时候还可以根据具体芯片来优化这些函数。
“专业领域”不是我的菜,如果你要做这一块,我想最好的入门方法是在学校学习研究生、博士课程。
业务领域
换句话说,就是应用程序,这又可以分为下面2类。
界面显示
做产品当然需要好的界面,但是,不是说它不重要,是没什么发展后劲。
现在的热门词是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,职位要求里肯定其他要求。
业务逻辑
举个简单例子,做一个打卡软件,你需要考虑这些东西:
① 正常流程是上班下班时都要打卡
② 有人忘记了怎么办?作为异常记录在案,推送给管理员
③ 请假时怎么处理?
④ 加班怎么处理?
对于更复杂的例子,视频会议系统里,各个模块怎么对接,各类协议怎么兼容,你不深入这个行业,你根本搞不清楚。
应用开发的职位永远是最多的,入门门槛也低。基本上只要你会C语言,面试时表现比较得体,一般公司都会给你机会。因为:
① 你进公司后,还需要重新培训你:熟悉它们的业务逻辑。
② 你要做的,基本也就是一个个模块,框架都有人给你定好了,你去填代码就可以了。
说点让你高兴的事:软件公司里,做领导的基本都是写应用程序的(当然还有做市场的)。写应用程序的人,对外可以研究市场接待客户,对内可以管理程序员完成开发,不让他做领导让谁做?如果你的志向是写应用程序,那么我建议你先练好基本功:数据结构、算法是必备,然后凭兴趣选择数据库、网络编程等等进行深入钻研。最后,选择你看好的、感兴趣的行业深耕个10年吧。做应用开发的人选择了某个行业,后面是很难换行业的,选行很重要!
操作系统领域
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系统。
嵌入式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等。
它们封装了很多技术细节,比如:
你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的;
你可以编写中断处理函数,但是却不知道它是怎么被调用的;
你不知道程序怎么从Flash上被读入内存;
也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪;
当你想裁剪程序降低对Flash、内存的使用时,你无从下手;
当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂;
等等等。
② 基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。
实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。一切从零编写代码、管理代码,可以让我们学习到更多知识:
你需要了解芯片的上电启动过程,知道第1条代码如何运行;
你需要掌握怎么把程序从Flash上读入内存;
需要理解内存怎么规划使用,比如栈在哪,堆在哪;
需要理解代码重定位;
需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场;
你会知道,main函数不是我们编写的第1个函数;
你会知道,芯片从上电开始,程序是怎么被搬运执行的;
你会知道,函数调用过程中,参数是如何传递的;
你会知道,中断发生时,每一个寄存器的值都要小心对待;
等等等。
你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。
驱动程序=Linux驱动程序软件框架+ARM开发板硬件操作,我们可以从简单的裸机开发入手,先掌握硬件操作,并且还可以:
① 掌握如何在PC Linux下编译程序、把程序烧录到板子上并运行它
② 为学习bootloader打基础:掌握了各种硬件操作后,后面一组合就是一个bootloader
随着人工智能与5G网络的发展,嵌入式的发展与繁荣是必然的,从这几年新出现的边缘产品就可以看出,大家要是有愿意入坑的我们可以一起学习共同进步。