嵌入式学习心得体会8篇

时间:2024-01-13 作者:loser

通过准备心得体会,我们可以更好地发现自己在经历中的成长和进步,心得体会是我成长的见证,记录了我一路走来的点滴进步,心得范文网小编今天就为您带来了嵌入式学习心得体会8篇,相信一定会对你有所帮助。

嵌入式学习心得体会8篇

嵌入式学习心得体会篇1

工作一年了,喜爱嵌入式这个好玩,令人羡慕的行业,不止是工资待遇哦。

4月,又是有许多面临毕业、找工作的大学生来到,面对如此激烈的竞争,如果有一技之长旁身,那就是你挑公司了。

非常有感慨,上一年我也在大学城中参加千里马的面试,跟我同学都是拿着一袋子的简历去排队。

或者网上招聘海投简历。

现在就职的公司算不上高大上,还能算的过去。总结一下学习心得,也算对自己学习有个交代吧。

1、如何做好嵌入式linux学习前的准备?

要成为一名合格的嵌入式linux工程师,就需要系统的学习软、硬件相关领域内的知识。大学里面学的基础还行,可以继续自学,我是自学韦东山linux视频,重点是有书,有视频,有代码。如果基础太差是个小白,还是建议去花几万培训吧。

2、学习嵌入式linux需要补习哪些基础课程?

嵌入式linux工程师的学习需要具备一定的c语言基础,因此面对许多朋友只是在大一或者大二学习过c(还不一定认真学了,呵呵!),之后基本就不再用过的情况,建议大家在学习之前先复习一下c语言基础这块。要提醒大家的是,复习时不能只关注基本语法,对于常用的数据存储及处理方式,例如:数组、结构体等也要关注,有条件的话一定在机器上亲自敲敲代码、分析理解一下具体案例代码编写的思路,让自己慢慢进入一名嵌入式开发人员的状态。

3、嵌入式linux开发跟普通软件开发在学习方法上有什么不同?

要成为一名成功的嵌入式软件开发人员,程序的设计能力是首要技能,这一点与普通的软件开发人员的要求是一样的。但是作为“软硬兼施”的嵌入式开发,则要求大家不仅要了解较底层软件的工作过程和工作原理(例如操作系统级、驱动程序级软件),可以看一下韦东山linux视频第1期(基于s3c2440录制): arm实验,u-boot,文件系统,初级驱动。

嵌入式学习心得体会篇2

首先,嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式有如下几个突出的有点1。系统内核小,2专用性强,3系统精简4高实时性os5嵌入式系统的应用程序可以没有操作系统直接在芯片上运行,6嵌入式系统需要开发工具和环境。

嵌入式系统是近几年才风靡起来的,但是这个概念并非新近才出现。从20世纪七十年代单片机(最早的单片机是intel公司的 8048,出现在1976年)的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了近30年的发展历史。经过30年的发展,嵌入式技术已经日趋成熟,在中国嵌入式机一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。

其次,嵌入式系统无疑是当前最热门最有发展前途的it应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。

嵌入式系统是软硬结合的学科,通常有两类人会去专研嵌入式:一类是学电子工程、通信工程等偏硬件专业的,另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。我是软件专业的学习嵌入式,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。嵌入式应用在很多方面,具体的可以分为工业控制,交通管理,信息家电,家庭智能管理系统,pos网络及电子商务,环境工程与自然,机器人,机电产品方面应用等方面。其中目前在服务领域,如远程点菜器等已经体现了嵌入式系统的优势。例外还有很多地方用到了嵌入式系统,最近飞利浦和arm共同推出32位risc嵌入式控制器,适用于工业控制,采用最先进的0。18微米cmos嵌入式闪存处理技术,操作电压可以低至1.2伏,它还能降低25%到30%的制造成本,在工业领域中对最终用户而言是一套极具成本效益的解决方案。

嵌入式学习心得体会篇3

本人本科学的是电子信息工程专业,其实这个专业和嵌入式没有多大的关系,要说有关系就是简单的讲了下c语言语法,学完之后还不知道什么是c语言,只记住了char,int,long等占几个字节,if, while,for循环什么的,感觉也就能算一些小学就会的题目,全国计算机二级c语言也就糊涂的过了。我这个专业没学过c++,一开始不知道什么是面向对象,这可能会让人笑话了。不过这说的是实话,本科的时候,学院安排的课程大部分偏硬件部分,动手机会比较多,自然而然比较喜欢硬件方面。

在大二的时候就听学长说,单片机很难学,那时候经学长介绍,淘宝买了本郭天祥老师出的书《51单片机c语言教程》,一开始还真是不怎么懂,感觉有点像是看天书,然后硬着头皮去看,当我把51的结构看完了,就不像一开始那样一头雾水了,自己在纸上把51的结构图默画一遍,然后再把各个寄存器功能写一下,各个功能口的结构粗略画了下,然后觉得51整体已在我心中了,虽然没有什么作用,但是至少懂得这门课要怎么去学习。其实有些时候不是这个东西你不会,而是在不会的时候自己先告诉自己这个太难了,自己先放弃了。

在大三的时候,第一学期课比较少,我就经常待在图书馆,会去蛮看些专业相关的书籍,现在想想,那时候也是机缘巧合下,看到了一本书《从51到arm》,讲述的是从51系列单片机的一般知识出发,将arm处理器和51系列单片机进行对比,引导读者去理解和学习arm处理器的知识。那个时候也有考虑到以后就业的问题,就想到一件事情,如果去应聘工作的话,每个工科院校电子信息类的毕业生都会异口同声地说:我会51系列单片机。当他说这句话的时候,他和别人是站在同一起跑线上的。可我们完全有可能和别人不站在同一起跑线上。正是这本书给我开启了另外一扇大门,让我初步了解了嵌入式。后来去报考全国计算机等级考试三级教程——嵌入式系统开发技术,在图书馆奋斗了两个月,最后取得优秀的成绩,也让我进一步了解嵌入式系统。

在大四的时候,我们有嵌入式的选修课,不过当时因为考研的缘故,就没有去上过这门课,好可惜呀!但是,在选择读研研究方向的时候我还是毅然选择了嵌入式方向,我知道这将成为我未来三年研究的方向。这学期(研一下学期),很开心能够再次接触嵌入式系统这门课程,对于导师教的这门课程,我觉得自己上课还是蛮认真听讲的,当然也被师在台上那讲得头头是道,温文儒雅的风姿所吸引。对于没有学过微机8086的我,有些时候,老师用微机与嵌入式的对比让我头脑没有相关概念。.。

首先,我对嵌入式在概念上有了一个比较精确的了解。嵌入式是指以应用为中心,以计算机为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统。它由硬件平台和系统软件组成。硬件平台指嵌入式处理器和与之通过接口连接的外围硬件平台。系统软件是指实时操作系统和用户应用软件。

谈到硬件部分,我首先想到的是嵌入式处理器那些外围功能模块。对于这部分的学习,我当初花了好长时间看《深入浅出arm7——lpc2400》这本书,现在想想觉得自己学习方法没用对,完全没有那个必要,自己却花了大把时间在看这些寄存器引脚的使用,因为单纯的看过之后还是很容易忘的,之后在进行实验的时候还是翻书来查就证明了这一点。不过一些最基本的模块,例如通用输入/输出口(gpio),通用异步收发器(uart),向量中断控制器(vic),外部中断输入和定时器/计数器还是需要看书认真去记住那些常用的引脚功能。对于cpu异常这部分,我一开始以为异常就是中断,因为处理程序流程设计是相似的,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。当时还对老师提出的一个看法有点疑义,51可以处理中断嵌套而arm处理器却不能?我当时脑子里面就在想:中断不都是有硬件设备产生的,那按常理来讲arm处理器也可以处理的呀。后来在认真查书,发现cpu异常有7种:复位,数据中止,中断,快中断,预取中止,未定义,软件中断。而异常向量会使cpu转入异常入口地址执行程序,开始了异常处理。同理的话,中断向量使cpu转入中断入口地址执行程序,开始了中断处理。即当发生irq中断时,程序返回地址被存入该irq中断模式下的lr,如果继续发生irq中断,那第二次的中断返回地址也还是被存入该irq中断模式下的lr中,那先前发生中断时候存入的程序返回地址将被覆盖掉,导致不能返回正确的位置。在我解决这个问题的期间,每次睡前思维准会定格在这问题上,久久不能绕出来,其实有时候查书还是最好的解决方案,因为网络资源只能提供给我们部分的参考资料。

