A. 嵌入式开发需要掌握哪些知识
嵌入式系统是计算机软件和硬件的综合体,岗位包括:ESE(嵌入式软件工程师);ADE(嵌入式应用开发工程师);FWE(嵌入式底层开发工程师);FEC(嵌入式固件开发工程师),你可以先下载全套嵌入式视频课自学,看是否感兴趣。
课程内容主要包括:
①C,Java核心编程:c语言核心编程,Java核心编程;
②linux核心操作与算法:Linux系统使用,Linux-c编程核心技术,精品数据结构,Linux-c编程精髓;
③核心操作与算法:Linux系统编程,Linux网络编程核心技术,UI编程,Java核心编程,安卓核心技术;
④ARM+Linux底层开发:数字电路,ARM编程核心,Linux系统开发,嵌入式Linux驱动开发;
⑤大型项目实践:每期安排各类型真实的项目,详细可以点我下载资料。
互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。
想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。
祝你学有所成,望采纳。
B. 嵌入式开发如何入门
嵌入式开发主要有两种,像STM32、飞思卡尔等系列单片机属于无操作系统的,直接对寄存器或者利用库函数操作的,这种学习来难度相对小一些,就业前景也不错。
还有一些像ARM9,或者CortexA8、A9系列的可以运行Linux或者安卓操作系统的嵌入式软件系统开发,由于需要学习的内容较多,学习时间较长,那么学习起来就有一定的难度,工资也相对高一些。
课程内容主要包括:
①C,Java核心编程:c语言核心编程,Java核心编程;
②Linux核心操作与算法:Linux系统使用,Linux-c编程核心技术,精品数据结构,Linux-c编程精髓;
③核心操作与算法:Linux系统编程,Linux网络编程核心技术,UI编程,Java核心编程,安卓核心技术;
④ARM+Linux底层开发:数字电路,ARM编程核心,Linux系统开发,嵌入式Linux驱动开发;
⑤大型项目实践:每期安排各类型真实的项目,详细可以找我要资料。
互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。
想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。
祝你学有所成,望采纳。
C. 跪求一份完整的嵌入式Linux方面的C项目实例
怎样的人适合学习嵌入式?
学习嵌入式需要有一定的基础,这些基础大概包括下面两点:
学过c语言,汇编;
对微控制器有一定了解。
一般理工类(计算机,自动化,电子类专业)的学生大三学比较合适。因为到了大三,一般学过了c语言及汇编,虽然大部分学生没有独立写过一个程序,但至少上过这门课,自己也看过相关知识点;而且上过8051等微控制器原理的课程,也看过类似的教课书。
具备以上基础的人,也不是谁都可以学。因为嵌入式学习门槛比较高,难度比较大,不但要有一定的毅力,而且要触类旁通,如果太死板也很难学会。
概括的说学习嵌入式还必备下列性格:
热爱研发!
切忌浮躁!
执着,顽强,自信!
举一反三!
如果你符合以上条件,完全可以经过努力把嵌入式学好,我了解到的在华清远见学习的一个同学,之前基本上什么基础都没有,写一个“hello world”程序都为难,编译了几次才通过,但是经过四个月的努力,在华清远见专业老师和同学们的热心帮助下,从一个完全的菜鸟变成了入门级别的linux工程师了,找到了一份做应用开发的工作,工资大概有四千吧,还算不错。
LZ要自学的话,可以多到华清远见的网站上看看他们的课程设置,就知道自己该学些什么,还有很多学习资料和视频可以下载,另外华清远见出版的40多本嵌入式专业畅销书,外面各大书店和图书馆都有,你都可以去翻翻看看。
祝你早日学有所成!
请参考,希望能帮到你。
D. 该怎样学习嵌入式Linux的基础课程
嵌入式Linux操作系统学习规划
ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:
(1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
(2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定)
(3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。
从事嵌入式软件开发的好处是:
(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。
(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
(4)兴趣所在,这是最主要的。
从事嵌入式软件开发的缺点是:
(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
(2)这方面的企业数量要远少于企业计算类企业。
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
(4)平台依托强,换平台比较辛苦。
兴趣的由来:
1、成功观念不同,不虚度此生,就是我的成功。
2、喜欢思考,挑战逻辑思维。
3、喜欢C
C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下:
相信程序员。
不要阻止程序员做那些需要去做的。
保持语言短小精干。
一种方法做一个操作。
使得它运行的够快,尽管它并不能保证将是可移植的。
4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。
5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。
方法步骤:
1、基础知识:
目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。
科目:数字电路、计算机组成原理、嵌入式微处理器结构。
汇编语言、C/C++、编译原理、离散数学。
数据结构和算法、操作系统、软件工程、网络、数据库。
方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。
主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。
2、学习linux:
目的:深入掌握linux系统。
方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。
3、学习嵌入式linux:
目的:掌握嵌入式处理器其及系统。
方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
(2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
(3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。
主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。
4、深入学习:
A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
2010-8-21 16:46 回复
122.90.173.* 2楼
C、网络与信息安全技术:如加密技术,数字证书CA等。
D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。
说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。
注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。
不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的!
技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。
嵌入式书籍推荐
Linux基础
1、《Linux与Unix Shell 编程指南》
C语言基础
1、《C Primer Plus,5th Edition》【美】Stephen Prata着
2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux应用程序开发详解》
Linux内核
1、《深入理解Linux内核》(第三版)
2、《Linux内核源代码情景分析》毛德操 胡希明着
研发方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP详解》
3、《Linux内核编程》
4、《Linux设备驱动开发》(LDD)
5、《Linux高级程序设计》 杨宗德着
硬件基础
1、《ARM体系结构与编程》杜春雷着
2、S3C2410 Datasheet
英语基础
1、《计算机与通信专业英语》
系统教程
1、《嵌入式系统――体系结构、编程与设计》
2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着
3、《Building Embedded Linux Systems》
4、《嵌入式ARM系统原理与实例开发》 杨宗德着
理论基础
1、《算法导论》
2、《数据结构(C语言版)》
3、《计算机组织与体系结构?性能分析》
4、《深入理解计算机系统》【美】Randal E. Bryant David O''Hallaron着
5、《操作系统:精髓与设计原理》
6、《编译原理》
7、《数据通信与计算机网络》
8、《数据压缩原理与应用》
C语言书籍推荐
1. The C programming language 《C程序设计语言》
2. Pointers on C 《C和指针》
3. C traps and pitfalls 《C陷阱与缺陷》
4. Expert C Lanuage 《专家C编程》
5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs
《编程精粹--Microsoft 编写优质无错C程序秘诀》
6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》
7.《C语言嵌入式系统编程修炼》
8.《高质量C++/C编程指南》林锐
尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。
这里很多书其实是推荐而已,不必太在意,关键还是基础,才是重中之重!!!
这是从网络 福州鼎嵌贴吧看来的 呵呵
建议楼主自己去它那看看
http://tieba..com/f?kw=%E7%A6%8F%E5%B7%9E%E9%BC%8E%E5%B5%8C&fr=tb0_search&ie=utf-8
E. 嵌入式系统自学
嵌入式系统软件工程 方法实用技术及应用,免费下载
链接:https://pan..com/s/10No3IypKyLg01bV4T9b22w
《嵌入式系统软件工程:基础知识、方法和应用》系统地阐述嵌入式系统软件工程所涉及的过程、方法、内容,以及在典型工业领域中的应用。全书内容分为两大部分:第一部分介绍嵌入式系统软件工程方法论,主要包括嵌入式软件的开发过程(需求工程、软件和系统体系结构、编程和测试等内容),开发和测试中所采用的标准,与安全性相关的软件系统的准入,以及嵌入式软件所涉及的法律问题:第二部分介绍嵌入式系统软件在汽车领域、轨道交通领域、航天领域、医疗器械、工业自动化、通信系统中的应用,在每个应用领域重点介绍具体应用领域的一些特定需求、技术和限制条件,以及它们对于嵌入式系统软件开发过程的影响。
F. 嵌入式方向要学习什么课程
所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。我们说的单片机不使用操作系统,但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业,日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:
下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。
从上图可以知道:
组成:嵌入式Linux系统= bootloader + linux内核 + 根文件系统(里面含有APP)。
bootloader:它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。
Linux内核:Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。
不仅如此,Linux内核还有进程调度能力、内存管理等功能。
所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。
Bootloader有很多种,常用的叫u-boot。
在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。
花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。
所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。
如果你的工作就是修改、完善bootloader,那么再去研究它吧。
之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。
但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。
作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。
所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
LED驱动程序:这是最简单的驱动程序。
按键驱动程序:它也比较简单,从它引入“中断”。
中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。
所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。
入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。
摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。
要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:
基本设备的访问,比如LCD、输入设备
进程、线程、进程通信、线程同步与互斥
休眠-唤醒、POLL机制、信号
网络编程
①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。
掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。
你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?
你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?
怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?
这些都需要我们了解一下根文件系统。
先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。
了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。
嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。
嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。
比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。
不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?
比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。
甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去网络一下这些命令就可以了。
不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。
视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,
每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。
记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。
但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。
有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。
我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。
如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。
比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。
当你想从事某个行业时,就需要深入研究行业相关的知识。
比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。
想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。
每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。
G. 嵌入式软件开发要学什么要学哪些东西
学习嵌入式软件开发应该从学习单片机开始,单片机是一切嵌入式的基础,最早的嵌入式系统就是以单片机为核心的,随着技术的进步和发展,才逐步发展到现在的DSP、ARM为核心的等高端高速控制系统。单片机是基础,同时也是现在较大系统不可分割的组成部分,比如汽车,主控系统是ARM,但各个子系统仍然是单片机完成的。所以一个出色的嵌入式软件工程师,必须具备单片机的知识,这样才能在实际工作中把控一切,应用自如。
H. 嵌入式新手入门最佳视频教程
原文链接:网页链接
我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的经历、当下的学习,在未来的一天肯定会影响到你。毕业后我们也各自找到了自己的职业:出国深造转行做金融、留校任教做科研、设计芯片、写程序、创办公司等等,这一切都离不开在校时学到的基础技能(数学、IT、电子电路)、受过煅炼的自学能力。
所以,各位正在迷茫的在校生,各位正在尝试转行的程序员,未来一定有你的位置,是好是坏取决于你当下的努力与积累。
我不能预言几年后什么行业会热门,也不能保证你照着本文学习可以发财。我只是一个有十几年经验的程序员,给对编程有兴趣的你,提供一些建议。
程序员的方向,一般可以分为3类:专业领域、业务领域、操作系统领域。你了解它们后,按兴趣选择吧。
对于专业领域,我提供不了建议。
业务,也就是应用程序,它跟操作系统并不是截然分开的:
①开发实体产品时,应用程序写得好的人,有时候需要操作系统的知识,比如调度优先级的设置、知道某些函数可能会令进程休眠。
②写应用程序的人进阶为系统工程师时,他需要从上到下都了解,这时候就需要有操作系统领域的知识了,否则,你怎么设计整个系统的方案呢?
③做应用程序的人,需要了解行业的需求,理解业务的逻辑。所以,当领导的人,多是做应用的。一旦钻入了某个行业,很难换行业。
④而操作系统领域,做好了这是通杀各行业:他只负责底层系统,在上面开发什么业务跟他没关系。这行很多是技术宅,行业专家。
⑤操作系统和业务之间并没有一个界线。有操作系统经验,再去做应用,你会对系统知根知底,碰到问题时都有解决思路。有了业务经验,你再了解一下操作系统,很快就可以组成一个团队自立门户,至少做个CTO没问题。
它又可以分为下面2类。
1.1.1 学术研究
比如语音、图像处理、人工智能,这类工作需要你有比较强的理论知识,我倾向于认为这类人是“科学家”,他们钻研多年,很多时候是在做学术研究。
在嵌入式领域,需要把他们的成果用某种算法表达出来,针对某种芯片进行优化,这部分工作也许有专人来做。
1.1.2 工程实现
也有这样一类人,他们懂得这些专业领域的概念,但是没有深入钻研。可以使用各类开源资料实现某个目标,做出产品。比如图像处理,他懂得用opencv里几百个复杂函数来实现头像识别。有时候还可以根据具体芯片来优化这些函数。
“专业领域”不是我的菜,如果你要做这一块,我想最好的入门方法是在学校学习研究生、博士课程。
换句话说,就是应用程序,这又可以分为下面2类。
1.2.1 界面显示
做产品当然需要好的界面,但是,不是说它不重要,是没什么发展后劲。
现在的热门词是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,职位要求里肯定其他要求。
1.2.2 业务逻辑
举个简单例子,做一个打卡软件,你需要考虑这些东西:
①正常流程是上班下班时都要打卡
②有人忘记了怎么办?作为异常记录在案,推送给管理员
③请假时怎么处理?
④加班怎么处理?
对于更复杂的例子,视频会议系统里,各个模块怎么对接,各类协议怎么兼容,你不深入这个行业,你根本搞不清楚。
应用开发的职位永远是最多的,入门门槛也低。基本上只要你会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系统包含哪些东西?不要急,举一个例子你就知道了。
①电脑一开机,那些界面是谁显示的?
是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核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。
③其他好书还有很多,我没怎么看,没有更多建议
基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习。
假设您是零基础,我们规划了如下入门路线图。前面的知识,是后面知识的基础,建议按顺序学习。每一部分,不一定需要学得很深入透彻,下面分章节描述。
2.2.1 C语言
只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的,一上机就傻了,我怀疑他们都没在电脑上写过程序。
理论再好,没有实践不能干活的话,公司招你去干嘛?
反过来,实践出真知,学习C语言,必须练练练、写写写!
当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;
当你写过几个C程序后,就可以进入下一阶段的裸机开发了。
①不需要太深入
作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法操作,暂时就够了。
指针操作是重点,多练习;
不需要去学习过多的数据结构知识,只需要掌握链表操作,其他不用学习,比如:队列、二叉树等等都不用学;不需要去学习任何的函数使用,比如文件操作、多线程编程、网络编程等等;这些知识,在编写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 : 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后练习。
2.2.3 硬件知识
我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。
对于正统的方法,你应该这样学习:
①学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。
②学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。
③《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。
就我个人经验来说,这些课程是有用的,但是:
①原理有用,实战性不强。
比如《微机原理》是基于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
即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。
这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。
2.2.4 要不要专门学习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
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应用开发完全手册》。后者也许是国内第1本涉及在PC Linux环境下开发的ARM裸机程序的书,如果我说错了,请原谅我书读得少。
对于裸机开发,我们提供有2部分视频:
①环境搭建
第0课第1节_刚接触开发板之接口接线.wmv
第0课第2节_刚接触开发板之烧写裸板程序.wmv
第0课第3节_刚接触开发板之重烧整个系统.wmv
第0课第4节_刚接触开发板之使用vmwae和预先做好的ubuntu.wmv
第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
.................
原文链接:网页链接