arm嵌入式系统开发发,求大神解答!修改图片中的内容

嵌入式学习?
本人大四学生,专业为电气类的,有C语言,单片机,模电,数电的基础,一直想从事嵌入式方面的工作(感兴趣),但是以目前的水平,暂时还不能找到这方面的工作,所以一直在纠结是先找份本专业的工作做着,又或者是到培训机构培训,然后找份嵌入式方面的工作,希望大家能指点一二。另:嵌入式学习需要哪方面的基础知识,培训四个月的时间努力学习大概能达到什么样的水平
现已整理出教程,详见:1.先看:搞懂嵌入式软件方面的知识。2.如果打算做驱动方面的开发,那么再去看:3.如果是和Linux有关的嵌入式,则再去看:4.如果和Linux驱动有关,再去看:========================================目前对于嵌入式培训的质量,不是很清楚。但是根据个人的了解,貌似质量高的不多。所以,鉴于你的基础,推荐你:先找自己专业的工作,有了相对稳定的生存的基础了。然后再抽时间,自己学习嵌入式。关于自学嵌入式的话,需要具备哪些基础,如何循序渐进的学习嵌入式等方面的问题,说实话,很难几句说清楚。但是,我会尽量说的让你能看懂:【如何学习嵌入式】基于此,我也是正在,一点点的完善我要写的,关于如何学习嵌入式的教程。主体思路,和目前已经写了的部分的内容,如下:1.说清楚整体嵌入式行业的概况,应用领域,举例说明。2.然后通过一些典型的你所能接触到的产品,去说明嵌入式行业领域的产业链。3.然后你才能搞清楚,你作为嵌入式软件开发者,所处的位置。4.然后你才知道,你需要做大概哪些方面的软件工作,以及和其他产业链和合作人员的关系。5.搞清楚所处大环境的位置,才是去如何搞嵌入式软件开发。相关内容:6.才是介绍需要大概哪方面的基础知识相关内容:7.然后才是,对于典型的一些嵌入式软件开发,是如何搭建开发环境,如何一点点开发。相关参考:(1)之前遇到的一本,解释的大而全的,嵌入式开发方面的书籍:此书算是说的不错了,不过是英文的。如果英文还行,建议多看看,即使看不全懂,也可以看看其大概框架,以便对于嵌入式开发有个概念。(2)(3)8.然后才是解释具体的某个领域开发的真正的逻辑和流程,比如嵌入式linux驱动如何写,等等。相关参考:(1)(2)之前给别人推荐的这本书:总之:目前:上述的部分的帖子,部分的推荐书籍,你凑合先看吧。以后:关于嵌入式开发方面的,从逻辑概念到实际动手操作,以后我会抽空去完善出全套的教程的,去详细解释的方方面面的事情的。到时候,再看我的教程,就会很清楚了。【其他一些嵌入式相关的内容】1.解释了一些嵌入式领域内常会遇到的基本概念:2.总结了些经验:3.上次给另外一个人回答了类似的问题,你也可以参考参考:【最后】我一直正在陆陆续续的写嵌入式方面的内容,如果写好了,都会发布到我自己的个人网站上面对应的嵌入式分类中的:换句话说,如果感兴趣,可以时不时的去看看,可能就会看到我更新的一些,关于嵌入式方面的帖子。其中,可能有些是嵌入式领域教程方面的介绍的内容,有些可能是具体某个嵌入式知识点方面的内容。你捡你感兴趣的看,即可。
花了一张图,厚着脸皮贴一把,以后我会将各个技能树的学习顺序与参考学习资料整理一下:
占坑先。-------------------------------------------------------------------第一次修改咯。不请自来。做电赛出身的程序猿一名,目前从事嵌入式Linux驱动开发。还有单片机从51到意法Ti都做过,DSP只用过TI的,主要是在开关电源控制方面的应用。建议学习路线:1 学习51单片机,这个阶段你只需要跟着郭天翔的视频去学,只要求实现功能,不求甚解。但建议能够提出问题,比如“为什么往IO控制寄存器写入特定值能点亮LED灯?”“IO口的电路结构是什么样子的?”“什么是上拉下啦,灌电流拉电流?”,这一阶段主要是熟悉单片机的使用,并且在使用中思考发现问题,还能熟悉一些基本概念。2 开始查资料看书,看模拟电路数字电路等等,开始去弄明白1中所提出的问题。这时候问题主要集中在电路方面。3 开始学习STM32,随便买个板子,看原子的书跟着一步步去做。这时候你会遇到很多计算机方面的问题,这时候一边学习教程,一边学习:微机原理,编译原理,操作系统。你要弄清楚ARM架构,弄明白CPU如何取指,译码,执行,知道地址总线,控制总线,数据总线如何工作。要弄明白你编译各个阶段产生的各个文件是什么,什么是分散加载,什么是重定位,什么是代码段,什么是数据段,等等。还要能弄明白CPU如何启动,程序镜像在内存中如何布局。要知道中断的原理,以及现场保护等等。最后你了解了各个知识点之后,转向GCC开发STM32,这时候你如果知识掌握得不错,你应该可以很快地学会编写链接器脚本并且明白每一条语句所代表的含义。4 开始增强C语言,深入挖掘C语言的各个死角。最好可以做到当你写下一条语句的时候知道编译器会如何处理。还需要数据结构和软件工程,建议最好还要学习一下设计模式。开始学习养成良好的代码风格,开始思考代码的结构。可以说设计模式如果能学好,在往后学习LINUX内核时大有裨益。你会发现LINUX的输入子系统有点像职责链模式,会发现ASOC音频系统有点像模板方法模式。私以为,如果能在两个以上不同方面考察同一种编程思想,你会得到更加深刻的理解,更能领会其精华。5 认真研读OS方面的书,各个知识点都要弄明白,进程是什么程序是什么线程是什么,竞争死锁优先级反转,虚拟地址空间物理地址空间,用户空间内核空间等等。开始学习ucos,这个没什么可说的,如果在2中能熟练掌握各种知识点,知道CPU如何中断如何保护恢复现场,那么读ucos的源码时候,在原理上就不会有什么疑惑。如果能在4中养成把握代码整体结构的能力并且学习好数据结构和基本的算法,读源码就没有什么障碍。一旦原理弄通了,源码也能读懂,那么吃透ucos就是顺理成章的事情。6 自己仿照ucos写一个stm32上的实时os出来。7 进军LINUX。学习LINUX的基本使用,看赵炯那本内核剖析,啃LINUX内核设计与实现,把握总体的内核架构。之后可以学习驱动,看建议陈学松老师的书,弄明白基本的驱动架构和如何编写简单的驱动,认真对待,这里强调一下设备驱动模型。最后啃LINUX内核源码情景分析,上下两册用心读,这里着重强调一下内核中的VFS部分。之后就是看宋宝华老师的书,进一步学习驱动开发。最后。。。。。。。看内核源码看内核源码看内核源码。8 其它的什么SPI,IIC,什么DMA,都只是技能问题,只要知识学的好,技能想咋点就咋点。9 暂时没想到其它的了。想到再说
欢迎大家来到微信订阅号:【 嵌入式资讯精选(mcuworld)】
《学习天地》栏目!关注资料后持续更新!我们为诸位整理了不少宝贵资料,包括嵌入式系统软硬件教程、最新的创客实际应用案例、电子电路板画图软件等等,而且会不断更新和完善哦!欢迎大家踊跃留言,说说你感兴趣的资料,以及对这个栏目的意见和建议,以便我们更好地为大家服务^_^资料分类(由于字数限制,下方仅列出前6项资料分类,7-10请关注:mcuworld后阅读)1 单片机2 微控制器3 嵌入式软件资料4 调试工具及软件下载5
DSP7 专业电子电路绘图软件及教程8 有意思的创客资料9 电子电路基础知识10 专业嵌入式书籍及资料拷贝相关连接到浏览器,即可下载~1单片机1.1
51单片机单片机资料大放送(3.27G百度网盘下载)-不看绝对后悔51单片机驱动SD卡 3小时玩转SD卡视频教程零基础送源代码51单片机教程(从原理开始基于汇编) 51单片机基础知识 51单片机应用实例 51单片机学习资料 51单片机开发板资料单片机设计实例 MCU综合技术区 1.2
PIC单片机PIC150单片机编程器资料[郭天祥]十天学会PIC单片机1.3
MSP430单片机MSP430资料1.4
AVR单片机AVR单片机教学视频 2微控制器2.1
ARMCortexM3/M0/M4开发 ARM开发者论坛(ARM CM0、ARM7、ARM9) ARM嵌入式开发入门必要步骤 2.2
STM32SMT32资料STM32 李想 49集视频讲解下载(包括原理图,源代码) 2.3AVR32 3 嵌入式软件资料3.1
C语言单片机C语言教程 C语言程序设计C语言入门 C语言教程 C语言函数 C语言程序 C语言心得技巧 3.2汇编语言汇编语言源码 3.3
Linux韩顺平.Linux视频教程Linux
ARM移植教程 Linux教程 3.4
AndroidAndroid深入浅出视频教程在线观看 轻松几步学Android 从零开始学android 轻松学android开发 Android开发视频教程35集 安卓系统自学教程视频 3.5
C++《高质量C++/C 编程指南》,林锐博士编著。值得一看! 3.6
JAVAJAVA编程 3.7
MATALABMATLAB资料应用 3.8
VBVB编程3.9
VCVC编程 4调试工具及软件下载4.1 Keil教程及下载Keil教程及下载 单片机集成开发环境
IAR forMSP430 V5.20 51单片机调试工具与软件 4.2 uClinux/Linux
uCLinux/Linux 5
ALTERAALTERA技术讨论区
XILINXXILINX技术讨论区 6
DSPDSP理论与算法
C6000单核DSP MATLAB与DSP 关注后,资料会持续更新!欢迎扫码来阅读更多资讯!
这是我在一个社区里面看到的,有教程,有实践,还有思考,非常不错的说【图书分享之十四】【图书分享之十三】【图书分享之十二】【图书分享之十一】【图书分享之十】【图书分享之九】【图书分享之八】【图书分享之七】【图书分享之六】【图书分享之五】【图书分享之四】【图书分享之三】【图书分享之二】【图书分享之一】图书继续分享更新中....欢迎大家下载!下面推荐arm+linux相关书【24日更新中...】:【图书分享之一】【图书分享之二】【图书分享之三】【图书分享之四】【图书分享之五】【图书分享之六】【图书分享之七】【图书分享之八】【图书分享之九】【图书分享之十】【图书分享之十一】【图书分享之十二】【图书分享之十三】【图书分享之十四】
嵌入式Linux+Android学习路线图作者:韦东山微博:韦东山公司微博:百问科技写于 ,第1版本,Android部分未写本文目录1. 程序员的三大方向 1.1 专业领域 1.1.1 学术研究 1.1.2 工程实现 1.2 业务领域 1.2.1 界面显示 1.2.2 业务逻辑 1.3 操作系统领域 1.4 嵌入式Linux+Android系统包含哪些内容 2. 怎么学习嵌入式Linux操作系统 2.1 入门路线图 2.2 学习驱动程序之前的基础知识 2.2.1 C语言 2.2.2 PC Linux基本操作: 2.2.3 硬件知识 2.2.4 要不要专门学习Windows下的单片机开发 2.2.5 为什么选择ARM9 S3C2440开发板,而不是其他性能更好的? 2.2.6 怎么学习ARM+Linux的裸机开发 2.2.7 bootloader的学习 2.2.8 Linux内核的学习 2.2.9 根文件系统 2.3 驱动程序的学习 2.3.1 经典字符设备驱动程序 2.3.2 工作中各类驱动程序 2.3.3 调试方法 2.4 Linux应用程序的学习 3. 怎么学习整个Android系统 我是1999年上的大学,物理专业。在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么。你当下的经历、当下的学习,在未来的一天肯定会影响到你。毕业后我们也各自找到了自己的职业:出国深造转行做金融、留校任教做科研、设计芯片、写程序、创办公司等等,这一切都离不开在校时学到的基础技能(数学、IT、电子电路)、受过煅炼的自学能力。所以,各位正在迷茫的在校生,各位正在尝试转行的程序员,未来一定有你的位置,是好是坏取决于你当下的努力与积累。我不能预言几年后什么行业会热门,也不能保证你照着本文学习可以发财。我只是一个有十几年经验的程序员,给对编程有兴趣的你,提供一些建议。1. 程序员的三大方向程序员的方向,一般可以分为3类:专业领域、业务领域、操作系统领域。你了解它们后,按兴趣选择吧。对于专业领域,我提供不了建议。业务,也就是应用程序,它跟操作系统并不是截然分开的:① 开发实体产品时,应用程序写得好的人,有时候需要操作系统的知识,比如调度优先级的设置、知道某些函数可能会令进程休眠。② 写应用程序的人进阶为系统工程师时,他需要从上到下都了解,这时候就需要有操作系统领域的知识了,否则,你怎么设计整个系统的方案呢?③ 做应用程序的人,需要了解行业的需求,理解业务的逻辑。所以,当领导的人,多是做应用的。一旦钻入了某个行业,很难换行业。④ 而操作系统领域,做好了这是通杀各行业:他只负责底层系统,在上面开发什么业务跟他没关系。这行很多是技术宅,行业专家。⑤ 操作系统和业务之间并没有一个界线。有操作系统经验,再去做应用,你会对系统知根知底,碰到问题时都有解决思路。有了业务经验,你再了解一下操作系统,很快就可以组成一个团队自立门户,至少做个CTO没问题。1.1 专业领域它又可以分为下面2类。1.1.1 学术研究比如语音、图像处理、人工智能,这类工作需要你有比较强的理论知识,我倾向于认为这类人是“科学家”,他们钻研多年,很多时候是在做学术研究。在嵌入式领域,需要把他们的成果用某种算法表达出来,针对某种芯片进行优化,这部分工作也许有专人来做。1.1.2 工程实现也有这样一类人,他们懂得这些专业领域的概念,但是没有深入钻研。可以使用各类开源资料实现某个目标,做出产品。比如图像处理,他懂得用opencv里几百个复杂函数来实现头像识别。有时候还可以根据具体芯片来优化这些函数。“专业领域”不是我的菜,如果你要做这一块,我想最好的入门方法是在学校学习研究生、博士课程。1.2 业务领域换句话说,就是应用程序,这又可以分为下面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的需求永远是最大的,现在这两门技术还算热门。在年左右,Android程序员的起薪挺高,然后开始下滑。Android APP的入门基本只要1个月,所以懂的人也越来越多。年,IOS开发的工资明显比Android高了,于是各类IOS培训也火曝起来。中华大地向来不缺速成人才,估计再过一阵子IOS工程师也是白菜价了。会Android、IOS只是基本要求,不信去51job搜搜Android或IOS,职位要求里肯定其他要求。1.2.2 业务逻辑举个简单例子,做一个打卡软件,你需要考虑这些东西:① 正常流程是上班下班时都要打卡② 有人忘记了怎么办?作为异常记录在案,推送给管理员③ 请假时怎么处理?④ 加班怎么处理?对于更复杂的例子,视频会议系统里,各个模块怎么对接,各类协议怎么兼容,你不深入这个行业,你根本搞不清楚。应用开发的职位永远是最多的,入门门槛也低。基本上只要你会C语言,面试时表现比较得体,一般公司都会给你机会。因为:① 你进公司后,还需要重新培训你:熟悉它们的业务逻辑。② 你要做的,基本也就是一个个模块,框架都有人给你定好了,你去填代码就可以了。说点让你高兴的事:软件公司里,做领导的基本都是写应用程序的(当然还有做市场的)。写应用程序的人,对外可以研究市场接待客户,对内可以管理程序员完成开发,不让他做领导让谁做?如果你的志向是写应用程序,那么我建议你先练好基本功:数据结构、算法是必备,然后凭兴趣选择数据库、网络编程等等进行深入钻研。最后,选择你看好的、感兴趣的行业深耕个10年吧。做应用开发的人选择了某个行业,后面是很难换行业的,选行很重要!1.3 操作系统领域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系统。1.4 嵌入式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核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。③ 其他好书还有很多,我没怎么看,没有更多建议基于快速入门,上手工作的目的,您先不用看上面的书,先按本文学习。2.2 学习驱动程序之前的基础知识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 // 创建文件夹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 192.168.1.123:/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后练习。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打基础:掌握了各种硬件操作后,后面一组合就是一个bootloader2.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② 裸机程序开发第1课 环境搭建及工具、概念介绍.wmv第2课 GPIO实验.wmv第3课 存储管理器实验.wmv第4课 MMU实验.wmv第5课 NAND FLASH控制器.wmv第6课 中断控制器.wmv第7课 系统时钟和UART实验.wmv第8课 LCD实验.wmv要声明的是:录制上述《裸机程序开发》视频时,本意是结合《嵌入式Linux应用开发完全手册》的《第2篇 ARM9嵌入式系统基础实例篇》来讲解,所以视频里没有完全从零编写代码,需要结合书本来学习。① 书和视频并不是完全配套的,不要照搬,其中的差异并不难解决。《嵌入式Linux应用开发完全手册》发表于2008年,使用了很多款开发板,并且那时的开发板配置较低(Nand Flash是64M);《裸机程序开发》视频使用JZ2440开发板录制。② 书和视频,适用于所有S3C2440开发板,包括mini2440、tq2440等天下S3C2440配置都是相似的,基本也就是LED、按键所用引脚不同,LCD型号不同;你学习了书、视频,如果连这些差异都搞不定的话,那就是你我的失败了。学习方法是这样的:① 先看《环境搭建》视频来搭建开发环境② 书(第2篇)和视频(裸机程序开发)结合,看完一章,练习一章一定要编写代码,即使是照抄也要写。③ 如果对于ARM架构相关的知识,觉得模糊或是想了解得更深入,参考《ARM体系结构与编程》学习程度:① 理解一个裸机程序的必要结构:异常向量、硬件初始化、代码重定位、栈② 知道如何操作GPIO、Flash、LCD、触摸屏等硬件③ 很多人觉得MMU难以理解,可以放过它2.2.7 bootloader的学习bootloader有很多种,vivi、u-boot等等,最常用的是u-boot。u-boot功能强大、源码比较多,对于编程经验不丰富、阅读代码经验不丰富的人,一开始可能会觉得难以掌握。但是,u-boot的主要功能就是:启动内核。它涉及:读取内核到内存、设置启动参数、启动内核。按照这个主线,我们尝试自己从零编写一个bootloader,这个程序相对简单,可以让我们快速理解u-boot主要功能的实现。从零编写bootloader的视频有:毕业班第1课第1.1节_自己写bootloader之编写第1阶段.wmv毕业班第1课第1.2节_自己写bootloader之编写第2阶段.wmv毕业班第1课第2节_自己写bootloader之编译测试.wmv毕业班第1课第3节_自己写bootloader之改进.wmv分析u-boot 1.1.6的视频有:第9课第1节 u-boot分析之编译体验.wmv第9课第2节 u-boot分析之Makefile结构分析.wmv第9课第3节 u-boot分析之源码第1阶段.wmv第9课第3节 u-boot分析之源码第2阶段.wmv第9课第4节 u-boot分析之u-boot命令实现.wmv第9课第5节 u-boot分析_uboot启动内核.wmv移植一个全新u-boot的视频有:毕业班第2课第1节_移植最新u-boot之初试.wmv毕业班第2课第2.1节_移植最新u-boot之分析启动过程之概述.wmv毕业班第2课第2.2节_移植最新u-boot之分析启动过程之内存分布.wmv毕业班第2课第2.3节_移植最新u-boot之分析启动过程之重定位.wmv毕业班第2课第3.1节_移植最新u-boot之修改代码之建新板_时钟_SDRAM_UART.wmv毕业班第2课第3.2节_移植最新u-boot之修改代码支持NAND启动.wmv毕业班第2课第3.3节_移植最新u-boot之修改代码支持NorFlash.wmv毕业班第2课第3.4节_移植最新u-boot之修改代码支持NandFlash.wmv毕业班第2课第3.5节_移植最新u-boot之修改代码支持DM9000网卡.wmv毕业班第2课第4.1节_移植最新u-boot之裁剪和修改默认参数.wmv毕业班第2课第4.2节_移植最新u-boot支持烧写yaffs映象及制作补丁.wmv《嵌入式Linux应用开发完全手册》上对u-boot的讲解有如下章节:15.1 Bootloader简介15.1.1 Bootloader的概念15.1.2 Bootloader的结构和启动过程15.1.3 常用Bootloader介绍15.2 U-Boot分析与移植15.2.1 U-Boot工程简介15.2.2 U-Boot源码结构15.2.3 U-Boot的配置、编译、连接过程15.2.4 U-Boot的启动过程源码分析15.2.5 U-Boot的移植15.2.6 U-Boot的常用命令15.2.7 使用U-Boot来执行程序学习方法如下:① 先学习《从零编写bootloader的视频》,这可以从最少的代码理解bootloader的主要功能② 再看书上对u-boot的讲解,并结合《分析u-boot 1.1.6的视频》来理解③ 最后,有时间有兴趣的话,看《移植一个全新u-boot的视频》,这不是必须的。学习程度:① 理解u-boot的启动过程,特别是u-boot代码重定位:怎么从Flash上把自己读入内存② 理解u-boot的核心:命令③ 知道bootloader如何给内核传递参数④ 知道bootloader是根据“bootcmd”指定的命令启动内核⑤ 作为入门:只求理解,不要求能移植u-boot2.2.8 Linux内核的学习前面说过,内核本身不是我们学习的重点,但是了解一下内核的启动过程,还是很有必要的:工作中有可能要修改内核以适配硬件,掌握了启动过程才知道去修改哪些文件。分析内核的视频有:第10课第1节 内核启动流程分析之编译体验.wmv第10课第2节 内核启动流程分析之配置.wmv第10课第3节 内核启动流程分析之Makefile.wmv第10课第4节 内核启动流程分析之内核启动.wmv移植内核的视频有:业班第3课第1节_移植3.4.2内核之框架介绍及简单修改.wmv毕业班第3课第2节_移植3.4.2内核之修改分区及制作根文件系统.wmv毕业班第3课第3节_移植3.4.2内核之支持yaffs文件系统.wmv毕业班第3课第4节_移植3.4.2内核之裁剪及ECC简介及制作补丁.wmv《嵌入式Linux应用开发完全手册》上对内核的讲解有如下章节:16.1 Linux版本及特点16.2 Linux移植准备16.2.1 获取内核源码16.2.2 内核源码结构及Makefile分析16.2.3 内核的Kconfig分析16.2.4 Linux内核配置选项16.3 Linux内核移植16.3.1 Linux内核启动过程概述16.3.2 修改内核以支持S3C0开发板16.3.3 修改MTD分区16.3.4 移植YAFFS文件系统16.3.5 编译、烧写、启动内核学习方法如下:① 先看书,并结合《分析内核的视频》进行理解② 如果有兴趣,再根据《移植内核的视频》自己掌握移植内核,这不是必须的学习程度:① 知道机器ID的作用,根据机器ID找到单板对应的文件② 知道Makefile、Kconfig的作用,知道怎么简单地配置内核③ 知道怎么修改分区④ 作为入门:只求理解,不要求能移植2.2.9 根文件系统在驱动程序开发阶段,我们喜欢搭建一个最小根文件系统来调试驱动;在开发应用程序时,也需要搭建文件系统,把各种库、配置文件放进去;在发布产品时,你还需要修改配置文件,使得产品可以自动运行程序;甚至你想实现插上U盘后自动启动某个程序,这也要要修改配置文件;这一切,都需要你理解根文件系统的构成,理解内核启动后是根据什么配置文件来启动哪些应用程序。分析根文件系统的视频有:第11课第1节 构建根文件系统之启动第1个程序.wmv第11课第2节 构建根文件系统之init进程分析.wmv第11课第3节 构建根文件系统之busybox.wmv第11课第4节 构建根文件系统之构建根文件系统.wmv《嵌入式Linux应用开发完全手册》上对文件系统的讲解有如下章节:17.1 Linux文件系统概述17.1.1 Linux文件系统的特点17.1.2 Linux根文件系统目录结构17.1.3 Linux文件属性介绍17.2 移植Busybox17.2.1 Busybox概述17.2.2 init进程介绍及用户程序启动过程17.2.3 编译/安装Busybox17.3 使用glibc库17.3.1 glibc库的组成17.3.2 安装glibc库17.4 构建根文件系统17.4.1 构建etc目录17.4.2 构建dev目录17.4.3 构建其他目录17.4.4 制作/使用yaffs文件系统映象文件17.4.5 制作/使用jffs2文件系统映象文件学习方法:结合书和视频学习。学习程序:① 理解配置文件的作用② 知道根文件系统中lib里的文件来自哪里③ 可以制作、烧写文件系统映象文件2.3 驱动程序的学习《嵌入式Linux应用开发完全手册》对驱动程序的讲解不多,我们推出的“韦东山Linux视频第2期_驱动现场编写调试”,可以认为完全脱离了书本。所以,驱动程序的学习完全按照视频来就可以了。第2期的视频,对每一个驱动,先讲解硬件原理,然后从零写代码,从简单到复杂,逐渐完善它的功能。我们不会罗列专业术语,会参考日常生活的例子,力争用最形象的比喻让你轻松入门,同时又会很深入。注意:我们可以让你入门时很轻松,但是要深入理解的话,这需要你跟着视频练习代码,这是个要慢慢思考的过程,不会轻松。轻松的话,凭什么拿高工资?再次申明:即使照抄也要写代码!很多人视频看得很高兴,但是写代码时就傻了。2.3.1 经典字符设备驱动程序视频中以LED、按键驱动为例,讲解并练习开发过程中碰到的机制:查询、休眠-唤醒、中断、异步通知、poll、同步、互斥等等。后续更复杂的驱动程序,就是在这些机制的基础上,根据硬件特性设计出精巧的软件框架。相关的视频有(文件名中带“_P”的属于第2期加密视频):第12课第1节 字符设备驱动程序之概念介绍.wmv第12课第2.1节 字符设备驱动程序之LED驱动程序_编写编译.wmv第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进.wmv第12课第2.3节 字符设备驱动程序之LED驱动程序_操作LED.wmv第12课第3节 字符设备驱动程序之查询方式的按键驱动程序.wmv第12课第4.1节 字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构.wmv第12课第4.2节 字符设备驱动程序之中断方式的按键驱动_Linux中断处理结构.wmv第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码.wmv第12课第5节 字符设备驱动程序之poll机制.wmv第12课第6节 字符设备驱动程序之异步通知.wmv第12课第7节 字符设备驱动程序之同步互斥阻塞.wmv第12课第8节 字符设备驱动程序之定时器防抖动_P.wmv第13课第1节 输入子系统概念介绍_P.wmv第13课第2节 输入子系统第编写驱动程序_P.wmv《嵌入式Linux应用开发完全手册》上对字符设备驱动程序的讲解有如下章节:第19章 字符设备驱动程序19.1 Linux驱动程序开发概述19.1.1 应用程序、库、内核、驱动程序的关系19.1.2 Linux驱动程序的分类和开发步骤19.1.3 驱动程序的加载和卸载19.2 字符设备驱动程序开发19.2.1 字符设备驱动程序中重要的数据结构和函数19.2.2 LED驱动程序源码分析第20章 Linux异常处理体系结构20.1 Linux异常处理体系结构概述20.1.1 Linux异常处理的层次结构20.1.2 常见的异常20.2 Linux中断处理体系结构20.2.1 中断处理体系结构的初始化20.2.2 用户注册中断处理函数的过程20.2.3 中断的处理过程20.2.4 卸载中断处理函数20.3 使用中断的驱动程序示例20.3.1 按键驱动程序源码分析20.3.2 测试程序情景分析学习方法:① 沿着数据流向,从应用程序的对驱动程序的使用进行情景分析。所谓情景分析,就是假设应用程序发起某个操作,你去分析其中的运作过程。比如应程序调用open、read、ioctl等操作时涉及驱动的哪些函数调用。你要思考一个问题:一个应用程序,怎么获得按键信息,怎么去控制LED。把其中数据的流向弄清楚了,对字符驱动程序也就基本理解了。② 学习异常和中断时,可以结合书和视频;对于驱动程序中其他内容的学习,可以不看书。2.3.2 工作中各类驱动程序我们的视频中讲解的驱动程序非常多,目的有二:① 在你工作中遇到同类驱动时提供借鉴② 供你学习、练习,煅炼阅读驱动程序的“语感”,提升编写程序的能力,增加调试经验我们还打算扩充驱动视频,把它打造成“Linux驱动程序大全”视频,基本上都会采取从零现场编写的方式。也许有人说:在工作中我们基本上只是移植、修改驱动而已,很少从头编写。这话没错,但是能修改的前提是理解;想更好地理解,最好的方法是从零写一个出来。在学习阶段,不要怕耗费太多时间,从零开始编写,慢慢完善它,在这过程中你既理解了这个驱动,也煅炼了能力,做到触类旁通。如果有时间,建议你学完这些所有的视频,直到你自认为:① 给你一个新板,你可以很快实现相关驱动② 给你一个新硬件,你可以很快给它编写/移植驱动。我们录制的视频很多,下面只罗列到“课”,不罗列到“节”。第2期视频:第14课 驱动程序分层分离概念_总线驱动设备模型第15课 LCD驱动程序第16课 触摸屏驱动程序第17课 USB驱动程序第18课 块设备驱动程序第19课 NAND FLASH驱动程序第20课 NOR FLASH驱动程序第21课 网卡驱动程序第22课 移植DM9000C驱动程序第23课 I2C设备裸板程序第24课 I2C驱动程序 (不看此课,看第32课,第32课讲得更好)第26课 声卡驱动程序 (不看此课,看第3期的ALSA驱动,那讲得更好)第27课 DMA驱动程序第28课 hotplug_uevent机制第32课 3.4.2内核下的I2C驱动程序第3期的驱动视频:摄像头驱动_虚拟驱动vivi摄像头驱动_USB摄像头摄像头驱动_CMOS摄像头WIFI网卡驱动程序移植3G网卡驱动程序移植ALSA声卡驱动程序学习方法:① 再次强调,不能光看不练:一定要写程序,即使照抄也得写② 必学:LCD、触摸屏、NAND Flash、Nor Flash、hotplug_uevent机制③ 学完之后,强烈建议换一个不同的开发板,尝试在新板上写驱动程序。按视频学习会一切顺利,很多问题你可能没想到、没想通,换一个新板会让你真正掌握。2.3.3 调试方法有一种说法,程序是三分写七分调,我们从操作系统的角度提供了一些很有用的调试方法。相关的视频有:第29课第1节_裸板调试之点灯法_P.wmv第29课第2节_裸板调试之串口打印及栈初步分析_P.wmv第29课第3.1节_裸板调试之JTAG原理_P.wmv第29课第3.2节_裸板调试之JTAG调试体验_P.wmv第29课第3.3节_裸板调试之JTAG调试命令行调试_P.wmv第29课第3.4节_裸板调试之JTAG调试源码级调试_P.wmv第30课第1.1节_驱动调试之printk的原理_P.wmv第30课第1.2节_驱动调试之printk的使用_P.wmv第30课第1.3节_驱动调试之打印到proc虚拟文件_P.wmv第30课第2.1节_驱动调试之段错误分析_根据pc值确定出错的代码位置_P.wmv第30课第2.2节_驱动调试之段错误分析_根据栈信息确定函数调用过程_P.wmv第30课第3节_驱动调试之自制工具_寄存器编辑器_P.wmv第30课第4节_驱动调试之修改系统时钟中断定位系统僵死问题_P.wmv第31课第1节_应用调试之使用strace命令跟踪系统调用_P.wmv第31课第2节_应用调试之使用gdb和gdbserver_P.wmv第31课第3节_配置修改内核打印用户态段错误信息_P.wmv第31课第4.1节_应用调试之自制系统调用_P.wmv第31课第4.2节_应用调试之使用自制的系统调用_P.wmv第31课第5.1节_应用调试之输入模拟器之设计思路_P.wmv第31课第5.2节_应用调试之输入模拟器之编写保存功能_P.wmv第31课第5.3节_应用调试之输入模拟器之编写测试模拟功能_P.wmv2.4 Linux应用程序的学习对于大多数人来说,第1个C程序是在Windows的Visual Studio C++(简称VC)上写的,所以你们关心的也许是:嵌入式Linux应用程序,跟VC应用程序之间的区别:① 编译方法不同:在VC上点点鼠标即可编译,对于嵌入式Linux应用程序,我们需要“交叉编译”:程序要在PC Linux上编译,但是运行时要放到单板上。并且,它的编译环境需要你自己搭建:解压出工具链后设计PATH,还要自己构造一套Makefile系统。② 调试方法不同:在VC上点点鼠标就可以调试,对于嵌入式Linux应用程序,你可以更喜欢用打印;或是在PC Linux上通过GDB观察应用程序在单板上的运行状况。③ 可用的资源不同:对于VC程序,你可以直接使用微软公司提供的各种类库;对于嵌入式Linux应用程序,很多时候需要去寻找、下载、编译、使用开源库。④ 功能不同:VC程序运行在PC上,一般是用来解决某些纯软件的问题,比如整理数据、修图、联网播放音乐之类。嵌入式Linux应用程序一般都要操作若干种硬件,比如监控设备中要操作摄像头、存储音视频,无人机中要操作GPS、螺旋桨,POS机中要操作银行卡等等。它跟单板上的硬件联系很大,很多时候需要你懂点硬件知识,至少是知道怎么通过驱动程序来操作这些硬件。上述4点的不同,花很少的时间就可以掌握。如果你有志于开发应用程序,那么一定要有算法、数据结构、网络编程等基础,然后再掌握一些设计模式,最后就是多参加一些实际项目的开发了。基于我们提供的视频,你可以这样学习:① 先掌握第1期讲解的根文件系统:在后续学习中你会经常构建根文件系统,比如往里面添加库、修改配置文件让你的程序自动运行。② 掌握怎么编译、烧写u-boot、内核:在实际工作中,一般来说不需要你去烧写u-boot、内核,但是在自学阶段还是自己掌握吧,免得去麻烦别人。按开发板手册即可操作,你甚至不用管里面的原理。③ 掌握Makefile:可以看如下第3期视频,以后编译程序时只要执行make命令即可:第1课第4节_数码相框_编写通用的Makefile④ 学习第1个项目:数码相框该项目不使用任何开源的GUI项目,完全是自己构建一套GUI系统,实现了文件浏览、文件显示(文本和图片)、图片操作(放大、缩小、自动播放)等功能;涉及网络编程、多线程编程、开源库使用等等。虽然数码相框作为一个产品已经落伍了,但是该项目所涉及的技术,特别是以面向对象的编程思想设计出一个模块化的、易扩展的系统,非常适合没有大型项目开发经验的人。很多同学,都是根据该项目所教会的编程思想找到了心怡的工作。第3期视频取名为“项目开发”,而非“应用开发”,它的第2、3个项目跟内核、驱动耦合很大。如果只关心应用开发,或是急于找一份工作,可以先看第1个项目。第2个项目涉及摄像头、ALSA声卡、WIFI网卡、3G网卡,这些都是在实际工作过程中经常用到的设备,比如我们后面补充的QQ物联就用到摄像头、声卡、WIFI网卡。第3个项目是电源管理,讲解怎么讲你的单板休眠以省电。3. 怎么学习整个Android系统待续.....更多嵌入式资源请异步到:
说说我的学习经历,希望对你有帮助。我从大二开始学习单片机,买了块51开发版,用c语言实现简单功能,烧写到开发板上运行,持续一个多月,基本把51单片机上的资源会用了。之后,买了ARM开发版学习,从uboot,linux内核,linux驱动开发的顺序学习。韦东山老师的嵌入式视频讲的很经典,可以看看。
在某企业从事4年嵌入式系统开发,发表一下自己的感悟。嵌入式有底层和上层应用之分,楼主应该打算做底层。无论怎样,都要熟悉一种硬件平台,OS,及应用领域。不同应用领域从技术上没差异,但需求不一样,相关标准不一样。如果是走技术路线,得学习处理器硬件平台,包括它的指令,汇编程序,一些驱动程序。需要理解计算机工作原理,理解操作系统工作原理,数据结构,C编码能力。找个处理器平台,做个移植工作,会大大提高你的能力。至于培训,我没参加过,不好评论。
看你问的问题,应该是对嵌入式很感兴趣,其实你可以自学嵌入式。关于如何学习嵌入式,我刚才看到一篇很不错的文章,是一个专科生介绍自己如何自学嵌入式,并找到嵌入式的工作,里面介绍了他的学习方法和学习过程,希望对你有帮助。 先做个自我介绍,我07年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了。09年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学了。
退学后我也迷茫,大专都没有毕业,我真的不知道我能干什么,我在纠结着我能做什么。所以辍学后我一段时间,我想去找工作,因为我比较沉默寡言,不是很会说话,我不适合去应聘做业务。我想应聘做技术的,可是处处碰壁。
一次偶然的机会,我才听到嵌入式这个行业。那天我去新华书店,在计算机分类那边想找本书学习。后来有个女孩子走过来,问我是不是读计算机的,有没有兴趣学习嵌入式,然后给我介绍了一下嵌入式现在的火热情况,告诉我学嵌入式多么的有前景,给我了一份传单,嵌入式培训的广告。听了她的介绍,我心里痒痒的,确实我很想去学会一门自己的技术,靠自己的双手吃饭。
回家后,我就上网查了下嵌入式,确实是当今比较热门的行业,也是比较好找工作的,工资也是相对比较高。我就下决心想学嵌入式了。于是我去找嵌入式培训的相关信息,说真的,我也很迷茫,我不知道培训是否真的能像他们宣传的那样好,所以我就想了解一段时间再做打算。
后来,我在百度知道看到一篇让我很鼓舞的文章《如何学习嵌入式》,是一个嵌入式高手介绍没有基础的朋友怎么自学入门学嵌入式,文章写的很好,包含了如何学习,该怎么学习。他提到一个方法就是看视频,因为看书实在太枯燥和费解的,很多我们也看不懂。这点我真的很认同,我自己看书往往看不了几页。
我在想,为什么别人都能自学成才,我也可以的!我要相信自己,所以我就想自学,如果实在学不会我再去培训。
主意一定,我就去搜索嵌入式的视频,虽然零星找到一些嵌入式的视频,但是都不系统,我是想找一个能够告诉我该怎么学的视频,一套从入门到精通的视频,一个比较完整的资料,最好能有老师教,不懂可以请教的。
后来我又找到一份很好的视频,是在推出的一份视频《》,网址:。里面的教程还不错,很完整,可以让我从基础的开始学起。视频比较便宜。
下面介绍下我的学习流程,希望对和我一样完全没有基础的朋友有所帮助。
收到他们寄过来的光盘后,我就开始学习了,由于我没有什么基础,我就从最简单的C语言视频教程学起,话说简单,其实我还是很多不懂的,我只好请教他们,他们还是很热心的,都帮我解决了。C语言我差不多学了一个礼拜,接下来我就学了linux的基本命令,我在他们提供linux虚拟机上都有做练习,敲linux的基本命令,写简单的C语言代码,差不多也就三个礼拜。我每天都在不停的写一些简单的代码,这样一月后我基本掌握了C和linux的基本操作。
接下来我就去学习了人家的视频的培训教程,是整套的,和去参加培训没有多大的区别,这一看就是两个月,学习了ARM的基本原理,学习嵌入式系统的概念,也掌握了嵌入式的环境的一些搭建,对linux也有更深层次的理解了,明白了嵌入式应用到底是怎么做的,但是驱动我只是有一点点的了解,这个相对难一点,我想以后再慢慢啃。
这两个月,除了吃饭睡觉,我几乎都在学习。因为我知道几乎没有基础,比别人差劲,我只能坚持努力着,我不能放弃,我必要要靠自己来养活自己,必须学好这门技术,然后我就把不懂的问题总结记下来,这样慢慢积累了一段时间,我发现自己真的有点入门了。
最后的一个月,我就去看关于实践部分的内容,了解嵌入式项目具体的开发流程,需要什么样的知识,我就开始准备这方面的知识,也就是学习这方面的视频,同时他们建议我去找了找一些嵌入式面试的题目,为自己以后找工作做准备。我就到网上找了很多嵌入式的题目,把他们理解的记下来,这样差不多准备了20天左右
我觉得自己差不多入门了,会做一些简单的东西了。我就想去找工作看看,于是我就到51job疯狂的投简历,因为我学历的问题,专科没有毕业,说真的,大公司没有人会要我,所以我投的都是民营的小公司,我希望自己的努力有所回报。没有想过几天过后,就有面试了,但是第一次面试我失败了,虽然我自认为笔试很好,因为我之前做了准备,但是他们的要求比较严格,需要有一年的项目经验,所以我没有被选中。
后来陆续面试了几家公司,终于功夫不负有心人。我终于面试上的,是在闵行的一家民营的企业,公司规模比较小,我的职务是嵌入式linux应用开发,做安防产品的应用的。我想我也比较幸运,经理很看重我的努力,就决定录用我,开的工资是3500一个月,虽然我知道在上海3500只能过温饱的生活,但是我想我足够了。我至少不用每天都要靠父母养,我自己也能养活自己的。我想只要我继续努力,我工资一定会翻倍的。
把本文写出来,希望能让和我一样的没有基础的朋友有信心,其实我们没有必要自卑,我们不比别人笨,只要我们肯努力,我们一样会成功。
快毕业时候跟你遇到一样的困惑,结局是我没有去参加培训,毕业之前买了个arm9开发板,都是自学的,后来实习找工作也按照自己的意愿进去了嵌入式行业,现在工作四年了,还好吧。
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 嵌入式系统开发流程 的文章

 

随机推荐