对于arm汇编语言这部分的学习,我认为是需要重视的,学汇编不是说用这语言做多牛逼的事情, 问题的关键在于, 学透了汇编会使你真正理解计算机。另外一方面,只要以后在嵌入式工作中你迟早会在某个阴暗的角落里遇到汇编。“不管你承认不承认, 现在的cpu没有直接跑高级语言的, 哪怕是虚拟机也都是类似汇编的指令集。当遇到崩溃分析, 性能优化甚至编译器抽风等等的时候, 汇编是你最后一根救命稻草(这句话是福来师兄讲的)。”为此他给了我们一份资料,周立功lpc21xx/lpc22xx系列arm7启动代码分析,主要讲述的是startup.s文件的分析,看了下才发现老师上课讲的那个启动代码分析很多不理解之处这里都有详细的介绍,这分析太精辟了。

学 arm7这么久,我认为从硬件上讲,一方面就是学习接口电路设计,另一方面就是学习汇编和c语言的板级编程。如果从软件上讲,就是要学习基于arm处理器的操作系统层面 的驱动和移植。这些对于我们初学者来说必须明确,要么从硬件着手开始学,要么从操作系统的熟悉到应用开始学,但不管学什么,只要不是纯的操作系统级,硬件的寄存器类的东西还是要能看懂的,基于板级的汇编和c编程还是要会的。

μc/os-ii 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。μc /os-ii是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μc/os-ii绝大部分的代码是用ansi的c语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。

μc/os-ii可以大致分成内核结构、任务管理、时间管理、任务之间通信与同步4个部分。内核结构是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。任务管理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μc/os-ii是以任务为基本单位调度的,所以这部分内容也相当重要。μc/os-ii中的最小时钟单位是timetick(时钟节拍),任务延时等操作是在时间管理这部分完成的。任务之间通信与同步为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。μc/os-Ⅱ操作系统是在main()中建立的,首先要系统初始化,osinit(),初始化系统所有的变量和数据结构。然后进行任务的创建,ostaskcreate();之后进行多任务的启动,osstart()。在进行任务的并行处理的时候,一个任务的程序是顺序执行的,而不同任务的程序却是并行执行的。从应用程序的观点来看,此处的并行处理只是一个假象。而实际上它是通过实时操作系统的内核控制任务之间的切换来实现的,也就是任务调度啦。

μcos-Ⅱ总是运行进入就绪态任务中优先级最高的那一个。当创建新任务时,或当前任务调用一些可能把自己挂起的系统函数(如osmboxpend)时,内核就要进行任务切换。在上述的场合,任务级的调度是由函数ossched()完成的。

在一个多任务的应用工程中,任务之间并不是完全独立的,它们存在一些需相互配合的处理,这些相互配合是靠任务间的通讯或同步,信号量、邮箱、消息队列可以实现这种任务与任务,任务与中断服务函数间的通讯与同步。

邮箱可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。而信号量不可以,其只能发送信号量。消息队列可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同,实际上,我们可以将消息队列看作多个邮箱组成的数组,只是它们共用一个等待任务列表。

我们实验所用的arm开发工具是ads1.2。armads全称为arm developer suite,是arm公司推出的新一代arm集成开发工具。现在ads的最新版本是1.2,支持软件调试及jtag硬件仿真调试、支持汇编、c语言、c++源程序,具有编译效率高、系统库功能强等特点。在安装ads1.2的时候出现过小问题,当时我的电脑是64位的,安装完之后显示不了,后来百度查找到原因,竟然是文件夹放错地方,应该放在program files(x86)这个文件夹中。后来有同学问我这方面的问题,但是发现他们的ads1.2安装不了的原因是因为licence弄错了。在打开codewarrior for arm developer suite的时候,一定要记得选debuginchipram,否则make都出现很多error,而且那些几乎都是未定义函数的错误。之后就进行debug,调试成功之后会跳出axd的界面,选择options里面的configuretarget,再添加h-jtag的文件,之后点击go,程序会跳出汇编语言的界面,再点击下就跳到c语言程序入口地址,之后再点击下go,程序就开始跑起来。前面所述的这些步骤是理想情况下程序自身没有发生错误,当然在调试过程中,还是有很多硬件上的问题,一方面是有些开发板可能用久了,用jtag并口连接的时候接触不良,很容易自动掉线,常出现未连接设备的的error,还有一方面是跑程序过程常会出现兼容性的问题,导致程序axd调试时候会出现卡在某个部分一直进入死循环,这个后来是解决了,但是偶尔还是会出现这个bug。

通过这学期对嵌入式的学习,我发现自己尚未掌握的知识点还是蛮多的,尤其是对μc/os-ii的移植方面,我只是理论上粗略了解,没有经过实验的操作。还有对存储器加速模块(mam)这方面不够了解,主要一方面当初在做消息队列采集实验(keysem_sampdataqeue),这个模块被代替掉,不需要使用它,所以后来也没有去掌握相关知识点。对于任务就绪算法这部分,我只是上课的时候听“懂”了,课后自己再看完全懵了。对于can总线调试的部分,老师上课没有讲到这部分的介绍与应用,但是后来通过自己对实验室师兄们所做的课题初步了解,发现我自己有必要去弄懂它的构造和原理。

“看书不要希望一次就会,一次就明白是什么意思,也不要死记硬背,看不明白也没关系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就记住了,遇到的少的,忘记也就忘记了。”依然记得当初不懂怎么解决某个问题的时候请教李硕师兄,师兄对我说的这番话。自己在μc/os-ii这部分内容挣扎了好久,现在想想,觉得当初不应该一上来就直接阅读内核源代码,看了一些自己把头撞破也想不明白的事,这样直接正面打击我学习嵌入式的积极性。学习啊,还是得要循序渐进。如果你想学习嵌入式一定要有块学习板。看再多的视频,看再多的书,也不如自己动手试一下,看着很简单的东西,做起来就可能遇到很多的问题,遇到问题找到原因,解决问题,只有这样才能学到东西。记得我第一次仿写led的驱动,想自己试一下,可是自己一试,就出了好多的问题,那个led弄了我一天才把led灯点亮。所以不要眼高手低。

