嵌入式的学习过程
实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条件。所以我想学习嵌入式要从个人的知识背景和现实条件出发。订立合适的阶段目标,在允许的条件下多动手多思考。 一般情况下对于硬件设备是比较短缺的。但是可以从软件方面和嵌入式系统开发模式上下功夫,提醒大家一点,嵌入式系统开发设计的内容知识很多,所以大家不要乱,在了解嵌入式系统开发的体系结构后,一步一步的下手,最容易上手的是linux下的C,比如ucos(有开放源代码),虽然可能无法在硬件上仿真,但也不必着急。wince,palmos上手都很容易。无论对于初学者还是自以为是高手的人来说,编程水平(这可不受硬件条件限制)绝对是没有止境的,有了较高的编程水平(嵌入式主要是C,当然OO的几种语言c++,java是发展趋势),等到有机会的时候及时的补充硬件知识,会很快的成为高手。 还有,一定记住,学习嵌入式,”要想办法,不要找理由“。当年在dos下用tc编程时的条件,现在回想起来建筑就是奇迹。 我推荐一条发展道路吧,仅供参考, 1、C开发经验 条件:linux(这都有吧) 方法:随便,主要是掌握ansiC编程(不包括gtk,qt等图形可视化开发) 2、网络、操作系统、体系结构 条件:linux,各种书,算法、例程。 方法:通过C编程实现简单的网络等知识的算法和过程。 3、嵌入式系统概念 条件:各个嵌入式网站,讨论组,书籍 方法:少提问(尤其是等着天上掉馅饼,这主要是防止增长惰性,也解决不了实际问题),多思考。 4、嵌入式开发实践 条件:各种嵌入式系统开发工具的demo版(或者D版,如果有的话),包括编译器,仿真器。可以找高手们要,也可以下载。 方法:这里有两个分支,一个是基于mcu/dsp的嵌入式系统开发,一个是象palmos,wince,ucos等rtos下的应用软件开发。对硬件感兴趣,想成为真正高手的由第一个分支入手,以后进入第二个分支;如果十分厌烦硬件,只想停留在软件开发上的,可以只由第二个分支入手,以后就和pc上的开发没有什么本质上的区别了,找份不错的工作应该没问题,可以不用进行下面的步骤了,感兴趣可以参考第6条。 5、硬件开发 条件:各种嵌入式芯片、存储器等电路器件,protel99等电路设计软件,电路板制作。 方法:这时候该有开发条件了,最起码是51系列,这个比较方便。电路的设计内容较多,不过看起来吓人,实际上比软件要简单的多。只要下功夫,实践会告诉你一切。 6、硬件工程/软件工程/项目管理 条件: 各个芯片详细资料和使用经验,软件工程知识,项目管理知识,培训,大型项目参与经验 方法:已经是高手了,但是学无止境,沾沾自喜于已有的知识是致命的。那个下一步。。。,你该是管理者了。 抛砖引玉,以上出自我的经验,欢迎各路高手们补充,初学者提问。 为了技术,一路狂奔。。。 我来补充几点. 要想成为高手中的高手,最好从钻研如下领域修炼: 1,分析一种RTOS的源代码--UCOS最容易; 2,分析一种通讯协议栈的实现方式--TCP/IP最实用; 3,精通一种DSP的开发集成环境--TI CCS2.1最优秀,精华在其内带的RTOS; 4,精通一种单片机的开发集成环境--keil C最经典; 5,精通一种MCU的开发集成环境--ADS 1.2最流行;
要想成为大师级人物再从如下领域开始修炼: 1,精通一种系统建模语言和工具--Telelogic tau SDL/UML suit最经典; 2,精通一种算法仿真工具--Matlab simulink 最便宜; 要想检验一下自己是否到达了至尊级人物,可以做如下的事: 动手搭建一套红外或者蓝牙通讯原型系统,模拟前端可以用现成的,基带用DSP,主控用个32BMCU,DSP和协议软件自己写。当然不可能做全,做个子集就可以了。 如果能到这个地步,打住吧,该改行去做市场了。做个一、二年市场,你不自己去创个业就太浪费了。 应该分为能力和经验两方面: 能力篇—— 流程意识:一个嵌入式软件项目的流程大体如下:项目架构设计(需求分析、架构设计、Feature List)、各模块的设计(需求分析、接口设计、详细设计、模块测试)、集成测试(集成、测试、bug fix)。第一个阶段是主要是架构部门和project leader的事情,第二阶段主要是研发人员的工作,第三阶段主要是测试人员进行,同时研发人员负责bug fix。每个阶段结束都会进行EAR(End Approve Review),由committee投票决定该阶段是否顺利结束。在项目的初始阶段,研发人员还必须参与FMEA(Failure Mode and Effects Analysis)、列项目3级计划等工作。 质量意识:主要包括文档质量和代码质量。每一篇文档编写完毕,必须进行review和WAFI,才能正式发表。代码也必须进行review和代码检测工具的检查,才能算通过。 设计能力:这是最难修炼的一个能力,一般需要很多的项目实际经验加以提炼才能设计出好的模块。不过常见的模块都有一些共同的东西,比如buffer控制、状态控制、出错控制,一般代码的划分主要依据是对上对下的接口、自己的内部实现,或者按此模块的功能来划分。 代码编写能力:一般而言,设计作好了,代码编写并不难。但实际编写过程中,也有一些注意事项,诸如代码编写规范,一些不能犯的错误,一些小的技巧等,都需要实际经验的积累和总结。 bug调试能力:这个说难也难,说不难也不难。该工作主要需要极强的逻辑思维和问题分析、解决能力。不过在集成阶段发现的问题一般比较隐蔽,很难查。这个时候,需要使用各种调试工具(如Trace, Trace32, ETM等),来对问题进行分析和定位。不过就驱动软件问题而言,一般也有其思路。先查硬件、各个管脚信号(供电、reset、中断),再根据现象,分析出具体是软件哪个模块出了问题(比如替代法:有的模块用旧的,有的模块用新的,确定问题出现的范围)。一般新手先做这个,也有一些国外公司的技术支持主要做这方面的工作。 经验篇—— 就是指做过的实际项目。就手机驱动软件来讲,主要可以分为以下几类: multimedia:主要包括audio,video。这是手机目前最主要的模块之一。Video方面的工作主要是LCD、sensor的porting,codec(视频编解码)的驱动编写,因为一般编解码由硬件实现,固需要对其编写驱动以便上层应用程序调用。需要对MPEG4、H.263、H.264等编码方式有一定的了解。 connectivity:包括UART、USB、BlueTooth,也是很新的东西。一般而言,手机的USB、蓝牙等协议栈的东西都由第三方提供,手机公司主要一起做集成和接口编写。这也是公司专业化的体现,做自己擅长的。 storage:主要包括nand flash、nor flash、SDRAM等驱动的移植。还有基于其之上的文件系统(不过一般而言,专业的文件系统一般也由第三方提供)。这是手机驱动里面的基础,只有这些工作做好了,剩下的工作才能进行。 power management:主要包括charging、power saving、以及给各模块供电等。随着手机功能越来越复杂,再没有更高能量的电池出现之前,省电(power saving)也显得越来越重要。省电的原理也很简单:谁不工作的时候就不给谁供电。但做起来很复杂。 ARM related:还有一些共有的经验,就是对嵌入式CPU的熟悉和了解,如ARM,PPC,MIPS等。也有一些共性的东西,比如GPIO的配置、EXTINT的配置、memory的配置等。还有ARM与别的芯片的连接接口,常见的有UART、IIC、SPI、EBI等。不同的接口有不同的协议特性。这些都需要熟悉和了解。 其他一些非技术能力—— 领导力:如何带领和激励团队,如何制定目标和严格执行,如何人尽其材,让团队中的每个人都发挥他应有的作用,如何在团队中确立权威和声望,如何和每一个人和谐相处等等。 团队协作:有很多工作需要几个人一起完成。这时候需要与别人的合作。比如跟Driver常打交道的包括上层软件开发人员、硬件、DSP、ASIC等。只有跟大家关系搞好了,才能把工作做好。 自我激励:严格按照计划进行工作(每天要填project management,记录今天工作的主要内容),是提前完成还是要delay?工作时专心致志,积极思考。 后记:这些全掌握了,应该做到什么位置,拿多少薪水?相信也高不到哪去。呵呵 做技术就是一条漫漫不归路。。。 你真的下定决心了吗?
转载于:https://www.cnblogs.com/proteus/archive/2011/10/27/2226744.html