驱动工程师_驱动工程师主要做什么的 - CSDN
精华内容
参与话题
  • 驱动工程师需要的技能

    千次阅读 2014-03-04 13:55:52
    七月流火,九月授衣。上海的天气热的让人喘不过气,夜晚闷热难耐,天生又不愿去闲逛...这段时间也开始真正的了解认识到驱动以及芯片开发的大致情况,在此写出来希望能对想了解或进入这个领域的有所帮助。 进入正题,了

    七月流火,九月授衣。上海的天气热的让人喘不过气,夜晚闷热难耐,天生又不愿去闲逛只宅在屋内。这样的天气很容易让人感觉时间的漫长,头脑反应也变慢,发呆回忆。希望这段让人不爽的时间能留下点有用的记录吧。转眼到新工作已经有三个多月了,期间从一开始的无所适从到现在入门真是感觉成长很多。这段时间也开始真正的了解认识到驱动以及芯片开发的大致情况,在此写出来希望能对想了解或进入这个领域的有所帮助。

     进入正题,了解驱动工程师需要的技能还是从公司的需求开始看,以下是本人从网上截取的一则招聘驱动工程师的简章:650) this.width=650;" src="http://img1.51cto.com/attachment/201307/215344638.png" title="QQ截图20130710215314.png" />

    这是一家具有代表性的公司,从中可以看到一些重要的细节,可以总结出一些技能需求的类别。

    第一:工具语言的需求,虽然没有明确具体的写出来,但是里面细节包含了对于C C++语言的需求。没有C语言基础是肯定不能完成的。

    第二:内核的了解,这里的驱动指的不是通用的TI ADI 等公司的DSP ARM器件的驱动,这是对于自主开发定制的专用芯片的驱动,里面的内核也不一定就是ARM,有可能就是LEON ARC 等小内核,这样的驱动就需要对内核interrupt  catch 等了解。

    第三:嵌入式系统的了解,现在的系统复杂度越来越高,不移植系统进行人物调度单纯靠造的队列解决任务冲突是非常困难和不划算的,毕竟像UCOSII这样的微小系统对于个人是免费,商用虽然收费不过国内大环境下还是相当于免费。

    第四:补充工具需求,很多可以让开发提速的工具都是掌握一周就会效率飞速提升的,例如脚本语言,windows下的bat  linux\windows 下的perl python 。驱动开发中遇到的编译器会有GBK UTF8 UTF16 等语言格式,同一种编译器不同的版本之间也会出现这样的转化需求。matlab可以转化但是做经常的调试转化开关matlab是非常浪费时间,大小端的转化更是常见,编译器生成的bin文件到FPGA吃的.txt文件之间的转化,脚本不会真的不能称之为软件工程师。

    第五:语言,此语言就是说英语了 。在芯片设计开发中最常见的就是核心IP自己开发,外设模块都是购买新思等专业IP提供商,但是这里存在一个很大的问题就是IP的出售许可和售后是分开的。也就是说如果想用起来,遇到问题去咨询一般是按天收费的,价格也会非常的高。这样就要求必须在所提供的资料中挖掘出足够的细节知识,将IP驱动好。designware是提供的说明文档,也是驱动能依赖的唯一资料。读不懂就要花钱去付费咨询了。

    当让除了以上的五条外还有些心态,态度等,这些就得靠时间慢慢磨了。

    本文出自 “风雨如晦鸡鸣不已” 博客,谢绝转载!

    展开全文
  • 如何成为优秀的驱动开发工程师

    千次阅读 2016-08-05 14:28:39
    作者:刘旭晖 Raymond转载请注明出处 Email:colorant@163.com BLOG:http://blog.csdn.net/colorant/ ... 或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许

    作者:刘旭晖 Raymond转载请注明出处

    Email:colorant@163.com

    BLOG:http://blog.csdn.net/colorant/

    主页:http://sites.google.com/site/rgbbones/

     

           或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标。认识肤浅的地方,还请大家见谅。

     

           何谓优秀的驱动开发工程师
           首先要定义,我所认为的一个优秀的驱动开发工程师,应该具备什么样的能力,这里列一下按照从易到难的顺序,个人认为应该会有几个方面的要求吧:
           1、能够独立完成驱动的功能开发任务
           2、能够分析和优化驱动的性能,针对特定硬件扬长避短
           3、能够充分了解模块相关软硬件能力、发展方向,辅助应用工程师最大化利用硬件能力
           4、能够辅助硬件工程师规划硬件设计,预防问题,谋求功能模块的最佳方案
           5、能够协助定义系统架构,合理规划软硬件,谋求产品实现的最佳方案
     
           作为一个驱动工程师,很多时候不是完全从头开发一个完整的子系统,而是针对特定硬件和平台移植驱动,增加功能,解决Bug等等,如果从这方面外在的表现来看:
     
           解决问题的境界,大概会有这么几个阶段:
           1、不知道哪里存在BUG
           2、不知道如何解决BUG
           3、知道如何解决BUG
           4、 知道如何发现BUG
           5、 知道如何规划BUG
     
           知道如何发现BUG(而不是撞上BUG)其实并不简单,需要你对系统有足够的了解,能够察觉可能出问题的地方。 而规划Bug更难,需要你能对问题的轻重缓急做出准确的判断。没有的完美的世界,只有适当的取舍,规避和预防。
     
    而从解决问题过程的角度来看,我认可以分为几个阶段:
     
           1、BUG发生 -> 大量跟踪调试代码 -> 终于发现并解决BUG
           2、BUG发生 -> 理论推测可能原因 -> 迅速定位并解决BUG
           3、 阅读代码 -> 预测可能出现的BUG -> 证实并解决BUG
     
           号称能光凭瞄一遍代码就找到问题的高手,我想我是没希望了。


          应该具备怎样的素质
          那么要达到上诉最佳境界,需要具备和发展哪些素质和能力呢?
     
           足够的硬件知识
           能看简单的原理图,能够分析硬件异常的可能原因,能够使用常见的硬件调试工具,我想这是做为优秀的驱动工程师,区别与其它软件工程师,所不可避免、必须具备的专业素质。当然取决于你具体从事的工作,对这方面的要求不尽相同。
     
           对于驱动开发者来说,不了解所开发驱动外设的硬件原理和相关背景知识,也许很多时候,也能够完成一些移植,修补的工作任务,但这就好比无源之水,无根之木,我相信是很难走远的。
     
           多多益善的操作系统知识
           做驱动开发,特别是纯粹的外设的驱动移植工作,刚开始的时候,也许你并不需要了解很多操作系统本身的知识(像内存管理,进程调度,锁,各种内核子系统的原理框架等等),也能顺利完成手头的一些工作。
           但是,如果一但需要优化驱动,需要完善软件框架,或者是遇上疑难问题需要跟踪解决,对操作系统,内核本身的了解,就体现出它的价值了。
           对于Linux内核驱动开发者,尤其如此,首先,代码是完全开源的,你有条件去了解背后的运行机制,其次,Linux内核和各个组成子系统总是在迅速的进化发展中,不进则退,你也有必要跟上时代发展的脚步。


           强烈的好奇心,持续的热情
           如果驱动开发不仅仅是你的爱好,更是你养家糊口的途径,我想,很多时候,你大概不会有机会专注于一两个你最有经验的模块的开发和维护。随着能力的成长,势必会要求你接触和掌握越来越多的各式各样的驱动模块的开发。
           对于这件事,包括我自己,有时候大概都会有如下几种反应:
     
           哇,原来的工作做太久了,太乏味了,很高兴能做不同的工作。
           啊?又要做别的模块啊?我手头的工作已经太多了!
           这个模块没意思,我不想做。
     
           相信多数有志青年们都是第一种表现了 8 )不过,有些时候,我发觉,很多人的这种热情其实并不持久,一个新的模块没做多久,就再次厌倦了,是已经炉火纯青了么,未必,或许只是修改了几个BUG以后不甚其烦。很多时候,我面试前来求职的工程师时,发现简历上这个也做过,那个也做过,但是一但问到解决了什么问题,所做过的驱动,框架、流程、原理之类的问题的时候,就一问三不知了。
     
           我觉得如果自己的目标是优秀,那么最起码的标准应该是对具体驱动模块相关的子系统的整体工作流程,框架,具备足够的好奇心,乐于去了解和学习,而不仅仅是为了完成任务而工作,否则的话,很难积累下扎实的经验和技术。


           清晰的逻辑思维能力
           这一点,也许是个软件开发人员都应该具备吧,不过,做为驱动开发工程师来说,有时候,大多数情况下,工作的硬件环境并不是完美的,遇到问题需要分析判断错误的原因是硬件问题还是驱动Bug,这时候,清晰的逻辑思维能力尤其重要。


           良好的工作习惯
           大多数人都不是天才,要成为优秀的开发工程师,一需要持续努力,二需要时间积累经验,而这过程中,很重要的一点,就是要有良好的工作习惯。譬如,注意设计文档的维护,对工作中遇到的问题的记录,过往经验的及时记录,适当的软件开发流程等等。文档工作,可能很多人很不愿意去做,它的确很花费时间。不过,唉。。。老啦,好记性不如烂笔头啊   8 )。 当然,其实设计文档更多的是为你提供思考的机会,而过往经验的总结,也可以起到和大家交流技术,共同进步的目的。
     
           英语
           这个也是必须的啦,没有办法,邮件列表,技术文档,社区,精通英语肯定是很大的优势,做开源项目尤其如此。阅读各种Spec标准文档之类的速度还是很重要的。阅读无障碍是一回事,能和母语一样一目十行,那才爽呀,唉,人生苦短,效率啊!光读文档,就不知道要比老外多花多少时间。。。。

    展开全文
  • 驱动工程师的面试问题。

    千次阅读 2012-01-31 20:20:52
    1.NT和WDM驱动的区别 1.NT式的驱动要导入的头文件是NTDDK.H,WDM式的驱动要导入的是WDM.H。 2.NT式不支持即插即用,通过服务来手动加载;WDM是即插即用, 通过inf来加载。 3.WDM在设备创建和PNP消息处理上有区别...

     

     1.NT和WDM驱动的区别

    1.NT式的驱动要导入的头文件是NTDDK.H,WDM式的驱动要导入的是WDM.H。

    2.NT式不支持即插即用,通过服务来手动加载;WDM是即插即用, 通过inf来加载。

    3.WDM在设备创建和PNP消息处理上有区别。

    2.windows驱动的通信的三种IO方式 

        在和驱动通信过程中,我们一般都会碰到应该选择何种类型的缓冲类型进行通信。本文将简要的介绍一下这3中类型的IO缓冲。 我想用的最多的就是 缓冲区设备读写(Buffered)这种IO进行的。现在来说说IO manager是如何对这3中类型的IO进行处理的。

    1.IO manager接收到由上层下发来的请求,这里假设这个请求既包含有输入缓冲,又有输出缓冲。这个看看DeviceIoControl中的参数中就可以既包含输入缓冲,又可以有输出缓冲。 
     
    2.IO manager检查这个IRP是何种类型的。如果是缓冲区设备读写(Buffered)的,那么IO Manager就会在NonPagePool中分配一个输入缓冲和输出缓冲之间最大的一个;如果是 直接读取设备(Direct)形式的,那么就会首先将上传传下来的缓冲创建一个MDL给IRP。而如果是Neither类型的,那么直接就使用应用层传下来的缓冲。 
     
    3.IO manager将IRP分派给指定的驱动进行处理。 
     
    4.驱动中根据IO类型,得到合适的缓冲地址。如果是 缓冲区设备读写(Buffered)的,那么就是IRP的InBuffer和OutBuffer共同使用SystemBuffer;如果是 直接读取设备(Direct),那么Inbuffer 和OutBuffer使用MdlAddress;而如果是Neither那么就使用Type3Buffer(InBuffer)和UserBuffer(OutBuffer). 
     
    5.驱动返回,这里自然就是将IO manager分配的内存中的OutBuffer拷贝给应用层的Buffer中了。 
    不过有些事需要值得注意的几点: 
    1.用户层传下来的如果是 缓冲区设备读写(Buffered)类型的,那就直接使用即可。如果是直接读取设备(Direct)类型的那么需要注意的是,在使用的时候需要将虚拟地址锁内存中进行使用。如果是Neither,因为这个是应用层的虚拟地址,而且这个虚拟地址是有进程上下文限制的,使用这个的时候务必使在指定的进程上下文中进行操作,如果不在制定的上下文可是使用KeStackAttachProcess 将驱动Attach到指定进程上面,然后在进行操作,不过要记得KeUnstackDetachProcess进行Detach。 
     
    2.在进行缓冲移动中,如果是很大快内存,那么最好是使用MDL的方式。因为缓冲区设备读写(Buffered)使用的是NonPagePool中分配内存,系统的NonPagePool是有限的,如何使用这种方式会降低系统性能。也可以使用Neither的方式,缺陷上面已经说了。 

    3.一些基本的C语法

    static在声明局部变量时和在声明全局变量时的区别:
    1.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
     
    2.static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中声明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中声明,要使用这些函数的源文件要包含这个头文件。
     
    3.static全局变量与普通的全局变量有什么区别:
    static全局变量只初使化一次,防止在其他文件单元中被引用;
    4.static局部变量和普通局部变量有什么区别:
    static局部变量只被初始化一次,下一次依据上一次结果值;
    5.static函数与普通函数有什么区别:
    static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
    6.程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
    
    7.__cdecl(俗称C调用),__stdcall和__fastcall三种调用的不同点,他们作为函数的调用的三种方式,我们通过小例子来说明:
    
    int __stdcall test2(int a, int b)
    {
        return 0;
    }
    
    int __cdecl test(int x, int y)
    {
        return x + y;
    }
    
    int __fastcall test3(int x, int y)
    {
        return x + y;
    }
    
    int main()
    {
        int a = 8, b = 2;
    
        //
        // __cdecl
        //
        int c = test(a, b);
    
        //
        // __stdcall
        //
        c = test2(a, b);
    
        //
        //    __fastcall
        //
        c = test3(a, b);
    
    
        return 0;
    }

    上边的三种函数调用方式,如果默认,编译器会默认使用__stdcall的调用方式,对于
    __cdecl这种调用方式,一个很大的特点就是,调用完成后,由谁了完成栈的清理工作,通过反汇编上述代码,
    我们可以得到答案,这个必须由调用者自己执行 add esp,X;这个X由你的参数的个数决定的。
    

    __stdcall的调用方式则与这种不同,调研前:

    当进入函数体后:

    我们可以清楚的看到当函数返回的时候,执行了 ret X,这个X同样与参数的个数有关的。
    __fastcall的也有自己的特点,我们从名字看就发现有些不一样了,fast调用,很快的哦,那么怎么样才能
    快呢?一切取决于它在参数个数少于3时,使用寄存器传参数,这样会避免由于参数压栈带来的时间的开销。

    这里是它自己与其他两种的调用方式的不同,那么它清栈的方式呢?

    从这里我们可以看到,由于前两个参数传递使用的是寄存器,所以在返回清栈的时候,同样使用ret X;
    只不过它与参数的个数有关。


    4.描述Event,Mutex,Semaphore三种对象的区别和联系

        1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使 用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。

        2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但 对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和 线程退出。

        3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根 据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数 器。

     

    5.中断和异常的区别

    一、中断:系统停止当前正在运行的程序而转向其他服务,可能是因为优先级高的请求

    服务了,或者是因为人为安排中断。中断是属于正常现象。  
    异常:是由于软件错误而引起的

    二、中断是CPU所具备的功能   --   硬件  
    异常是软件运行过程中的一种开发过程中没有考虑到的程序错误   --   软件  

     

    展开全文
  • 驱动工程师不要成为了配置工程师

    千次阅读 2013-03-31 12:09:16
    惊醒自己!!
    惊醒自己!!
    
    展开全文
  • 驱动工程师

    2020-03-17 18:43:12
    1.内核和用户空间的通信? 2.、写个字符设备需要什么? linux内核内存的分布: Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。...
  • 有些驱动工程师比较肤浅,对什么的了解都只是泛泛了解,不深入。 所以要做一个合格的驱动工程师应该了解的具体一些,不要只是知道改哪里就完事儿了! 要有打破砂锅问到底的精神 还有就是学习别人的优点 比如说小...
  • 本文收集了来自Q(群)友、本人面试中碰到的和网上收集的一些关于嵌入式linux驱动开发面试/笔试题,同时根据相关资料和自己的经验对这些面试/笔试题进行解答,如有不对之处,请不吝指教!
  • 或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理...C1、嵌入式软件开发工程师 C2、嵌入式硬件开发工程师 C3、嵌入式
  • 领导驱动,产品驱动,运营驱动还是工程师驱动

    千次阅读 热门讨论 2011-03-23 08:11:00
    领导驱动,产品驱动,运营驱动还是工程师驱动
  • linux驱动基础开发0——linux 设备驱动概述

    万次阅读 多人点赞 2011-09-22 17:40:33
    目前,Linux软件工程师大致可分为两个层次:  (1)Linux应用软件工程师(Application Software Engineer):  主要利用C库函数和Linux API进行应用软件的编写;  从事这方面的开发工作,主要需要
  • 我觉得对这个问题主要是对“程序”这个分歧上。一个嵌入式硬件工程师真的是只是画板子那么简单吗?...一个嵌入式应用软件开发工程师接触的硬件较少,只要驱动工程师告诉它接口,他就只管应用了,这个通常项
  • 我想大家也知道,论坛和一些QQ技术交流群很多新手都会问:应该如何学习wince驱动?以前很多时间,也打字打的手痛。也不敢说的太多,怕误人子弟。现在在这里开个帖子,希望... 三、你认为wince驱动工程师应该掌握什么
  • 一线工程师告诉你嵌入式真实现状与发展前景

    万次阅读 多人点赞 2018-10-08 22:57:11
    个人说明:本人并不是年薪百万的技术大牛,但总算是一名合格的嵌入式工程师,现在某企业担任嵌入式软件工程师开发一职,以下观点可能会带有片面或者分析不全,但却是一名一线企业嵌入式软件开发者真实感受和所得,...
  • 因此,作为一名一线企业嵌入式软件工程师的笔者,想通过自己的实际经历理性地评论当今嵌入式行业的真实状况。 1.嵌入式的定义和举例分析 官方定义: 根据IEEE(国际电气和电子工程师协会)的...
  • 怎样做更好的Android驱动工程师

    千次阅读 2014-04-26 20:15:14
    说句实话,方案公司那个层次的驱动已经不能算驱动了,实际上已经做了好几次的硬件抽象的封装,跟写应用没什么两样。 真正linux底层还是需要有点功底的才行,不过一般这样的角色都在外资芯片公司。 外资芯片公司的...
  • linux 学习路线(初级到高级)

    万次阅读 多人点赞 2014-02-17 14:42:25
    工程师 嵌入式 Linux 工程师 嵌入式 Linux 工程师 首先 你要学习嵌入式的的有一个基础:大概如下 1. 计算机、电子、通信、自动化、微电等理工科类大3以上的大学生及已毕业的工程技术人员;  2. 有一定C、C++、...
  • Linux设备驱动开发入门

    万人学习 2018-10-22 21:38:04
    本课程讲解Linux驱动程序开发基本知识,程序架构,字符设备编程,杂项设备编程,具体硬件模块驱动开发。
  • 嵌入式软件工程师所需技能

    万次阅读 多人点赞 2018-05-31 13:39:06
    嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件...
  • 设备驱动概述(1) 设备驱动的作用  任何一个计算机系统的运行都是系统中软硬件协作的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁。硬件是底层基础,是所有软件得以运行的平台,代码最终会...
  • 嵌入式linux驱动工程师的基本要求

    千次阅读 2013-04-27 09:47:38
    1.熟悉Linux系统架构,熟悉Linux设备驱动的各种编程接口和机制; 2.熟悉Linux内核开发环境,Uboot移植,Linux内核裁剪,根文件系统定制; 3.了解ARM硬件工作基本原理及中断处理、IO接口、总线结构; 4.有强烈的...
1 2 3 4 5 ... 20
收藏数 109,770
精华内容 43,908
关键字:

驱动工程师