对于初学者,有一点小建议,我们拿到一个开发板,很兴奋也很激动,想法自然也很多,想用开发板实现自己的这个想法,实现那个想法,然后又不知道从何下手,然后就去论坛中发一个贴,最后等着别人去回复,当见没人回复就开始抱怨。这种做法是不可取的,有想法是好的,我们要实现自己的想法也是有前提的,首先,我们对这部分知识了解吗?如果不了解就去google一下(最好别用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到问题,再去发贴问,这样也显得咱们有水平。比如自己连串口是什么都不太清楚呢,就问串口通信怎么做啊,就是人家把代码给咱,咱也不明白是怎么回事啊。见多识广,熟能生巧。多看代码,要从代码中读出代码的意思来。自己平时也要多写代码,多练习(这一点我做的不好,写的少)。

最后,我想说的是嵌入式系统的学习和研究一旦我们达到了一定的水平后,其实很简单,就是如何去看cpu和相关芯片的datasheet!

嵌入式学习心得体会篇4

现在的嵌入式工作是越来越盛行,而这方面的人员却是越来越少,所以学习嵌入式是解决找工作难的一个比较有效的途径。因为我开始踏上学习嵌入式的道路。听别人说嵌入式arm相比于其他的嵌入式fpga,dsp等都要难点,而且学习的内容量也是比较多。因此在学习嵌入式arm的初级阶段是随处碰壁,每天都在遭受打击,例如在移植bootloader时,虽然按照网上的一些方法移植成功了,但只知道复制和粘贴要修改的代码,却不知道为何要这么做。我觉得这样的学习态度是不对的,学习不是只求结果,而是要注重解决问题的过程!为了学习嵌入式linux我也在网上查阅了很多的书籍,还下载了很多的视频,但都不是很让人如意。它们大多是讲的很浅显,都是泛泛之谈,没有讲到最核心的东西。到了最后是浪费了我们学习者的时间和精力。

之后看见师兄有一本韦东山老师编辑的《嵌入式linux应用开发完全手册》,我就借了几天看了看,发现韦老师对嵌入式linux的极其深度的分析,让我一下子找到了能带我入门的一本书!并且还有配套的视频教学更是讲解地非常到位,将教材和视频相互配合的学习,更加大大的提供了学习效率,尤其是视频上讲解的内容,都是韦东山老师自己亲自授教,完全没有按照教材上的内容一一读出来,而是根据内核代码分析的教我如何编写自己的代码,尤其是在linux内核中占比例最重的一部分—内核驱动时,更是让我知道用户是如何通过应用程序来访问底层硬件的,解决了我长久以来都无法攻克的难题!例如在编写lcd驱动时,我对于书上lcd硬件工作原理不是理解的很透彻,通过观看韦东山老师的第二期视频中的“lcd驱动程序”,老师就像是站在我面前,在屏幕上用电子笔细细给我讲解,写出更加形象的lcd的硬件驱动,重要的是在整个视频中老师都没有按着教材念,而是一个教学经验丰富的老师在给同学们授课一样。

编写代码也是亲自编写,没有完全复制别人的代码,编写的同时不断的说明每条语句的作用、编程思想和设计程序的经验,还有阅读大量代码的技巧!在视频中老师教会了许多其他书本中没有提及到的重要知识。

嵌入式学习心得体会篇5

研究嵌入式系统已经有快两年的时间了。很庆幸自己当初选择了嵌入式系统作为自己的研究和职业方向,可以说它是一种催化剂,让我自身的修养和研究能力都有了很大的提高。

在嵌入式系统的大门前,我只能算是刚刚看到这个大门的台阶,但这段小小的距离让我受益颇多,现将其中心得奉献出来,欢迎高手前辈们指正,以供刚接触的新人参考。

在写之前,想先写一句话,千万不要以为你是天才,所谓天才即胜别人n倍的人,如果你真认为你是天才,请以天才的标准来要求自己,将自己付出和别人的比例以n:1来进行。

(1)学习与生活心态

很多朋友都是在刚步入大学校门开始接触计算机或者其他。大学是一个很让人迷茫颓废的地方,可能你在高中踌躇满志,但在大学的管理机制下却心态渐糜。能够在大学(大一)里找到自己人生之志的同学有多少?目标要明确,不要得过且过,不要追逐热门的东西。

不管在什么时候,心里都要有自己的信念和理想,不要被其他东西左右了自己。要从兴趣和竞争出发,因为这才是你产生动力源的地方。学东西时,要让自己先喜欢上它,要学会享受学习它的时间,喜欢乔xxx的都知道,乔老爷子最常说的一句就是要享受比赛的时间。

因为只有你喜欢上了它,享受了它,才不会被它所产生的压力压倒自己,不要产生一种厌恶的心理。而且心态要调整,不要一味的蛮学,死学,在没有什么兴趣学的时候可以先玩几天,在回过头来,或者用其他的方式来转换。要抱着一种十年方能磨一剑的心理,扎扎实实从基础开始,不要为高速开发的一些现象所迷惑,那些都只是软件的功劳。

我个人认为搞编程,英语和数学很重要,大家一定要时时的抓,至于怎么抓那就是另外一回事了,当然其他的知识也要汲取,可以多接触点天文,地理,人文方面的东西来补充自己。转换的生活方式。要学会生活,在人的一生中,都会遇到一些很不开心的事,或者大大小小的意外,孙子兵法里面一句大意就是说,战场上要会将劣势转成优势,即最大的劣势很可能就是你的优势所在。

一个打击你可以把他变为前进的动力,不必为了一点挫折和捶胸顿足,不必为了一点小事争吵不休。空闲的时候可以躺下来看看天,你就会明白自强不息,厚德载物之理。(看到一些为了失恋或者其他而堕落的人真的很难受和可惜)。

要给人以帮助。别人有困难时或者一些举手之劳在自己解决范围内的尽力帮之,这对自己不会损失什么,相反在对方心里能够树立你的形象和增加好感。记住,给人之恩时也是给你自己铺路,这个世界不是靠你一个人可改变的。

(2)编程语言的选择语言的争论。

很多初学择,老是在学习何种语言上举棋不定,试问,中国牌子有几个不被骂的,试问,世界上哪部影片没人说他坏话的?术业有专攻,各司其职,每个语言的出现肯定都有自己价值和领域的范围,不同的只是价值和领域的高级和大小。

就像高,矮,胖,瘦组成一个“型”。但是技术是进步的,这个进步也是在旧的基础上。放心,技术再飞跃也不会今天奔i,明天扣肉的迅速,在学习的同时也要时时关注整个语言界的走势(貌似哪个伟人说的与时俱进),保持一种同步曲线的前进。语言能干什么?能问这句话,很欣慰。

表明你是从基础学起才会问出这样的话来。但换而言之你一开始对这门语言调查的信息不足。庙算者胜,对自己身边的事物了解是非常重要的,这也能说明说你的教材或者教导你的人不够充分。如果是我对新手交流,我会花足时间让他明白这门语言是什么,能干什么,整个体系等等。

这样在学的时候,对同一条语句上的理解你可能跟别人就不一样了,因为你知道这门语言的体系架构,你可以从更多的特性角度去挖掘使用它。提高自己对语言阅读能力。如何快速的进步?可以告诉你没有一步登天的办法,但是也可以告诉你如何让你快速掌握你所学的技术。多读他人代码,多领悟他人思维,多给自己出难题,多几种方法来解问题,多将语言的思想和身边的事物联系起来。想想你是怎么掌握普通话的,方法就不具体说了。

编程的思维。计算机是充满诱惑的东西,很多人都说热爱计算机,那只是它的表面,你热爱的只是他的一种扩展性的东西。能学计算机我很高兴,因为计算机从某种意义上来说将空间的距离给消除掉了。这里没有流血,没有牺牲。你可以以一种艺术家的思维来塑造它,可以以侦探的逻辑思维来解决它,可以以一种战争狂人的思维来摧毁它。

你可以将你的这种思维体现在代码和整个布局里,不要惊异别人代码思维的异风,你也有自己的思维风格,你也可以,你也可以用自己代码让别人惊异。记住你学东西时更多的要体会他的思维,比如数学,微积分,离散,无数的定理,你学完以后可能永远都用不到,但是你可能有这种感觉,在你碰到某一问题时,这一问题的性质和你学到的东西很类似,但是中间就是差了一点东西,对了,这就是它思维上的一种运用,一种抽象,一种转换。

嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、pda、电子字典、可视电话、vcd/dvd/mp3 player、数字相机(dc)、数字摄像机(dv)、u-disk、机顶盒(set top box)、高清电视(hdtv)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。

看到了嵌入式系统的范围,你也应该知道嵌入式系统工程师是做什么的,就是开发上面的那些电子产品的工程师。

关于如何学习嵌入式?

学习嵌入式,该学习什么基本的知识呢?

首先c语言,这个是毋庸置疑的,不管是做嵌入式软件还是硬件开发的人员,对c语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用c语言,你说不掌握它可以吗?至于如何学习c语言,我想这些基础的知识每个人都有自己的方法,关键要去学习,看书也好,网上找些视频看也好。很多人会问,c语言要学到怎么样,我觉得这没有标准的答案。我想至少你在明白了一些基础的概念后,就该写代码了,动手才是最重要的,当你动手了,遇到问题了,再反过来学习,反过来查查课本,那时的收获就不是你死看书能得到的。

其次,应该对操作系统有所了解,这对你对硬件和软件的理解,绝对有很大的帮助。应该把系统的管理理解一下,比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的,当然,不是看书就能把这些理解透,如果不是一时能理解,没关系,多看看,结合以后的项目经验,会有更好的理解的。

还有应该学习嵌入式系统,如linux或者wince下的编程,这些对以后做应用的编程很有帮助,当然,如果做手机的话,那可以学习mtk、塞班、android等操作系统,android是以后发展的趋势,现在很热门,android也是基于linux系统封装的,所以建议先学习下linux。

还有,应该学习下单片机或者arm或者mips,很多人说我没有单片机的经验,直接学arm可以吗?我觉得那完全没有问题的,当然如果你学习过单片机,那最好不过了,以后学习arm就更简单了。

最后如果你把以上的知识都有所了解后,就该去阅读阅读一些优秀的代码,比如结合arm芯片手册学习去学习下uboot的源代码,了解下最小的系统开发,那对你整个嵌入式开发的非常有帮助的,可以的话,还可以学习下linux的源代码,当然如果你直接阅读2.6的代码,我想你会很痛苦的,可以先看看linux 代码早期的版本,比如0.12 的代码等等,麻雀虽小,五脏俱全,如果你全看完了,那我想你就是一名很成功的嵌入式工程师。

至于上面说的知识如何学习呢?每个人都应该去找自己最好的方法,所谓的最好的方法就是最适合自己的方法。很多人看不进书,那就去看看视频吧。视频也应该要选择,不是随便看看,应该要有所选择,有所挑选。我也是这样一路走过来的,不过我这人比较懒,我看不进书,一看书我就想睡觉,所以这几年我都是看视频过来的,现在也算学有所成,但也不敢说是高手吧。

我在网上看到,有人把自己学习嵌入式的视频总结出来,嵌入式系列实践和视频教程,大家可以看看网址我仔细看了觉得很不错,我本来也想整理下,可是奈何我自己的电脑硬盘空间才40g,没有办法,时间也是不够,心有余而力不足,我不是在帮他做广告,虽然要花钱,我觉得算不错,至少自己不用去整理和花大量的时间去找资源,当然如果网上有的下,你网速和硬盘都够的话,我建议大家自己网上下也好。想想我自己该开始学的时候,那时视频资源少之又少,我买书和买视频至少花了几千块,但是我觉得那很值,至少我现在赚回来了很多知识。

最后,希望这篇文章对热爱嵌入式,想致力于嵌入式开发的朋友有所帮助。送给大家一句简单而又朴素的话,坚持就是胜利,贵在坚持,也可以看看如何坚持嵌入式学习!

从实习到现在搞嵌入式开发快一年了,蓦然回首好像一年过得挺快,挺顺利的。细细品味,发现这一年还是有很多值得回忆和总结的东西。至少这一年看书挺多,大概二十几本,当然和那些一年看一百多本书的人没法比,但是我已经超越了自己。这是我大学毕业的第一年,初次走上社会,很想一展身手,可是。.。.。其实也不用可是了,和很多朋友一样碰了很多钉子,现在我和老板的关系就挺一般的,只是我性格还不错。呵呵~~,做优秀员工看来还得慢慢学。

今年最大的收获就是做了一个半项目,是在uclinux下面跑的。半个是snmp-agent的实现,因为我去的时候snmpd已经跑起来了,我只是实现部分管理功能;一个是基于web的管理系统,使公司的主打产品微波通信设备上网。这个项目是我一手策划,一手实现(界面设计是一位女同事,很优秀的程序员),从中学到的东西也最多,感情不可谓不深。

snmp即简单网络管理协议,其实一点都不简单。在我所知的网络协议里面,它仅仅比osi的cmip简单一点,而cmip直到现在还没得到广泛应用。我们能够实现snmp-agent不能不感谢carnegiemellon大学免费发布的ucd-snmp软件包。它使得开发人员专注于实现对特定设备的管理功能。

我在项目中的工作主要是扩展mib,实现相应的管理功能以及网络功能的扩展。我们公司的mib库比较庞大,但是程序运行还是挺快的。因为ucd-snmp软件包中大量使用回调函数,而且它将mib树以二叉树形式表示,但是每个结点不是单个的mib结点,而是一个表,包括了多个结点。回调函数和两层表示法的使用是操作快速的主要因素。

基于web的管理系统我原本是打算在设备外实现snmp-manager的功能,因为设备中已经嵌入了agent。这样管理人员可以在世界各地通过登录公司的管理平台,实现对所有设备的管理。但是老板想在设备中嵌入一个管理系统,可以通过管理单个设备就行。呵呵~~,这样工作又轻松了一点,就按老板的意思做了。

我用的http服务器是boa,它比现在市场占有率第一的apache速度要快。目前还只支持cgi,我就用c写cgi程序,古老了点。但是在开发过程中感觉用cgi比用现在流行的asp,jsp要爽,可以随心所欲,哈哈~~,而且这也是用cc++语言的优点。cgi程序很简单,它的输入就是标准输入,它的输出就是标准输出。boa在uclinux上面跑总要出点问题的,出问题好,出了问题我就能找到问题,一来一往,我对socket编程,i/o多路等编程技术了解也就越来越深了。

在linux下面搞了一年,不爱上linux都难,个人认为软件开发人员在linux下面进步是最快的。那么多优秀的开源代码供我们研究,犹如每天与世界上最优秀的程序员打交道,进步于不经意间。哈哈~~。正所谓“熟读唐诗三百首,不会作诗也会吟”。gcc编译器的优秀不用多说,我觉得写makefile也是很件开心的事。不推荐程序员搞开发都用ide,隔靴捎痒很不爽。但是linux缺点也很明显,听歌、看碟、玩游戏不如windows。恰巧公司的电脑没音箱,干脆我就懒得用windows了。

用linux而不讲开源是不道德的,我们程序员享受着开源的好处,自然也要为开源做点贡献。我开发的所有软件都开源,但是我也有个“怪癖”:不喜欢别人在我代码未完成的时候问我要源代码。

做嵌入式开发一年,稍稍有点心得。总结了一下,有以下几点经验:

1、不要玩linux。这一点主要是对像我这样在linux下面开发的程序员来说的。因为linux对程序员的吸引力很大,但它下面可以直接用的软件还是比较少。于是我们总想到网上找一些开源的软件装到我们的机器上,从无到有让人很有成就感的,呵呵~~。要是装上的不是最新版本的还不满意,于是又开始忙升级。在windows下这个过程大概没什么意思,全都next了。在linux下就不一样了,直接拿过来的源代码很多编译都不能通过,最新版本更是这样,得我们自己改,而且往往时改了又改。这个过程很花时间,我就在这方面浪费了很多时间,本来有个月工作比较轻松,打算阅读linuxkernel代码(也想成高手,呵呵~~),当时我机子上没有好的阅读工具,于是先弄了个sourcenavigator,觉得不够又装了个openoffice,然后又找来了几份不同版本的kernel代码。结果一个月过去了,一个文件夹还没看完。后面工作紧了,只能把看kernel当休息,直到现在才粗略看完fs,mm两个文件夹。

2、不要满足于c语言。c语言很优秀,也很简单。程序设计能力不等同于用c语言能力。嵌入式开发程序员要有扎实的数据结构基础,要积极的学习操作系统,积极的学习网络编程,要是想进行驱动开发还需要积极的学习硬件知识。

3、了解几种芯片体系结构。嵌入式不像pc领域x86一统天下,在嵌入式领域arm、mips、m68k等各显神通。例如arm7是没有mmu的,uclinux在它上面跑是最合适了,但是没有mmu我们也必须实现简单的mm功能,同时没有mmu一些常用库函数是不能实现的,这些嵌入式开发程序员必须要了解。

4、编写无错的c程序。关于这一点建议阅读stevemaguire的《writingcleancode》。我对ms没有好感,但这不影响我对ms里面大牛们的尊敬。嵌入式的调试是非常麻烦的,很耗时。虽然有gdbserver这类工具,但是你用的开发工具链中不一定包括它,而且就算用上了调试仍然是很花时间的。所以要是不想天天通宵调程序呢,那就要时时以编写无错程序为目标。

5、了解一点编译知识。这对编写高性能程序很有帮助。

6、学习设计模式。设计模式一般在高级语言中讨论较多,但是好东西应该大家一起分享。学习设计模式对提高我们的设计能力非常有帮助。用c语言也可以实现一些模式思想,例如我们常用的回调函数,就可看作是command模式的c语言版本。

7、要有前瞻性,要积极学习新技术。目前的嵌入式开发一般都是将pc应用加以剪裁,移植到嵌入式系统中。但是随着通信技术的发展,ipv6的广泛应用,设备上网是大势所趋。许多新技术有可能在嵌入式领域率先应用。把握住这个趋势,嵌入式程序员大有可为。

现在很多公司招程序员要求有嵌入式开发经验,其实本质上嵌入式开发和我们平常的开发没什么不同,只是要求严格一点。我写下这些希望对学习嵌入式开发的朋友们有所帮助。

嵌入式arm软件开发设计流程

一。项目总体任务描述:

设计gps/北斗接收显示终端平台,为数据的接收(nema格式),处理,图形显示等后端应用软件提供平台支持。

二。项目功能要求:

1、以pxa270微处理器配合lcd模块开发出独立的接收显示终端硬件平台;

2、在该硬件平台架构linux,

3.wince操作系统

三。嵌入式软件开发上手知识储备和开发流程

(注:由于我们开发时买了一个样机,这样可以节省我们项目开发中的许多时间和降低了开发的复杂度,我们在看资料的时候,作为学习时,可以认真仔细的看每个细节,但作为开发时,有时会碰到一些无关紧要的细节问题,这时可以采用黑匣子办法,只要会用就行了,我的理解是做项目时并不一定需要知道每个具体细节,要学会分清“系统学习”和“实践应用”的范畴。比方说,操作系统,我们只需要拿别人的一个样板来修改达到自己需要的要求就可以,而没必要自己去编操作系统,一般来讲,一个人自己去编写那东西是不大现实的。所以以下我都是从实用的角度出发,总节我这段时间arm的学习体会,从而让对嵌入式不了解的新手如何迅速掌握开发中的重点以及达到开发的能力。总之,我的理解是搞开发就是大量广泛看好的资料,一份好的资料可以节省你开发中的好多时间。不必等资料都看完再动手,那样时间不够,可以一边动手一边学习资料,需要什么方面的知识,不懂的当即查下看懂即可。)

嵌入式软件开发整体流程:

uboot启动代码的编写->各模块驱动程序的开发->操作系统的移植->应用程序的开发

以下是上手的一些基本知识储备:

1)汇编语言的学习可参见文件夹“我的arm”->“arm汇编指令”集,不需要都掌握,只要知道有哪些指令功能,用的时候查阅就可以了。这部分的学习对用汇编编写的“uboot”启动代码的理解比较重要,启动代码的详细介绍可参见“studyarmboot”这本书,里面讲的非常详细。(注:如没特殊说明,资料指的是都是“我的arm”文件夹里的资料)

