‘壹’ 嵌入式学习的什么是嵌入式学习
嵌入式学习是将学习真正“嵌入”到日常工作中,使学习的知识能得到有效的转化。
嵌入式学习模式认为如果学习内容与工作相关,员工学习的积极性最大,在今天日益快速变化的学习环境中,传统结构化的课程很难预测员工在工作中遇到的各种复杂问题,因此难以向员工提供最佳的问题解决方法,而员工在工作中遇到困难时能通过内部学习组织很快得到解决问题的方法从而得到知识,就被称为嵌入式学习。
嵌入式学习具有提供即时的学习支持、强调合作性、引入学习技术、将学习与工作相结合的特点。
‘贰’ 怎样学好嵌入式
学好嵌入式的方法:
1、C语言是所有编程语言中的强者,单片机、DSP、类似ARM的种种芯片的编程都可以用C语言搞定),因此必须非常熟练的掌握。
2、操作系统原理,是必需的,如果是计算机专业毕业那也就无所谓了,如果是非计算机专业的就必须找一本比较浅显的计算机原理书籍看一看,把啥叫“进程”“线程”“系统调度”等等基本问题搞清楚。
3、Linux操作系统就是用C语言编写的,所以也应该先学习下Linux方面的编程,只有会应用了,才能近一步去了解其内核的精髓。
4、了解ARM的架构,原理,以及其汇编指令,我们在嵌入式开发中,一般很少去写汇编,但是最起码的要求是能够看懂arm汇编。
5、系统移植的时候,就需要从最下层的bootloader开始,然后内核移植,文件系统移植等。而移植这部分对硬件的依赖是非常大的,其配置步骤也相对复杂,也没有太多详细资料。
6、驱动开发
linux驱动程序设计既是个极富有挑战性的领域,又是一个博大精深的内容。
linux驱动程序设计本质是属于linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。
‘叁’ 嵌入式怎么自学自学嵌入式有什么方法
嵌入式怎么自学?如何事半功倍的学习嵌入式
嵌入式怎么自学?这是很多想要入门的新手经常问别人的问题,生怕走错道,走弯道。作为嵌入式的学习者,其次具备一些基础技能之后,学习嵌入式显然会事半功倍。就拿当前嵌入式培训而言,也是从基础到专业。本篇文章就教你:嵌入式怎么自学,让你事半功倍的学习嵌入式。
1.掌握C语言高级编程。无论是对嵌入式软件还是硬件开发编程,都是不可缺少的一部分。因此不管您是自寻、还是拜师我坚信这都是他们教您的第一步。
2. 要了解嵌入式Linux操作系统。你得首先对这个系统有一定的认识,就好比你想盖房子、你得需要水泥、砖头、钢筋。那么嵌入式Linux系统同样如此。这个比喻也许很粗糙,但容易理解。
3.了解Linux或者wince下的编程。
4.具有单机片或者ARM或者MIPS等相关基础。
5.其他知识的扩充。我们还可以通过阅读一些优秀的代码,了解UBOOT的源代码,或者是学习下linux的源代码等等。
关于培训,华清远见的嵌入式培训流程如下:
基础部分:嵌入式Linux操作系统的使用、C语言高级编程、数据结构及其经典算话描述。
应用层部分:I/O、Linux库的制作和使用、Linux并发程序设计、网络编程、数据库开发、综合案例等等
底层核心部分:ARM编程、硬件接口编程、物联网基础、系统移植、内核开发、驱动开发等
项目实战:会让学生以分组的形式完成2个项目作为项目毕业考核,以方便分配工作,把简历丰满起来。
关于嵌入式怎么自学,华清远见的嵌入式培训班认为最重要的还是先看看C语言高级编程。很多初学者对编程思想、思路是比较陌生的。因为这个将伴随着整个学习过程。哪怕你不做嵌入式。学好C语言高级编程,也能找到很多适合您的岗位。
‘肆’ 嵌入式学习方法是什么有哪些好的嵌入式学习方法啊
嵌入式作为国内近几年比较火热的专业,也就是和前几年计算机专业一样。前些年计算机专业做为一个火热的专业各大高校一片热招,但由于学校师资有限、教材落后, 最后导致学生毕业后找不到工作。
近几年嵌入式又是一片火热,各大高校纷纷热招,但是部分高校设备不够齐全、师资不够,在不久几年里嵌入式专业又将重蹈计算机覆辙。现在好多在校大学生和工作人员对于嵌入式专业十分感兴趣。下面我就个人经验来说一下嵌入式的学习方法,如有不到之处请高人指点。
嵌入式的定义是以应用为中心,以计算机技术为基础,并且软硬件可定制,适用于各种应用场合,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。 嵌入式系统几乎包括了生活中的所有电器设备,如掌上 PDA 、移动计算设备、电视机顶盒、手机上网、数字电视、多媒体、汽车、微波炉、数字相机、家庭自动化系统、电梯、空调、安全系统、自动售货机、蜂窝式电话、消费电子设备、工业自动化仪表与医疗仪器等。
嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
这时嵌入式就以计算机为基础从事相关设备的开发了,试问前些年没有做好计算机教学的学校,又何以从事嵌入式教学呢。
对于在校大学生应该C语言基础知识,光是学习谭浩强的还不够,多看一些国外的经典书籍,如,这是每位学习程序设计的人员必备知识。由于嵌入式是软件和硬件相结合的产物,所以对于操作系统和微机原理的学习也是不可缺少的,但是现在各大高校只是停留在理论知识的讲解,并没有实际上的东西,这也就导致学生不能提高兴趣,只是用于对付考试,所以学好操作系统和微机原理应该理论实际相结合。还有数据结构这一门课程是不得不提的课程,国内出名的也就是清华大学的严蔚敏的那本书了。学好这些东西这也就是相当于武侠小说中的内功的修养。
有了这些做为基础,去学习其他的一些东西就会很快的。
嵌入式分为嵌入式软件开发和嵌入式硬件开发,嵌入式的软件开发在掌握了以上东西后要如鱼得水。
下面就以万达嵌入式Linux培训的课程体系为例,个人感觉还是不错的。他是这样列的:
Linux基础、Linux应用程序开发、嵌入式Linux网络程序开发、嵌入式图形界面与数据库开发、嵌入式linux开发环境搭建、S3C2440的内部结构功能简介、BootLoader分析和移植、Linux内核移植、uCOS II 源码分析和移植、根文件系统制作、BootLoader、内核综合解析、Linux系统调试、ADS仿真调试与S3C2440硬件接口操作、ARM11接口、Linux下字符设备驱动程序、Linux下块设备驱动程序、Linux下网络设备驱动程序、LCD设备驱动、Flash设备驱动、USB驱动开发等。
要学习一个东西肯定要先学习他的操作,这就是linux基础,也就是常用的linux操作,这样的书籍太多了,找一些实用的来看就可以了。下来就是在我们先前学习的C语言的基础上学习linux上的程序开发,这门课程现在在好多学校都没有开设,对于程序开发者来说是一门很重要的课程,不过万达嵌入式是把网络程序开发和图形界面开发与数据库开发分开了,其实这些都属于linux上的应用程序开发,可能也是为了方便大家认识这一门课程吧,条理更加清楚了。这一内容是企业开发中应用最多的内容,也就是所谓的嵌入式应用层开发。有了深入的C语言基础这些内容都是很容易学会的。比较知名的书籍有已帮的的steves先生的《UNIX环境高级编程》可以说是UNIX编程“圣经,这本书一定要好好的拜读的。对于网络程序开发也是stevens先生的《UNIX网络编程》,如果你想深入的掌握的话可以看一下《TCP/IP协议三卷》。对于图形界面的开发大家可以看一下Jasmin Blanchette的《C++GUI Qt4编程(第2版)》。掌握这些基本上就可以从事应用层开发了。这些技术都是企业内部急用的内容。
由于嵌入式的开发不是在我们平时用的x86平台上用的,所以我们需要把我们所写的程序放到相应的平台上去,这时就用到了嵌入式开发环境的搭建(见上面的课程体系),开发环境的搭建主要就是交叉编译开发环境的搭建,这个东西你可以去网上去下,也可以自己动手去做,但在实际当中用的时候需要你自己动手去搭建。建议你先自己使用,然后慢慢的学着去搭建。
对于ARM9的操作,现在市场上主要是2410和2440,二个选择一个用就可以了,内容差不太多,认真的研究透一个就可以了,对于ARM11的6410的操作就先不要考虑了,在万达嵌入式的课程体系中也安装的也挺合理的,先是学习一下2410或2440再去学习6410,有了一定的基础后再去学习6410才有可能把它操作起来。对于接口的一些操作就是把ARM当做一个单片机来操作,这样的书籍可以去看一下周立功的书籍,它们对ARM说的挺多的,不过他们用不是三星的产品,但是懂了其中一个其它的操作起也就可以了。
对于2440的操作会了以后就可以去学习BootLoader的学习了,在万达嵌入式里面说的是BootLoader的,这里只是说了一个总称,这里主要有u-boot,vivi,LILO等,如果你用的是ARM你可以先自己选择一个小的BootLoader,比如vivi来学习,学会这一个了你去操作其它的都是一样的了。
对于操作系统的移植大体过程都是一样的,主要是让你做一个最小系统,方便以后驱动的学习。对于嵌入式系统移植的话这方面还真没有太多好的书籍,自己可以去网上搜一下。
对于基础知识都打好以后就可以进攻驱动程序开发,这个东西是一个比较漫长的过程,一定要静下心来,慢慢的去阅读代码,慢慢的去学习。这样的东西大家可以看一下《Linux内核源码情景分析》、《深入理解Linux内核》等书籍。在万达嵌入式的课程体系里面他们说到了好多关于驱动开发中的实例,确实是这样子,驱动开发肯定要多接触一些典型的驱动程序开发的案例,大家可以慢慢的跟着课程体系里面的东西去学习。
另外就是嵌入式的硬件的开发,主要就是所谓的FPGA、DSP、VHDL等。这些东西在大学里面基本上都会学到大家都可以去学习一下,自己试着做出来一些东西来。比如抄板子,一点一点的去划。
好了对于嵌入式的学习在这里就说这些,如果有不正之处请大家指正。
‘伍’ 嵌入式开发学习步骤
嵌入式开发的学习其实并没有那么难,只要了解学习的体系,掌握正确的学习方法,学习起来并不难。来讲一下嵌入式开发都要学些啥!
嵌入式开发的主要学习内容:
C,Java核心编程:c语言核心编程,Java核心编程;
Linux核心操作与算法:Linux系统使用,Linux-c编程核心技术,精品数据结构,Linux-c编程精髓;
核心操作与算法:Linux系统编程,Linux网络编程核心技术,UI编程,Java核心编程,安卓核心技术;
ARM+Linux底层开发:数字电路,ARM编程核心,Linux系统开发,嵌入式Linux驱动开发;
大型项目实践:每期安排各类型真实的项目
互联网行业目前还是最热门的行业,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。
想要系统学习,你可以考察对比一下开设有IT专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,建议实地考察对比一下。
祝你学有所成,望采纳。
‘陆’ 如何学习嵌入式技术
首先要知道什么是嵌入式技术,嵌入式技术执行专用功能并被内部计算机控制的设备或者系统。嵌入式系统不能使用通用型计算机,而且运行的是固化的软件,用术语表示就是固件(firmware),终端用户很难或者不可能改变固件。
...............................................................
那怎么学习嵌入式技术呢,我刚才看到一篇很不错的文章,是一个专科生介绍自己如何自学嵌入式,并找到嵌入式的工作,里面介绍了他的学习方法和学习过程,希望对你有帮助。
先做个自我介绍,我07年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了。09年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学了。
退学后我也迷茫,大专都没有毕业,我真的不知道我能干什么,我在纠结着我能做什么。所以辍学后我一段时间,我想去找工作,因为我比较沉默寡言,不是很会说话,我不适合去应聘做业务。我想应聘做技术的,可是处处碰壁。
一次偶然的机会,我才听到嵌入式这个行业。那天我去新华书店,在计算机分类那边想找本书学习。后来有个女孩子走过来,问我是不是读计算机的,有没有兴趣学习嵌入式,然后给我介绍了一下嵌入式现在的火热情况,告诉我学嵌入式多么的有前景,给我了一份传单,嵌入式培训的广告。听了她的介绍,我心里痒痒的,确实我很想去学会一门自己的技术,靠自己的双手吃饭。
回家后,我就上网查了下嵌入式,确实是当今比较热门的行业,也是比较好找工作的,工资也是相对比较高。我就下决心想学嵌入式了。于是我去找嵌入式培训的相关信息,说真的,我也很迷茫,我不知道培训是否真的能像他们宣传的那样好,所以我就想了解一段时间再做打算。
后来,我在网络知道看到一篇让我很鼓舞的文章,是一个嵌入式高手介绍没有基础的朋友怎么自学入门学嵌入式,文章写的很好,包含了如何学习,该怎么学习。他提到一个方法就是看视频,因为看书实在太枯燥和费解的,很多我们也看不懂。这点我真的很认同,我自己看书往往看不了几页。
我在想,为什么别人都能自学成才,我也可以的!我要相信自己,所以我就想自学,如果实在学不会我再去培训。
主意一定,我就去搜索嵌入式的视频,虽然零星找到一些嵌入式的视频,但是都不系统,我是想找一个能够告诉我该怎么学的视频,一套从入门到精通的视频,一个比较完整的资料,最好能有老师教,不懂可以请教的。
后来我又找到一份很好的视频,是在IT学习联盟网站推出的一份视频《零基础嵌入式就业班》(喜欢《零基础嵌入式就业班》的可以复制 sina.lt/qKh 粘贴浏览器地址栏按回车键即打开)。里面的教程还不错,很完整,可以让我从基础的开始学起。视频比较便宜。
下面介绍下我的学习流程,希望对和我一样完全没有基础的朋友有所帮助。
收到他们寄过来的光盘后,我就开始学习了,由于我没有什么基础,我就从最简单的C语言视频教程学起,话说简单,其实我还是很多不懂的,我只好请教他们,他们还是很热心的,都帮我解决了。C语言我差不多学了一个礼拜,接下来我就学了linux的基本命令,我在他们提供linux虚拟机上都有做练习,敲linux的基本命令,写简单的C语言代码,差不多也就三个礼拜。我每天都在不停的写一些简单的代码,这样一月后我基本掌握了C和linux的基本操作。
接下来我就去学习了人家的视频的培训教程,是整套的,和去参加培训没有多大的区别,这一看就是两个月,学习了ARM的基本原理,学习嵌入式系统的概念,也掌握了嵌入式的环境的一些搭建,对linux也有更深层次的理解了,明白了嵌入式应用到底是怎么做的,但是驱动我只是有一点点的了解,这个相对难一点,我想以后再慢慢啃。
这两个月,除了吃饭睡觉,我几乎都在学习。因为我知道几乎没有基础,比别人差劲,我只能坚持努力着,我不能放弃,我必要要靠自己来养活自己,必须学好这门技术,然后我就把不懂的问题总结记下来,这样慢慢积累了一段时间,我发现自己真的有点入门了。
最后的一个月,我就去看关于实践部分的内容,了解嵌入式项目具体的开发流程,需要什么样的知识,我就开始准备这方面的知识,也就是学习这方面的视频,同时他们建议我去找了找一些嵌入式面试的题目,为自己以后找工作做准备。我就到网上找了很多嵌入式的题目,把他们理解的记下来,这样差不多准备了20天左右
我觉得自己差不多入门了,会做一些简单的东西了。我就想去找工作看看,于是我就到51job疯狂的投简历,因为我学历的问题,专科没有毕业,说真的,大公司没有人会要我,所以我投的都是民营的小公司,我希望自己的努力有所回报。没有想过几天过后,就有面试了,但是第一次面试我失败了,虽然我自认为笔试很好,因为我之前做了准备,但是他们的要求比较严格,需要有一年的项目经验,所以我没有被选中。
后来陆续面试了几家公司,终于功夫不负有心人。我终于面试上的,是在闵行的一家民营的企业,公司规模比较小,我的职务是嵌入式linux应用开发,做安防产品的应用的。我想我也比较幸运,经理很看重我的努力,就决定录用我,开的工资是3500一个月,虽然我知道在上海3500只能过温饱的生活,但是我想我足够了。我至少不用每天都要靠父母养,我自己也能养活自己的。我想只要我继续努力,我工资一定会翻倍的。
把本文写出来,希望能让和我一样的没有基础的朋友有信心,其实我们没有必要自卑,我们不比别人笨,只要我们肯努力,我们一样会成功。
.......................................................
主要肯努力加上方法就能学好嵌入式,希望你未来能成为嵌入式工程师。
‘柒’ 如何学习嵌入式
作者:匿名用户
链接:https://www.hu.com/question/19688487/answer/32217959
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
学习嵌入式系统,首先应该明确什么是嵌入式系统,否则费力去学,却不知所学为何物,岂不惘然?嵌入式系统的定义很多,这也是困扰嵌入式系统学习的一个因素。笔者根据自己开发和教学过程中的理解,以及对各种嵌入式系统的应用进行总结,提出了嵌入式系统的简单定义:嵌入式系统是嵌入式计算机系统的简称,这个定义突出嵌入式计算机系统和普通计算机系统的共性。下表列出了嵌入式系统的一些典型的应用:
智能机器人(S D R 4,火星登陆车)
娱乐和消费电子(Gameboy Advance,SonyPSP)
网络通信产品(Smartphone)
军用设备(军用PDA )
汽车(车载导航,自动驾驶,娱乐系统)
智能仪器(虚拟仪器)
安全防护(防火,防盗)
环境保护(探空气球)
银行和商业消费(ATM)
以火星登陆车为例来分析一下嵌入式系统的定义。火星登陆车虽然听起来感觉在技术上有些高不可测,但是本质就是嵌入式计算机系统的应用,其核心就是一个计算机系统,而这个计算机系统的组成同传统的计算机系统在本质上没有什么差别。两者的显着不同之处就在于,用于火星登陆车的计算机系统被安装到了火星登陆车上。当然,一个计算机系统能够被安装在火星登陆车上,是需要进行很多特殊设计的。但是从本质上讲,嵌入式系统的核心概念还在计算机系统。嵌入式系统学习的重点也在计算机系统上。一方面,学习者需要牢固掌握计算机系统本身的概念,更重要的是学习嵌入系统的开发过程同传统计算机系统开发过程的差别。这里需要指出的是,很多学习者本来就没有从事过完整计算机系统的开发,高校的教学是以程序设计为中心的,计算机系统的构成,操作系统的原理,编程语言等课程都是为了能够让学生更好的使用计算机系统进行程序设计,在现有的计算平台上来设计实现各种应用,学生一般没有机会学习一个完整的计算机系统是如何构建,并亲身参与到构建的每一个过程。而对于嵌入式系统而言,从事平台开发的人就是要亲自去开发出一个完整的计算机系统,这个过程包括
1. 需求分析
2 硬件设计
3 驱动程序
4 Bootloader & BSP (板级支持包)
5 操作系统的移植
6 应用程序的开发
7 性能检查
嵌入式系统教学的目的就是教会学生如何根据需求去建立满足某种特殊行业需求的嵌入式计算机系统。让学生学会如何构件硬件平台,进行硬件设计,选择能够满足应用要求的最佳的嵌入式操作系统,并完成Bootloader,BSP和驱动程序的编写,移植,调试等过程。为了满足行业需求,最终要在所建立的系统上编写调试相应的应用程序,并进行性能的测试和检查。
你是谁,你需要学习哪些东西?
如果你的工作只是需要在PC 机上编写一个图片浏览程序,那么你就没有必要去了解当系统收到一个ARP请求包后应该如何回应。同样的道理,嵌入式系统的学习也是有很多方面的。就嵌入式系统的设计和实现而言,基本上需要四种不同的工作:系统设计工作,硬件设计工作,驱动程序和操作系统移植工作和应用程序设计开发工作。
1.系统设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种操作系统,使用那些软件开发工具。系统分析师往往是较为完整的参与过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统本身的开发流程十分清楚的人。
2.硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。通常需要硬件设计人员熟悉嵌入式系统的硬件构成。硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/视频编解码芯片,电源管理芯片,总线接口电路 (USB,PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth,WLAN,GPRS)等硬件电路构成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。在网络上能找到很多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
以上这些知识,往往需要较长时间的学习和积累,需要亲自参与实践的机会。对于刚刚接触嵌入式系统硬件开发的学生来讲,一般不可能全部了解这些知识,但也不会是通通一无所知。笔者结合自己开发和教学的经验认为:首先应该选定一款主流且较为简单的嵌入式系统处理器,比如基于ARM7TDMI 内核的AT91M40800,S3C44B0 等嵌入式系统处理器,学习32 位RISC处理器的编程模型,指令集。高校教学中,单片计算机课程一般以8051系列单片为核心讲解,由于现代32位处理器的结构和开发方式同8位单片机有着较大的差别,学习者还是需要花一点力气来研究以下32位处理器的。以ARM处理器为例,学习者就需要理解处理器的多种工作模式,备份寄存器,RISC 指令集的特点,MMU 和虚拟地址,中断处理过程等内容。在学习指令集的过程中,最好能够每学习几条指令,就使用这几条指令在模拟器上实验以下,观察处理器执行的结果。这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果,另外也是对开发工具本身的一种学习。接着,就可以开始学习片上资源的使用和配置方法。这时就需要一个方便使用的开发板,学习者能够通过JTAG仿真器将开发板同调试PC机相连,进行程序的下载,调试。特别是要仔细研究系统的初始化过程和中断处理的过程。在开发过程中如果遇到问题,应自己分析问题产生的原因,通过分析缩小问题可能产生的范围,最终找到问题的所在。最重要的就是要保持一种解决问题的信心,面对困难如何处理,往往能够决定最终系统是否能够调试成功。然后,学习者可以开始仔细学习处理器同存储器的连接,存储空间的配置,各种外扩器件,如网卡,AC97声卡的工作原理和使用方法。嵌入式系统硬件设计中往往需要使用可编程器件,学习者还需要一定的时间来学习使用常用的可编程器件(CP L D / F P G A),常用的有Xilinx和Altera公司的产品。进行系统硬件原理图设计,就需要使用原理图设计的EDA工具,常用的EDA 原理图设计工具主要包括Cadence公司的Capture,Protel公司的Protel99SE等。接下来就可以参照评估板的电路图,根据系统的设计要求,开始进行原理图的绘制了。在原理图绘制过程中,一定要搞清评估板电路连接的原因,对于一时没有搞清楚的问题切不可蒙混过关。例如,有些处理器的地址线是以字节位单位的,而另一些处理器的地址线则是以两个字节为单位的,当连接16位的存储器的时候,切不可想当然的把处理器的A 0 直接连接到存储器的A 0 上面。另外,学生还应具有一定的PCB板图绘制能力,因为在现阶段,很多公司还不能完全把原理图的设计工作和PCB 的绘制工作分开,往往要求硬件设计人员既能进行原理图设计又能进行板图设计。即使是PCB设计和原理图设计分开的公司,也需要原理图设计者能为PCB 的设计者对于不同的信号提出布板要求。
3.驱动程序和操作系统移植工作
现代嵌入式系统的开发同传统8位单片机系统的开发相比,一个显着的区别就是嵌入式操作系统的广泛使用。在拿到焊接完毕的电路板,并进行基本的测试后,就要进行驱动程序和操作系统的移植工作了。首先要进行的Bootloader的编写和移植工作。Bootloader相当于PC系统的BIOS。对于有些嵌入式操作系统,如uc/OSII没有bootloader同样可以开发调试。但是对于WindowsCE和嵌入式linux系统而言Bootloader就是必须的了。本文以Windows CE 为例,做一个简要的说明。
Windows CE 系统的移植工作主要就是BSP(板级支持包)的开发过程。BSP将具体的硬件差异同操作系统的核心隔离开来,主要由Bootloaer ,OAL(OEMAbstraction Layer)和设备驱动程序三部分组成。WindowsCE系统中Bootloader叫做Eboot。Eboot被写入系统的引导Flash。系统启动时运行Eboot,完成通过网卡将调试PC 机中WindowsCE 操作系统映像下载到目标系统的SDRAM中并开始执行的功能。对于一个系统移植人员,首先需要阅读文档,了解WindowsCE系统Bootloader和BSP的基本概念和开发过程。(呵,还要做这工作啊,我还没想到(初学^_^))Windows CE的开发系统Platform Builder提供了详细的文档和例程,开发人员需要仔细的阅读文档和例程。搞清楚各个函数之间的调用关系。在开发过程中的一个重要的步骤就是打通串口,使得目标板能够通过PC机串口向调试PC 机发送数据。由于ARM系统的仿真器比较昂贵,而且操作系统的调试往往不使用JTAG调试器进行单步调试。所以能从串口观察程序的执行过程和结果对于调试就显得十分重要了。串口打通之后一个比较棘手的问题就是网卡芯片的调试。刚刚接触嵌入式系统开发的人往往没有直接在寄存器级上使用网卡芯片的经验,而网卡芯片的说明一般都较为简短,这就要求开发者学习一些以太网的基础知识,对以太网的MAC 层有一个基本的认识。另外,各种网络调试(抓包)工具的使用也能大大降低系统调试的难度。系统的OAL需要根据具体硬件的不同做出相应的修改,这个部分可参照文档进行,在调试过程中根据串口的信息分析出错的地方。要充分发挥跨文件字符串搜索工具的功能,在浩如烟海的源文件中找到出错的位置。当然,随着开发者对系统文件目录结构的熟悉和了解,错误定位的速度会不断加快。WindowsCE 的驱动程序相对而言是比较好写的。
4.应用程序的开发
嵌入式系统的应用程序开发同在PC 机上开发应用程序的区别不是很大。对于Windows CE系统而言,Microsoft已经提供了较为完善的开发工具。特别是.NET Compact work的使用,使得基于Windows CE.NETCompactwork的应用程序有了跨平台性。开发人员可以使用Windows 的C# 语言直接在PC 上进行http://CE.NET应用程序的开发和模拟调试,也可将目标系统同PC 机相连,进行联机调试。现在有很多系统支持J2ME(JAVA的嵌入式系统版本) ,这使得JAVA 在嵌入式系统应用开发中占有较大的优势。另外,作为专业的嵌入式系统软件开发人员,还需要充分了解面向对象技术和设计模式等方面的知识,当然作为初学者可以先不深入研究这方面的内容。
常用嵌入式系统处理器和操作系统
处理器
常用嵌入式系统处理器主要包括ARM 处理器,Power PC 处理器,基于MIPS 内核的嵌入式处理器,软核处理器(如Altera 的Nios和Xilinx的MicroBlaze等)和DSP(数字信号处理器)等。
ARM 处理器的主要特点是具有较高的性能功耗比。ARM处理器被广泛的应用在手机,PDA等领域,其中较为着名的有Intel 公司生产的基于ARM 内核的XScale系列处理器。由于所有公司生产的基于ARM内核的处理器具有相同的编程模型,在手持和电池供电的系统中,基于ARM的嵌入式系统处理器往往被首先选用。PowerPC(简称PPC)处理器具有较强的运算性能和数据吞吐能力,在网络和数据通信领域基于PPC的嵌入式系统处理器有着广泛的应用。其中Motorola公司生产的MPC860/MPC8260被大量地应用在嵌入式网络产品中。MIPS 处理器的特点表现在十分强大的处理能力上。作为高性能处理器,MIPS处理器适用于网络、企业及高级消费类电子应用,特别是在机顶盒系统中,MIPS处理器具有较高的市场占有率。随着可编程器件的规模不断扩大,使得人们能够根据需要定制处理器,并方便的将针对某种特殊应用定制的处理器方便的在可编程器件内部实现。除了处理器外,计算机系统还需要许多其他构成部分,比如在多通道媒体数据处理系统中,经常需要使用可编程器件来实现高速的数据处理功能,使用软核DSP来实现复杂的数字信号处理算法,同时还需要处理器进行事务处理,软核处理器将可编程器件,DSP同处理器结合在一起,为系统级设计提供了极大的灵活性。DSP(数字信号处理器)有别于通用处理器,集中表现在其强大的数字信号处理能力上。在DSP 内部提供了硬件乘累加器,处理器在设计上对于特殊的寻址方式做了优化,一些DSP 还支持零耗循环(Zero OverheadLoop)。为了方便嵌入式系统设计,主流DSP 一般也都提供了丰富的外设。特别值得一提的是ADI 公司的Blackfin 系列DSP和TI 公司的DM64X系列DSP,两种处理器都提供了丰富的片上外设,非常适用嵌入式系统应用。
操作系统
http://WindowCE.NET/5.0
作为Microsoft的产品,WindowCE.NE/5.0提供了功能完备的平台开发工具Platform Builder和应用开发工具Embedded Visual C++/Visual Studio 2003。WindowsCE由于拥有广大使用者所熟悉的windows界面,系统提供了众多驱动程序,并且有完备的文档支持。对于应用开发而言,熟悉Windows系统开发的程序员很容易转到WindowsCE 应用程序的开发。Windows CE将会是一个非常有前途的嵌入式操作系统。
VxWorks
VxWorks是由Windriver(风河)公司出品的嵌入式实时操作系统,大名鼎鼎的火星登陆车就是使用了VxWorks。Windriver为VxWorks提供了集成开发环境tornado。
υC/OSII
υC/OS是由Jean Labrosse设计编写的开放源代码的嵌入式实时操作系统,笔者最早接触的嵌入式操作系统就是它。阅读并深入理解υC/OS的源代码对于理解实时系统是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他开发者开发移植的用于ARM 处理器的linux操作系统。ARM Linux系统在GNU GPL下发布。
υCLinux
υClinux 是适用于没有MMU 的嵌入式处理的LinuxOS 版本。υ Clinux 同样在GNU GPL发布。
嵌入式系统开发过程中的常见问题和解决方法
Bootloader如何写入Flash ?
初学者一般都会遇到如何将程序写入处理器的问题。对于不同的处理器,可以采用不同的方法。例如Intel的Xscale处理器可以使用Intel公司提供的JFlash工具烧写。对于具有JTAG调试工具软件的处理器,可以使用如下思路:编写一段程序,这段程序能将位于SDRAM/SRAM 固定地址中的数据写入Flash中。烧写时,首先,将这段软件下载到SDRAM 中,然后通过调试软件将要写入Flash的数据下载到SDRAM/SRAM的某个固定地址开始的缓冲区,然后通过调试器开始执行程序,将数据写入Flash。除此以外,网络上还提供了很多专用的写Flash的工具,开发者可以根据自己的需要选用。(现在明白了我在学的那个BF533为什么先下个flashProgramer.dxe先了)
什么是arm-elf-gcc?
arm-elf-gcc是一个交叉C语言编译器。我们在PC平台下编译程序,编译器运行的处理器同生成的代码将要运行的处理器相同。但是,在PC
机上编译ARM程序时,编译器运行的处理器同生成的代码运行的处理器不同,这种编译器叫做交叉编译器。其中的elf是指编译器生成的目标文件格式。(其实我们平时用的单片机编译器如GCC—AVR等已是交叉编译器了,我到现在才弄清楚什么是交叉编译器)
走了哪条编译路径?
系统程序和驱动程序往往包含很多的编译选项,很多选项都是在编译时通过命令行定义的,如果想知道编译的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
这样在编译的时候就知道,编译的是哪一条路经了。对于支持#pragma message( “I am here”)的编译器也可使用#pragma message预编译指令。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串,在windows平台下可以使用平台提供的多文件字符串搜索工具。在linux平台下,可以使用grep来搜索字符串。Grep的搜索功能十分强大,支持正则表达式搜索,熟练使用grep对于阅读系统和驱动程序代码是很有帮助的。
系统是从那个文件开始运行的?
对于Windows CE系统,一般从WINCE420\PLATFORM\YourPlatform\KERNEL\HAL目录的某个汇编文件中。对于Linux系统版本不同会存在一定差异,以arm处理器为例,一般会在linux2.4.x\arch\arm\kernel的head-armv.S中。
程序执行到了那里?
可以在程序中插入如下代码来实现
printf( “I am here %s, %d\n”,__FILE__,__LINE__);
代码将打出printf语句所在的文件名和行号。
推荐书目
Jean J.Labrosse MicroC/OS-II The Real-TimeKernel,Second Edition这本书是笔者接触嵌入式实时系统的入门书,在国内能够买到中文版。这本书较为清楚地讲述了实时系统的概念,各个组成部分的工作原理,特别是公开了实时系统内核的源代码,仔细研究定会受益匪浅。有个小的提示,对于初学者,这本书可以先不看第一章,直接从第二章看起。
Abraham Silberschatz, Peter Baer Galvin,GregGagne Operating System Concepts笔者在教学过程中发现,无论是计算机还是电子工程专业都有很多学生对于操作系统的基本概念都没有搞清,很少有学生有完整的系统编程经验。Operating System Concepts这本书对操作系统的概念讲述只能用经典来形容。对于嵌入式系统有兴趣深入研究的同学,首先要把基础打好,这本书就成了必读之物了。
Andrew S. Tanenbaum Computer Networks 提起Andrew S. Tanenbaum 学习计算机的同学一定都知道OPERATINGSYSTEMs:Designand
Implementation这本书,笔者对于Tanenbaum这样的教授由衷佩服。网络协议栈是嵌入式系统中的支柱性组成部分。愿意致力于网络深层技术研究的同学,这本书将为你们建立一个坚实的网络基础。
Karim Yaghmour Building Embedded Linux Systems本书详尽的介绍了嵌入式linux系统的组成,基本概念和如何去建立各个部分。全书篇幅较小,可谓短小精悍。即可以作为嵌入式linux系统的入门读物,又是开发过程各个部分的指南。
Advanced RISC Machines Ltd (ARM) ARM7 TDMI DataSheet Advanced RISC Machines Ltd (ARM) ARM920TTechnical Reference Manual学习嵌入式系统不了解当前应用最广泛的嵌入式处理器怎么行?ARM7 TDMI 的 data sheet是学习ARM编程模型,指令集的好东西。在嵌入式系统中,MMU(内存管理单元)是很重要的部分,又是较难理解和掌握的部分。ARM920TTechnical Reference Manual 正好可以帮你讲解这方面的内容。
Perter Van Der LinDen Expert C Programming嵌入式系统级编程最常用的语言还是C 。很多同学都自认为自己的C语言学的很好,那好,就看看这本书吧,找找自己和Experts差距。
嵌入式开发与桌面开发既有不同,又有非常大的联系,而且十分注重实际操作能力。搞桌面开发的人在一开始接触嵌入式的时候,通常转换不过来,这主要体现在定位上。如文中所说,你是谁,你要做什么?我对硬件的了解仅限于编程领域,PCB设计一窍不通,但并不能说你不懂硬件就不能从事嵌入式开发。一个系统的开发设计方方面面,在自己感兴趣和熟悉的领域做出自己的贡献才是最主要的。
1。硬件设计: 需要有硬件设计的经验,对各种嵌入式器件有很好的了解。
2。系统移植:需要汇编经验,操作系统原理以及底层驱动的了解
3。应用程序:需要桌面编程经验
‘捌’ 嵌入式学习的嵌入式学习方法
从零基础开始:这部分主要还是要求大家熟练掌握基础,孰能生巧,只有基础熟练了才能为解下来的学习扫平障碍。 Linux命令的重要性: Linux是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平
个原理是不会变的,Linux命令有许多强大的功能:从简的磁盘操作、文件存取、到进
行复杂的多媒体图象和流媒体文件的制作。 选择一本好的工具书:一本适合新手的书籍可以将其思维打开,使其豁然开朗。一旦选错了书籍,初学者可能会产生一大串的疑问,并逐渐失去学习兴趣。对于书籍的选择,你可以到亚嵌的官网:《Linux C编程一站式学习》 选择一个适合你的Linux发行版本目前全球有超过1百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,Redhat Linux和ebian Linux是网络管理员的理想选择。对于英语不是很好的读者红旗Linux、中标Linux这些中文版本比较适合。现在一些Linux网站有一些Linux版本的免费下载,同学们可以到各自的班主任那拷贝亚嵌教学用的版本。 养成在命令行下工作:一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统 选择一个适合你的Linux社区:随着Linux应用的扩展,出现了不少Linux社区。其中有一些非常优秀的社区。推荐适于初学者的Linux社区:Linux伊甸园,优秀linux+oracle技术门户,中国Linux公社。 勤于实践:要增加自己Linux的技能,只有通过实践来实现了。所以,一定要在学习中勤于实践,你会收获更多 用Unix思维学习Linux:Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
‘玖’ 学习嵌入式的方法总结
基于微控制器的嵌入式系统的学习建议
首先,要明确为什么要学习以MCU为核心的嵌入式应用技术。针对读者不同的学习目的,学习嵌入式系统的方法和侧重点略有不同。
MCU具有广泛的应用范围外,对于计算机、电子类、机电类等专业的工科学生来说,即使暂时没有从事MCU的应用的开发,学习MCU也有很重要的意义。因为,MCU作为微型计算机的一个种类,麻雀虽小,五脏俱全,学习MCU可以更加理解微机原理,更加清楚计算机的脉络。同时,目前嵌入式应用系统的软件开发方法与一般的软件开发方法已经融合,开发平台也极为相似。对于在校学生,学习嵌入式应用技术,主要以书本知识为主,理解嵌入式系统的原理和基本编程方式,为将来的学习和发展打好基础。
对于将要投身嵌入式行业的技术人员而言,学习嵌入式系统的方法和侧重点不同于在校的学生。不但学习过程中所需要的背景知识(包括数字电路、汇编语言基础、软件工程,甚至机械自动化)不可或缺,而且更要养成良好的做事规范和方法。学习的侧重点主要放在较复杂的嵌入式应用系统上,对于嵌入式实时操作系统(包括µC/OS-Ⅱ、SmallRTOS、µCLinux等)在应用的基础上,有一定深度的理解。但是,对于只分析实时操作系统或进行短期培训性的驱动程序开发,不扎实进行嵌入式系统基础知识的学习与软件及硬件实践,是不可能学好嵌入式系统的。
其次,学习以MCU为核心的嵌入式应用技术,要选择入门的机型。MCU种类繁多,应用于各行各业,在应用中需要设计者对各种MCU都有所了解,以便确定最佳的性能价格比。但是不可能也没有必要同时学习各种型号MCU的软硬件知识,通常的方法是学习一种典型的MCU系列,达到实用程度,在应用中首先选择使用该系列。如果确实要用其它系列MCU时,只需将两种系列的不同点进行分析、对比,即可在较短时间内达到可以应用的程度。对于初学者,选择入门的MCU系列,一定要选择在国际上比较流行,系列比较齐全,在若干年内不会被淘汰,且抗干扰性强、性能价格比较高的产品。选择Freescale公司HC08/S08系列的MCU具有这些特点。
第三,MCU指令系统不大,特别是关键字不多,学习时,在了解基本性能的前提下,可先把关键字及其含义记住,这样,在以后的学习中可起到事半功倍的效果。这一点需强调一下,花上几个单元时间记住主要关键字,对于入门学习很重要,没有必要的记忆,任何知识也无法学习。本书采用汇编语言与C语言并行学习的方法,可以通过实例对比学习。所提供的例子均通过测试,可以作为对比学习用例。也可以应用到实际开发系统中。
第四,学习以MCU为核心的嵌入式应用技术,一定要勤于实践。必须通过实践,理解MCU原理,掌握基本的编程规范与方法,才能学会设计应用系统。因此,一定要创造条件进行实践,这是学好MCU极为关键的一环。特别是注意软件与硬件相结合的实践。MCU程序要固化,进入硬件才能执行,而且通过MCU的输入输出以及执行机构反映出来,这就涉及到硬件系统的构成,因此学习MCU与单纯开发计算机软件不同,必须了解MCU系统的构成。同时,通过软件“打通”硬件,观察硬件响应现象,体会软件功能。一般8位机的硬件评估系统只有几百元,特别是好的硬件评估系统都提供自我实践硬件接口,购买硬件评估系统进行学习与实践是一种好方法。
第五,学习以MCU为核心的嵌入式应用技术,必须与输入输出接口的学习连在一起。MCU系统离不开各种输入输出接口,学习MCU,就必须学习各种接口的原理,通过接口的输入输出体现MCU程序的功能。
第六,MCU的发展已经逐步走向成熟期,各种新技术的使用,进一步提高了MCU的性能价格比。技术进步不可避免的带动了学习方法的更新。学习以MCU为核心的嵌入式应用技术,也要与时俱进,不断改造自己的学习方式,保持与嵌入式应用技术发展的同步。例如:以前的嵌入式系统代码量小,对于硬件的依赖性大,可移植性也就相对较差,规范的重要性基本无从体现。但随着电子技术的发展,MCU的集成度越来越高。前几年还处于实验阶段的Flash存储器技术,目前已广泛使用。MCU性能的提高使得开发人员不得不更重视规范的价值和作用。如今的嵌入式系统开发,不按照规范进行,简直寸步难行。
第七,由于嵌入式系统市场巨大,潜力无限,全球的生产商都非常看好这一领域,纷纷投入了大量的人力物力;而围绕嵌入式系统的研究、设计和开发正成为计算机技术发展最活跃的方向之一。近年来,国内外关于嵌入式系统的书籍如雨后春笋般涌现。选择好的书籍已成为大多数初学者的当务之急。首先,读者不要盲目跟风,要选择适合自己真正需要的书籍。其次,读者可以通过阅读一些书中内容判断该书是否值得购买。因为好的书籍对于问题的阐述一定是清楚明了的;对问题的解决一定是细致透彻的。对于当前非常火热的各种嵌入式培训形式,读者不要盲目跟风,要充分和慎重的考虑自己学习嵌入式的目标和计划。只有从底层抓起,一点一滴打好基础,才能学好嵌入式技术。
以上几点主要是对学习阶段的建议,开发应用阶段则必须重视理论与实践的结合,积累实际经验,探索应用规律和特点。特别要认识到,嵌入式应用技术是以MCU的软硬件技术为核心的综合技术,必须学会知识的分割与综合,才能融会贯通。
‘拾’ 初学者如何学习嵌入式
作为一个新人,怎样学习嵌入式Linux
原文链接:网页链接
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下。
在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西,很适合煅炼你的编程能力。
回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统、应用开发。如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。嵌入式应用开发和PC上的应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子,比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android,这个时候你应该去学学QT、Android的编程。但是基础还是C或JAVA,在此基础上去熟悉它们的接口。你学过VC的话,也是要花时间去了解那些类、控件的。
如果你的目的是想学习底层系统,这是我的专长,倒是可以说一点。
在回答这个问题之前,我先回答:不少人问我,到底是学驱动还是学应用?
我只能说凭兴趣,并且驱动和应用并不是截然分开的
我们说的驱动,其实并不局限于硬件的操作,还有操作系统的原理、进程的休眠唤醒调度等概念。 想写出一个好的应用,想比较好的解决应用碰到的问题,这些知识你应该懂
做应用门槛低,特别是现在的ANDROID,纯JAVA。做应用的发展路径个人认为就是业务纯熟。比如在通信行业、IPTV行业、手机行业,你了解行业的需求。所以,当领导的人,多是做应用的。
做驱动,其实我不想称为“做驱动”,而是想称为“做底层系统”,做好了这是通杀各行业。我工作几年,做过手机、IPTV、会议电视,但是这些产品对我毫无差别,因为我只做底层。他们的业务跟我没关系。当应用出现问题,他们解决不了时,我就会从内核角度给他们出主意,给他们提供工具。 做底层的发展方向,个人认为是技术专家。
其实,做底层还是做应用,之间并没有一个界线,有底层经验,再去做应用,你会感觉很踏实。有了业务经验,你再了解一下底层,很快就可以组成一个团队。
回到怎么学的问题上。嵌入式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, 内核, 驱动程序、根文件系统这4大块。
它就是一个稍微复杂的裸板程序。但是要把这裸板程序看懂写好一点都不容易。Windows下好用的工具弱化了我们的编程能力。
很多人一玩嵌入式就用ADS、KEIL。你能回答这几个问题吗?
1. 一上电,CPU从哪里取指令执行?
答:一般从Flash上指令。
2. 但是Flash一般是只能读不能直接写的,如果我用到全局变量,这些全局变量在哪里?
答:全局变量应该在内存里
3. 那么谁把全局变量放到内存里去?
答:长期用ADS、KEIL的朋友,你能回答吗?这需要"重定位"。在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。你可曾去阅读过?
4. 内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?
答:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。但是,你去研究过吗?
5. 你说重定位是把程序从Flash复制到内存,那么这个程序可以读Flash啊?
答:是的,要能操作Flash。当然不仅仅是这些,还有设置时钟让系统运行得更快等等。
自问自答到这里吧,bootloader这一个裸板程序,其实有3部分要点:
对硬件的操作
对ARM体系处理器的了解
程序的基本概念:重定位、栈、代码段数据段BSS段什么的。
对硬件的操作,需要看原理图、芯片手册。这需要一定的硬件知识,不求你能设计硬件,但是至少能看懂; 不求能看懂模拟电路,但是要能看懂数字电路。这方面的能力我是在学校里学到的,微机原理、数字电路这2本书(书名忘了)就足够了。但是我怀疑你有无耐心把这2本书看完。我不知道现在有没有更快捷的书。想速成的话,就先放掉这块吧,不懂就问GOOGLE、发贴。
另外,芯片手册是肯定要读的,别去找中文的,就看英文的。开始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后,读任何芯片手册都很容易。对ARM体系处理器的了解, 看杜春蕾的<ARM体系架构与编程>吧,里面讲有汇编指令,有异常模式、MMU等。也就这3块内容需要你了解。
程序的基本概念,王道当然是去看编译原理了。可惜,这类书绝对是天书级别的。劝你若非超级天才还是别去看了。就看我写的<嵌入式Linux应用开发完全手册>和第1期视频吧,别担心,不用花钱。照着视频把硬件相关的实验做了,这些概念就清楚了。我还没有
发现第2套讲这些概念的书或视频。
对于bootloader,我学习时是先看了<ARM体系架构与编程>,然后自己写程序把各个硬件的实验都做了一遍,比如GPIO、时钟、SDRAM、UART、NAND。把它们都弄清楚了,组台在一起就很容易看懂u-boot了
总结一下,看懂硬件原理图、看芯片手册,这需要你自己去找资料。剩下的,就按<嵌入式Linux应用开发完全手册>和第1期视频的章节目录去学习吧。
想速成的人,先跨过内核的学习,直接学习怎么写驱动。
想成为高手,内核必须深刻了解。注意,我说的是了解,我没奢望去写出一个内核。
要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。
推荐两本书:
1. 通读<linux内核完全注释>,请看薄的那本(浮燥的社会讲求速度, 呵),
2. 选读<Linux内核情景分析>, 想了解哪一块就读哪一节
驱动包含两部分:硬件本身的操作、驱动程序的框架。
又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。
说到驱动框架,有一些书介绍一下。LDD3,即<Linux设备驱动>,老外写的那本,里面介绍了不少概念,值得一读。但是,它的作用也就限于介绍概念了。我基本上是入门之前用它来熟悉一下概念,入门后就扔掉了。
驱动方面比较全的介绍,应该是宋宝华的<linux设备驱动开发详解>了,老实说我只看过目录,有不少人说好,这里推荐一下。要想深入了解某一块,<Linux内核情景分析>绝对是超5星级推荐。你别指望把它读完,1800多页,上下两册呢。我是某一块不清楚时,就去翻一下它。任何一部分,这书都可以讲上2、3百页,非常详细。并且是以某个目标来带你分析内核源码。它以linux 2.4为例,但是原理相通,同样适用于其它版本的linux。
还有没有其他介绍?呵呵,当然有了,韦东山Linux视频第2期。<嵌入式Linux应用开发完全手册>里对驱动讲得不多,不够深入。于是我录制了这期视频。不仅仅教你怎么写怎么改驱动,还教你为什么这样写这样改驱动。
每一个驱动都是现场编写:
用绘图板画图讲解──相当于学校里老师在黑板上画图讲解,很直观绝对不是对着PPT念。
用source insight当场写程序,从第1行开始写,每一课都是这样。我讲了20多个驱动,就写了20多个程序。
写完就编译、测试。
很全面,字符设备驱动、块设备、网卡驱动3大类齐全,硬件介绍、驱动框架分析、测试3大类齐全。
培训机构里教的内容,远不及这期视频丰富。我在多个培训机构讲过课,从没看到哪个老师敢每一课都当场讲解当场编写代码,当场测试,除我之外!也没看到哪个培训机构讲完这些内容──因为时间不够,讲完起码要一个月,但是这部分基本只有2周授课时间。
把你手上的开发板所涉及的硬件,都去尝试写一个驱动吧。有问题就先"痛苦地思考",思考的过程中你会把很多不相关的知识串联起来,最终贯通。
大家有没有想过这2个问题:
1. 对于Linux做出来的产品,有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序呢?
答:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。显然,这个应用程序就要读取配置文件,根据配置文件去启动用户程序(监控、手册界面、平板界面等等)这个问题提示我们,文件系统的内容是有一些约定的,比如要有/sbin/init,要有配置文件
2. 你写的hello,world程序,有没有想过里面用到的printf是谁实现的?
答:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。这个问题提示我们,文件系统里还要有库。
简单的自问自答到这里,要想深入了解,可以看一下busybox的init.c,就可以知道init进程做的事情了。当然,也可以看<嵌入式Linux应用开发完全手册>里构建根文件系统那章。
我在学校时读的是物理电子专业,其实课程里没有教怎么设计电路,只是教了些电子电路方面的知识。PCB的设计是在实验室里自学的,只设计过2层板,现在忘记得差不多了。但是保留了看原理图、看芯片手册的能力。
选修了软件学位,对软件设计挺感兴趣,但是也只是学了C语言、数据库而已。凭着兴趣做了不少竞赛题。没能力去参加竞赛,但是把C语言练得很扎实。
在实验室、在第1家公司,就是设计些简单的PCI卡,写一下windows的驱动程序
在第2家公司,用51单片机做车载电话,开始走上纯软件的道路。
开始感到单片机的不足,辞职半年闭门学Linux,从red hat怎么操作开始。步骤就是先看<ARM体系架构与编程>,再自己写裸板程序操作硬件,接着到分析u-boot。同时看<linux内核完全注释>,对LINUX框架有所了解。在写裸板时,建议各位加强对中断的理解,内核就是用中断来完成各种功能的。
分析完u-boot,就开始进行简单的驱动编程了,这时候,能力还很弱。
开始去中兴上班,工作2年,编写各类驱动、解决各类问题(驱动问题、帮助定位应用问题),能力得到煅炼。
1. 硬件方面的书: 微机原理、数字电路,高校里的教材。毕业多年,忘名了。
2. Linux方面的书:
<ARM体系架构与编程>
<嵌入式Linux应用开发完全手册>
<Linux设备驱动>,老外写的那本
<linux设备驱动开发详解>
<linux内核完全注释>
<Linux内核情景分析>
3. 视频:
韦东山Linux视频第1期(基于S3C2440录制): ARM实验,u-boot,文件系统,初级驱动
韦东山Linux视频第1期(基于S3C6410录制): 裸板程序
韦东山Linux视频第2期: 高级驱动
韦东山Linux视频第3期:项目实战
韦东山Linux视频第4期:Android驱动
视频信息请看网页链接
————————————————
版权声明:本文为博主“韦东山”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/thisway_diy/article/details/51887326