2)c语言只需我们本科学的就够用了,大致过一遍应用时去查就可以了。没必要再深入系统的学习。搞wince操作系统移植的同学有必要把c++快速学一遍,掌握c++的三大特性(抽象性,继承和派生,多态),因为操作系统wince的程序代码都是按c++的编程格式组织起来的,如果不懂c++的那些特性,比较难看懂程序。这方面的资料请看见文件夹“vc++学习”,里面资料相当详细。

3)各模块驱动程序的开发。这方面首先要熟读芯片资料,要理解软件程序是怎样控制硬件的。(简单的理解就是往寄存器里写不同的值以驱使硬件实现不同的功能。)刚开始不必把芯片中的每个模块都搞透,只需熟悉一些常用的模块即可,比方说串口,i/o口,iic总线,lcd驱动控制和显示等等,这些跟我们当前的项目都是紧密联系的。看各个模块芯片资料的时候可以对照示例程序结合起来看,首先要理解这个模块的工作原理,然后看程序中每个寄存器所设的参数,边看边思考这些程序如果我用在其他的地方该如何修改。其他的模块的学习都是触类旁通的,关键是思路,可以把本科我们所做的单片机,dsp等实验联想结合起来。资料可参见文件夹“44b0实验资料”和“实验指导书”。

4)操作系统的移植。主要是理解操作系统的一些基本概念(如对信号量,锁,进程同步,进程间的通信,临界资源使用,驱动管理,文件存储等等),然后知道这些概念在程序中是如何反映出它们的功能的。我们以ucos-ii这个操作系统作为理解学习,具体资料参见文件夹“ucosii-en”,里面资料讲得非常详细。项目中要求的是用wince和linux两套操作系统,由于我们买了成套开发板,代码都有,我们要做的工作就是对它们进行修改和移植,所以只有当你了解了操作系统的一些基本概念,你才可能对它们进行修改。linux开发难度要大些,不仅操作复杂些,而且开发用的命令行的方式,这方面的资料可参考文件夹“linux学习”和“uclinux核心(中文手册)”,由于嵌入式大部分用的是嵌入式linux操作系统,从学习的角度来讲,这方面要多下功夫。

至于应用程序的开发,那就要看具体的应用了,这个难度不是很大。

一、嵌入式系统的概念

着重理解“嵌入”的概念

主要从三个方面上来理解。

1、从硬件上,将基于cpu的处围器件,整合到cpu芯片内部,比如早期基于x86体系结构下的计算机,cpu只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的162的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到cpu内部,还有pc机有显卡,而多数嵌入式处理器都带有lcd控制器,但其种意义上就相当于显卡。比较高端的arm类intel xscale架构下的ixp网络处理器cpu内部集成pci控制器(可配成支持4个pci从设备或配成自身为cpi从设备);还集成3个npe网络处理器引擎,其中两个对应于两个mac地址,可用于网关交换用,而另外一个npe网络处理器引擎支持dsl,只要外面再加个phy芯片即可以实现dsl上网功能。ixp系列最高主频可以达到1.8g,支持2g内存,1g×10或10g×1的以太网口或febre channel的光通道。ixp系列应该是目标基于arm体系统结构下由intel进行整合后成xscale内核的最高的处理器了。

2、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到rom中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如wince在内核定制时,会有相应选择,其中就是wordpad,pdf,mediaplay等等选择,如果我们选择了,在ce启动后,就可以在界面中找到这些东西,如果是以前pc上将的windows操作系统,多半的东西都需要我们得新再装。

3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的rom中就实现了一个真正的“嵌入”。

以上的定义是我在6、7年前给嵌入式系统下自话侧重于理解型的定义,书上的定义也有很多,但在这个领域范围内,谁都不敢说自己的定义是十分确切的,包括那些专家学者们,历为毕竟嵌入式系统是计算机范畴下的一门综合性学科

二、嵌入式系统的分层与专业的分类。

嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。

1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用c和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成cpld的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。

硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、c语言。

2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。

驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。

3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,xp操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。

4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及java方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于sip、h.323、astrisk)方面又较为复杂,并且有难度了。

三、目标与定位。

先有目标,再去定位。

学arm,从硬件上讲,一方面就是学习接口电路设计,另一方面就是学习汇编和c语言的板级编程。如果从软件上讲,就是要学习基于arm处理器的操作系统层面的驱动、移植了。这些对于初学都来说必须明确,要么从硬件着手开始学,要么从操作系统的熟悉到应用开始学,但不管学什么,只要不是纯的操作系统级以上基于api的应用层的编程,硬件的寄存器类的东西还是要能看懂的,基于板级的汇编和c编程还是要会的。因此针对于嵌入式系统的硬件层和驱动程的人,arm的接口电路设计、arm的c语言和汇编语言编程及调试开发环境还是需要掌握的。

因此对于初学者必然要把握住方向,自己的目标是什么,自己要在那一层面上走。然后再着手学习较好,与arm相关的嵌入式系统的较为实际的两个层面硬件层和驱动层,不管学好了那一层都会很有前途的。

如果想从嵌入式系统的应用层面的走的话,可能与arm及其它体系相去较远,要着重研究基嵌入式操作系统的环境应用与相应开发工具链,比如wince操作系统下的evc应用开发(与windows下的vc相类似),如果想再有突破就往某些音视频类的协议上靠,比如voip领域的基于sip或h。323协议的应用层开发,或是基于嵌入式网络数据库的开发等等。

对于初学者来讲,要量力而行,不要认为驱动层工资高就把它当成方向了,要结合自身特点,嵌入式系统四个层面上那个层面上来讲都是有高人存在,当然高人也对应的高工资,我是做硬件层的,以前每月工资中个人所得税要被扣上近3千大元,当然我一方面充当工程师的角色,一方面充当主管及人物的角色,两个职位我一个人干,但上班时间就那些。硬件这方面上可能与我pk的人很少了,才让我拿到那么多的工资。

四、开发系统选择。

很多arm初学者都希望有一套自己能用的系统,但他们住住会产生一种错误认识就是认为处理器版本越高、性能越高越好,就象很多人认为arm9与arm7好,我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的那个方向上走,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,那当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。

在某种意义上请,arm7与9的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如286和386。对于用户来讲可能觉查不到什么,只能是感觉速度有些快而已。

arm7比较适合于那些想从硬件层面上走的人,因为arm7系列处理器内部带mmu的很少,而且比较好控制,就比如s3c44b0来讲,可以很容易将cache关了,而且内部接口寄存器很容易看明白,各种接口对于用硬件程序控制或axd单步命令行指令都可以控制起来,基于51单片机的思想很容易能把他搞懂,就当成个32位的单片机,从而消除很多51工程师想转为嵌入式系统硬件arm开发工程师的困惑,从而不会被业界某此不是真正懂嵌入式烂公司带到操作系统层面上去,让他们望而失畏,让业界更加缺少这方面的人才。

而嵌入式系统不管硬件设计还是软件驱动方面都是十分注重接口这部分的,选择平台还要考察一个处理器的外部资源,你接触外部资源越多,越熟悉他们那你以后就业成功的机率就越高,这就是招聘时所说的有无“相关技能”,因为一个人不可能在短短几年内把所有的处理器都接触一遍,而招聘单位所用的处理器就可能是我们完全没有见过的,就拿台湾数十家小公司(市价几千万)的公司生产的arm类处理器,也很好用,但这些东西通用性太差,用这些处理器的公司就只能招有相关工作经验的人了,那什么是相关工作经验,在硬件上讲的是外围接口设计,在软件上讲是操作系统方面相关接口驱动及应用开发经验。我从业近十年,20xx年arm出现,我一天始做arm7,然后直接跑到了xscale(这个板本在arm10—11之间),一做就是五年,招人面试都不下数百人,在这些方面还是深有体会的。

我个人认为三星的s3c44b0对初学者来说比较合适,为什么这么说哪?因为接口资源比较丰富,技术成熟,资料较多,应该十分适合于初学者,有问题可能很容易找人帮且解决,因为大多数人都很熟悉,就如同51类的单片机,有n多位专家级的人物可以给你帮忙,相关问题得以很快解答,所然业界认为这款arm都做用得烂了,但对于初学者来,就却是件好事。

因此开发系统的选择,要看自己的未来从来目标方向、要看开发板接口资源、还要看业界的通用性。

五、如何看待培训。

首先说说我自己,我目前从业近十年,与国内嵌入式系统行业共同起步,一直站在嵌入式系统行业前沿,设计过多款高端嵌入式系统平台产品并为众多公司提供过解决方案,离职前为从事voip的美资公司设计ip—pbx,历任项目经理、项目主管、技术总监、部门经理,积累众多人脉,并集多年经验所得,考虑到学生就业与公司招人的不相匹配,公司想招人招不到,而学生和刚毕业的工程师想找份工作也不太容易,于此力创知天行科技有限公司,开展嵌入式系统教育培训。

因一线的科研人员和一线的教师不相接触,导至国内嵌入式人才缺乏,国外高校的技术超前于业界公司,而国内情况是业界公司方面的嵌入式系统技术要远远领先于高校。为架构业界与高校沟通的桥梁,把先进技能带给高校学子,为学生在就业竞争中打造一张王牌,并为业界工程师快速提升实现自我创造机遇,我就这样辞去了外企年薪20多万的职位,做嵌入式系统方面的培训了。

对于培训来讲,是花钱来买时间,很多工程师都喜欢自己学,认为培训不值,这也是有可能的,纯为赚钱的培训当然不会太有价值,但对于实力型的培训他们可能就亏大了,有这样一笔帐不知他们算过没有,如果一个一周的培训,能带给他们自学两年后才能掌握的知识,在培训完后他们用三个月到半年时间消化培训内容,这样他会省约至少一年半的时间来学其它的或重新站在另一个高度上工作,那么他将最迟一年后会拿到他两年后水平所对应的工资,就是在工资与水平对应的关系上比同批人缩短一年,每月按最少1千计,再减去培训费用至少多1.0万,同时也省了一年时间,不管是休闲也好,再继续提高也好,总之是跑到了队伍的前面了。

另一层面上讲,对于新人的培训相当于他们为自己提前买了份失业保险,有师傅会带领他们入道,我今年暑假时班里最年轻的一个学生是大二的,今年才上大三,这学期才刚学单片机,但现在arm方面的编程工作已经搞得有声有色了,再过一年多毕业,他还会失业吗?再者通过培训,你可以知道很多业界不为常人所知的事,同时也为自己找了个师傅,就比如说,两个工程师分别用s3c2410和pxa255来做手持设备,同样两人都工作四年,再出去找工作,两人工资可能最多可相差一倍,为什么?这就是业界不为常人所知的规则,2410属于民品,被业界用烂了,做产品时成本特敏感,当然也对人才成本敏感了,pxa255是intel的东西,一个255 cpu能买三个2410,一直被业界定义为贵族产品,用的公司都是大公司或为军方服务的公司,不会在乎成本,只要把东西做好,一切都好说,但这方面做的人也少啊,因为开发系统贵啊。

对于说为自已找了个好师傅,我想是这样的,因为同级工程师间存在着某此潜在的竞争关系,有很多人不愿意把自己知道的东西教给别人,这意味着他将要失业,就是所说的教会徒弟,饿死师傅,但对于我们这些人就不存在这样的关系了,我是在嵌入式系统平台设计上走到了一定程序,目前在国内这块的技术上已经是自己很难再突破自己,因此很多东西我对大家都是open的,就比如说下面那部分关于接口设计中所提到的时序接口东西,我要是不讲,却使是高级硬件工程师我想也几乎只有10%的人能知道吧。

六、成为高级嵌入式系统硬件工程师要具备的技能。

首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。

对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的modem射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在15k以上。

另一类就是数字部分了,在大方向上又可分为51/arm的单片机类,dsp类,fpga类,国内fpga的工程师大多是在ic设计公司从事ip核的前端验证,这部分不搞到门级,前途不太明朗,即使做个ic前端验证工程师,也要搞上几年才能胜任。dsp硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而arm单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互pk,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,比如pxa255处理器i2c要求速度在100kbps,如果把一个i2c外围器件,最高还达不到100kbps的与它相接,必然要导致设计的失败。这样的情况有很多,比如51单片机可以在总线接lcd,但为什么这种lcd就不能挂在arm的总线上,还有arm7总线上可以外接个winband的sd卡控制器,但为什么这种控制器接不到arm9或是xscale处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师把方案中的5v变1。8v的dc芯片,直接更换成ldo,有时就会把cpu烧上几个。前几天还有人希望我帮忙把他们以前基于pxa255平台的手持gps设备做下程序优化,我问了一下情况,地图是存在sd卡中的,而sd卡与pxa255的mmc控制器间采用的spi接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题,因此我提了几条建议,让他们更新试下再说。因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你终究能看明白多少,看不明白80%以上的话,说明你离优秀的工程师还差得远哪。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计pcb绘制,逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出ecad工程师,就是专业的画pcb板的工程师,和emc设计工程师,帮人家解决emc的问题。硬件工程师再往上就是板级测试工程师,就是c语功底很好的硬件工程师,在电路板调试过程中能通过自已编写的测试程序对硬件功能进行验证。然后再交给基于操作系统级的驱动开发人员。

总之,硬件的内容很多很杂,硬件那方面练成了都会成为一个高手,我时常会给人家做下方案评估,很多高级硬件工程师设计的东西,经常被我一句话否定,因此工程师做到我这种地步,也会得罪些人,但硬件的确会有很多不为人知的东西,让很多高级硬件工程师也摸不到头脑。

那么高级硬件件工程师技术技能都要具备那些东西哪,首先要掌握eda设计的辅助工具类如protelorcadpowperpcbmaplux2ise、vdhl语言,要能用到这些工具画图画板做逻辑设计,再有就是接口设计审图能力,再者就是调试能力,如果能走到总体方案设计这块,那就基本上快成为资深工程师了。

嵌入式学习心得体会篇6

4月10号,为期一个阶段的linux开发基础培训课程圆满结束,回首这些天所留下的点点滴滴,感触深深,学习上知识点的积累,灵活运用的过程中感受到了linux操作的快速高效性能,这也是我所追求的效率!

当初初涉培训课程的第一门课程时,都说linux操作很繁琐复杂,心里总有些顾忌,带着种种不安与些许拼博的决心,开始了自我提升阶段的“充电”,由徐海兵老师教授我们基础课程的培训,我们则像着小学生般认真的记着笔记,仔细听着并学会如何去在实践中运用所学的linux下的各种强大的命令集。

在unit 1中,徐老师详细生动的为我们讲述了有关linux的诞生、初成长以及辉煌的发展至今,今后应用范围则愈来愈广泛,讲解了为linux这个伟大的os做出巨大贡献的一位位出色的、伟大的人物,他们那种学习钻研的精神、锲而不舍的信念、勇于把握住难得的机会,从小处着手,踏踏实实的创造出了对人类科技发展做出卓越贡献的linux(unix)系统,他们的种种,都值得我们去深刻反省、刻苦学习、传承并永远发展下去。

查看ip地址和重启网络服务是我学的第一个命令: ifconfig eth0、ifconfig eth0 ip地址、service network restart。了解到远程登录软件可用xmanager。

securecrt是我们常用的,安装好后利用其登录到了red hat linux,需要知道linux主机的ip 地址。徐老师为我们介绍了重要内容:shell,即运行程序的程序,如echo $$shell可查看shell的环境变量是csh还是bash。指令pwd可查看当前所在路径,passwd:更改linux下的密码,仅限root用户有此权限,当然我们是利用虚拟机vmware程序来运行linux os的,懂得了如何设置虚拟机的网卡设置、暂停、恢复、全屏等。

简单的学习后进入unit 2,命令行的句法让我懂得了用法规则,一系列的命令功能强大:

date 显示当前年月时间星期之类的;

more指令与less重要但不常用;

cat用于查看短小的文件内容,常用!

mkdir命令用于在当前目录下创建新的目录;

ls 显示当前目录下所有文件;cd 更改文件路径,如cd 、cd . 当前目录;

rmdir 删除空文件夹;

rm指令很强大,用于删除空目录及非空目录下的。指定或全部文件;

man 真男人,帮助手册;

history指令用于显示编写过的命令集,以history 序号 可显示序号所指命令;

echo回写命令,很重要,我需要继续学习;

exit 指从多重shell退出来。

嵌入式学习心得体会篇7

从实习到现在搞嵌入式开发快一年了,蓦然回首好像一年过得挺快,挺顺利的。细细品味,发现这一年还是有很多值得回忆和总结的东西。至少这一年看书挺多,大概二十几本,当然和那些一年看一百多本书的人没法比,但是我已经超越了自己。这是我大学毕业的第一年,初次走上社会,很想一展身手,可是.....其实也不用可是了,和很多朋友一样碰了很多钉子,现在我和老板的关系就挺一般的,只是我性格还不错。呵呵~~,做优秀员工看来还得慢慢学。

今年最大的收获就是做了一个半项目,是在uclinux下面跑的。半个是snmp-agent的实现,因为我去的时候snmpd已经跑起来了,我只是实现部分管理功能;一个是基于web的管理系统,使公司的主打产品微波通信设备上网。这个项目是我一手策划,一手实现(界面设计是一位女同事,很优秀的程序员),从中学到的东西也最多,感情不可谓不深。

snmp即简单网络管理协议,其实一点都不简单。在我所知的网络协议里面,它仅仅比osi的`cmip简单一点,而cmip直到现在还没得到广泛应用。我们能够实现snmp-agent不能不感谢carnegiemellon大学免费发布的ucd-snmp软件包。它使得开发人员专注于实现对特定设备的管理功能。

我在项目中的工作主要是扩展mib,实现相应的管理功能以及网络功能的扩展。我们公司的mib库比较庞大,但是程序运行还是挺快的。因为ucd-snmp软件包中大量使用回调函数,而且它将mib树以二叉树形式表示,但是每个结点不是单个的mib结点,而是一个表,包括了多个结点。回调函数和两层表示法的使用是操作快速的主要因素。

基于web的管理系统我原本是打算在设备外实现snmp-manager的功能,因为设备中已经嵌入了agent。这样管理人员可以在世界各地通过登录公司的管理平台,实现对所有设备的管理。但是老板想在设备中嵌入一个管理系统,可以通过管理单个设备就行。呵呵~~,这样工作又轻松了一点,就按老板的意思做了。

我用的http服务器是boa,它比现在市场占有率第一的apache速度要快。目前还只支持cgi,我就用c写cgi程序,古老了点。但是在开发过程中感觉用cgi比用现在流行的asp,jsp要爽,可以随心所欲,哈哈~~,而且这也是用cc++语言的优点。cgi程序很简单,它的输入就是标准输入,它的输出就是标准输出。boa在uclinux上面跑总要出点问题的,出问题好,出了问题我就能找到问题,一来一往,我对socket编程,i/o多路等编程技术了解也就越来越深了。

在linux下面搞了一年,不爱上linux都难,个人认为软件开发人员在linux下面进步是最快的。那么多优秀的开源代码供我们研究,犹如每天与世界上最优秀的程序员打交道,进步于不经意间。哈哈~~。正所谓“熟读唐诗三百首,不会作诗也会吟”。gcc编译器的优秀不用多说,我觉得写makefile也是很件开心的事。不推荐程序员搞开发都用ide,隔靴捎痒很不爽。但是linux缺点也很明显,听歌、看碟、玩游戏不如windows。恰巧公司的电脑没音箱,干脆我就懒得用windows了。

用linux而不讲开源是不道德的,我们程序员享受着开源的好处,自然也要为开源做点贡献。我开发的所有软件都开源,但是我也有个“怪癖”:不喜欢别人在我代码未完成的时候问我要源代码。

做嵌入式开发一年,稍稍有点心得。总结了一下,有以下几点经验:

1.不要玩linux。这一点主要是对像我这样在linux下面开发的程序员来说的。因为linux对程序员的吸引力很大,但它下面可以直接用的软件还是比较少。于是我们总想到网上找一些开源的软件装到我们的机器上,从无到有让人很有成就感的,呵呵~~。要是装上的不是最新版本的还不满意,于是又开始忙升级。在windows下这个过程大概没什么意思,全都next了。在linux下就不一样了,直接拿过来的源代码很多编译都不能通过,最新版本更是这样,得我们自己改,而且往往时改了又改。这个过程很花时间,我就在这方面浪费了很多时间,本来有个月工作比较轻松,打算阅读linuxkernel代码(也想成高手,呵呵~~),当时我机子上没有好的阅读工具,于是先弄了个sourcenavigator,觉得不够又装了个openoffice,然后又找来了几份不同版本的kernel代码。结果一个月过去了,一个文件夹还没看完。后面工作紧了,只能把看kernel当休息,直到现在才粗略看完fs,mm两个文件夹。

2.不要满足于c语言。c语言很优秀,也很简单。程序设计能力不等同于用c语言能力。嵌入式开发程序员要有扎实的数据结构基础,要积极的学习操作系统,积极的学习网络编程,要是想进行驱动开发还需要积极的学习硬件知识。

3.了解几种芯片体系结构。嵌入式不像pc领域x86一统天下,在嵌入式领域arm、mips、m68k等各显神通。例如arm7是没有mmu的,uclinux在它上面跑是最合适了,但是没有mmu我们也必须实现简单的mm功能,同时没有mmu一些常用库函数是不能实现的,这些嵌入式开发程序员必须要了解。

4.编写无错的c程序。关于这一点建议阅读stevemaguire的《writingcleancode》。我对ms没有好感,但这不影响我对ms里面大牛们的尊敬。嵌入式的调试是非常麻烦的,很耗时。虽然有gdbserver这类工具,但是你用的开发工具链中不一定包括它,而且就算用上了调试仍然是很花时间的。所以要是不想天天通宵调程序呢,那就要时时以编写无错程序为目标。

5.了解一点编译知识。这对编写高性能程序很有帮助。

6.学习设计模式。设计模式一般在高级语言中讨论较多,但是好东西应该大家一起分享。学习设计模式对提高我们的设计能力非常有帮助。用c语言也可以实现一些模式思想,例如我们常用的回调函数,就可看作是command模式的c语言版本。

7.要有前瞻性,要积极学习新技术。目前的嵌入式开发一般都是将pc应用加以剪裁,移植到嵌入式系统中。但是随着通信技术的发展,ipv6的广泛应用,设备上网是大势所趋。许多新技术有可能在嵌入式领域率先应用。把握住这个趋势,嵌入式程序员大有可为。

现在很多公司招程序员要求有嵌入式开发经验,其实本质上嵌入式开发和我们平常的开发没什么不同,只是要求严格一点。我写下这些希望对学习嵌入式开发的朋友们有所帮助。

嵌入式arm软件开发设计流程

一.项目总体任务描述:

设计gps/北斗接收显示终端平台,为数据的接收(nema格式),处理,图形显示等后端应用软件提供平台支持。

二.项目功能要求:

1.以pxa270微处理器配合lcd模块开发出独立的接收显示终端硬件平台;

2.在该硬件平台架构linux,

3.wince操作系统

三.嵌入式软件开发上手知识储备和开发流程

(注:由于我们开发时买了一个样机,这样可以节省我们项目开发中的许多时间和降低了开发的复杂度,我们在看资料的时候,作为学习时,可以认真仔细的看每个细节,但作为开发时,有时会碰到一些无关紧要的细节问题,这时可以采用黑匣子办法,只要会用就行了,我的理解是做项目时并不一定需要知道每个具体细节,要学会分清“系统学习”和“实践应用”的范畴。比方说,操作系统,我们只需要拿别人的一个样板来修改达到自己需要的要求就可以,而没必要自己去编操作系统,一般来讲,一个人自己去编写那东西是不大现实的。所以以下我都是从实用的角度出发,总节我这段时间arm的学习体会,从而让对嵌入式不了解的新手如何迅速掌握开发中的重点以及达到开发的能力。总之,我的理解是搞开发就是大量广泛看好的资料,一份好的资料可以节省你开发中的好多时间。不必等资料都看完再动手,那样时间不够,可以一边动手一边学习资料,需要什么方面的知识,不懂的当即查下看懂即可。)

嵌入式软件开发整体流程:

uboot启动代码的编写->各模块驱动程序的开发->操作系统的移植->应用程序的开发

以下是上手的一些基本知识储备:

1)汇编语言的学习可参见文件夹“我的arm”->“arm汇编指令”集,不需要都掌握,只要知道有哪些指令功能,用的时候查阅就可以了。这部分的学习对用汇编编写的“uboot”启动代码的理解比较重要,启动代码的详细介绍可参见“studyarmboot”这本书,里面讲的非常详细。(注:如没特殊说明,资料指的是都是“我的arm”文件夹里的资料)

2)c语言只需我们本科学的就够用了,大致过一遍应用时去查就可以了。没必要再深入系统的学习。搞wince操作系统移植的同学有必要把c++快速学一遍,掌握c++的三大特性(抽象性,继承和派生,多态),因为操作系统wince的程序代码都是按c++的编程格式组织起来的,如果不懂c++的那些特性,比较难看懂程序。这方面的资料请看见文件夹“vc++学习”,里面资料相当详细。

3)各模块驱动程序的开发。这方面首先要熟读芯片资料,要理解软件程序是怎样控制硬件的。(简单的理解就是往寄存器里写不同的值以驱使硬件实现不同的功能。)刚开始不必把芯片中的每个模块都搞透,只需熟悉一些常用的模块即可,比方说串口,i/o口,iic总线,lcd驱动控制和显示等等,这些跟我们当前的项目都是紧密联系的。看各个模块芯片资料的时候可以对照示例程序结合起来看,首先要理解这个模块的工作原理,然后看程序中每个寄存器所设的参数,边看边思考这些程序如果我用在其他的地方该如何修改。其他的模块的学习都是触类旁通的,关键是思路,可以把本科我们所做的单片机,dsp等实验联想结合起来。资料可参见文件夹“44b0实验资料”和“实验指导书”。

4)操作系统的移植。主要是理解操作系统的一些基本概念(如对信号量,锁,进程同步,进程间的通信,临界资源使用,驱动管理,文件存储等等),然后知道这些概念在程序中是如何反映出它们的功能的。我们以ucos-ii这个操作系统作为理解学习,具体资料参见文件夹“ucosii-en”,里面资料讲得非常详细。项目中要求的是用wince和linux两套操作系统,由于我们买了成套开发板,代码都有,我们要做的工作就是对它们进行修改和移植,所以只有当你了解了操作系统的一些基本概念,你才可能对它们进行修改。linux开发难度要大些,不仅操作复杂些,而且开发用的命令行的方式,这方面的资料可参考文件夹“linux学习”和“uclinux核心(中文手册)”,由于嵌入式大部分用的是嵌入式linux操作系统,从学习的角度来讲,这方面要多下功夫。

至于应用程序的开发,那就要看具体的应用了,这个难度不是很大。

嵌入式学习心得体会篇8

嵌入式学习心得体会,4月10号,为期一个阶段的linux开发基础培训课程圆满结束,回首这些天所留下的点点滴滴,感触深深,学习上知识点的积累,灵活运用的过程中感受到了linux操作的快速高效性能,这也是我所追求的效率!

当初初涉培训课程的第一门课程时,都说linux操作很繁琐复杂,心里总有些顾忌,带着种种不安与些许拼博的决心,开始了自我提升阶段的"充电",由徐海兵老师教授我们基础课程的培训,我们则像着小学生般认真的记着笔记,仔细听着并学会如何去在实践中运用所学的linux下的各种强大的命令集。

在unit 1中,徐老师详细生动的为我们讲述了有关linux的诞生、初成长以及辉煌的发展至今,今后应用范围则愈来愈广泛,讲解了为linux这个伟大的os做出巨大贡献的`一位位出色的、伟大的人物,他们那种学习钻研的精神、锲而不舍的信念、勇于把握住难得的机会,从小处着手,踏踏实实的创造出了对人类科技发展做出卓越贡献的linux(unix)系统,他们的种种,都值得我们去深刻反省、刻苦学习、传承并永远发展下去。

查看ip地址和重启网络服务是我学的第一个命令:ifconfig eth0、ifconfig eth0 ip地址、service network restart。了解到远程登录软件可用xmanager。securecrt是我们常用的,安装好后利用其登录到了red hat linux,需要知道linux主机的ip地址。徐老师为我们介绍了重要内容:shell,即运行程序的程序,如echo $shell可查看shell的环境变量是csh还是bash。(学习心得 )指令pwd可查看当前所在路径,passwd:更改linux下的密码,仅限root用户有此权限,当然我们是利用虚拟机vmware程序来运行linux os的,懂得了如何设置虚拟机的网卡设置、暂停、恢复、全屏等。

简单的学习后进入unit 2,

命令行的句法让我懂得了用法规则,一系列的命令功能强大:date显示当前年月时间星期之类的;more指令与less重要但不常用;cat用于查看短小的文件内容,常用!mkdir命令用于在当前目录下创建新的目录;ls显示当前目录下所有文件;cd更改文件路径,如cd 、cd .当前目录;rmdir删除空文件夹;rm指令很强大,用于删除空目录及非空目录下的指定或全部文件;man真男人,帮助手册;history指令用于显示编写过的命令集,以history序号可显示序号所指命令;echo回写命令,很重要,我需要继续学习;exit指从多重shell退出来;linux账号下,可以增加用户、删除用户、设置密码:useradd、userdel、passwd。

注:所有的用户的家目录都在/home下面,唯独root的家是在/root.点文件都是些shell的脚本程序,也称隐藏文件;环境变量常见的有:home path pwd,懂得了绝对路径与相对路径的对比概念。

最后进入unit 3、

文件与文件处理的学习中,知道了linux下支持的六种文件类型:普通文件、目录、设备文件、命名管道、符号链接、socket;linux下文件系统的组织:倒立的树形结构:/ /bin /boot /dev /home /lib /proc等文件目录,ls –l指令很好很强大,显示文件类型与权限、所有者、字节大小、时间及文件名;touch可创建空文件,复制文件用指令cp,可选-i、-r等;重命名文件使用mv [-i];du显示当前目录所占空间大小;wc命令显示列表中文件的行数、字数、字符数;追加:cat [文件列表] 》目标文件;find指令与grep重要,暂未学习,自己在实践中学习,文件访问权限有:r w x;chmod指令可修改访问权限,如chmod 777 -r文件名。

输入输出重定向每个命令默认打开三个文件:标准输入stdin,标准输出stdout,标准错误stderr,键盘为标准输入,而控制台则是标准输出,文件描述符分别是0,1,2;最重要最常用的为输出重定向>与错误重定向2> ;echo添加的内容>/ 》文件;linux过滤器和管道:管道操作符:| ;即将某个命令的输出与某个命令的标准输入相连接,从而实现管道功能,例如ls –l |wc;管道和重定向操作符可同时用于一个命令行。