分享

资深工程师谈学习嵌入式那些年的战斗史

 心不留意外尘 2017-03-30

http://www.elecfans.com/emb/xitong/20140922354463_a.html

  导读:江工告诉小编,信心、毅力、勇气三者具备,则天下没有做不成的事。从江工总结的这三点可以看的出来,成功是需要付出的。任何人任何事都离不开你内心最原本的那份自信。坚持做下去就会离成功越来越近。

  撰文、组稿:Cici Chen chenchen@elecfans.com

  (原创内容,转载请注明来自ElecFans)

  此处输入图片的描述

  1、电子发烧友:谈一谈你学习嵌入式的那些年吧!

  aiku:那些年,我们一起来学嵌入式。有人用鲁迅的名篇形容大学四年:大一《彷徨》,大二《呐喊》,大三《伤逝》,大四《朝花夕拾》。想想,还真是这样!

  2005年刚上大一,我开始接触51单片机,自己画板自己做板,接着又嵌入式arm。但是那时候很彷徨、迷茫,都是书本大理论,学得一头雾水。还是硬着头皮啃下去。

  幸好,大二跟随电子设计室的师兄学习嵌入式实际操作,刚好学院火热开展电子设计大赛,这是一个很好的学习契机。于是,我和几个哥们组队,每天披星戴月泡在实验室,从构思、设计、编程到展演,步步摸索,从院、校、市,过五关斩六将,最后获得省一等奖。小小的成功,这也是梦想最初的呐喊吧。伙伴们共同探讨,志同道合还是挺振奋人心!

  大三,学院考研风气还是挺浓厚。可惜是我英语不太好,连四级都没过,某次还被英语老师说:英语四级都没过,就先别考虑考研。她的话给我当头一棒,更是暗下决心,令其刮目相看!复习近一年多,过着“起的比鸡早,睡得比够晚”的苦逼考研生活。那段时间,每次疲惫不堪时,总以恩格斯的“没有哪一次的痛苦,不是以人类的进步为补偿”激励自己。苦尽甘来,考上啦!离毕业还有一定空挡时间。我就想做过那么多项目,为何不将经验总结?“朝花夕拾,雁过留声”嘛,我就重点将比赛的各个项目归纳整理,这也是我在论坛里共享研究生三年项目资料的一部分。

  2009年,攻读研究生,加入导师的“创新嵌入式实验室”,和师兄几个参与导师的嵌入式项目。我主要负责虚拟平台总线设备驱动开发、音频驱动开发以及bootloarder模块开发。

  工作内容涉及到Linux应用程序开发、LinuxTCP/IP协议栈的改动、Linux内核驱动模块的开发等等。现正编写【嵌入式项目实战经典视频教程】,利用周末,在YY课堂上,讲解《嵌入式入门开发及实战项目开发》。嵌入式开发的学习路上,我始终坚信天道酬勤,一个人的成功与否,取决于业余时间的开发利用。

    2、电子发烧友:能否分享一下学习linux或者是ARM时你有哪些收获呢?

  aiku:非常高兴能有这个机会与大家一起交流一些经验,谈一些我在电子设计以及做嵌入式项目开发方面的感受,希望我们能够共同进步。首先,我感谢我们的队友!

  我认为,积极地参与嵌入式项目实战,不仅可以充分的体会到自己动手实践的乐趣,获得哪怕是前进一小步时候的那种成功的喜悦,还有以下的几点收获:

  (1)有利于我们学习能力的提高。这里所说的学习能力包括获取资料的能力、理解前人思路的能力、系统设计能力、动手能力、分析排除故障能力、表达能力等很多方面。

  (2)有利于我们团队精神的培养。不管在学校还是社会实际的工作中,我们一般都要与人合作共同完成某一项目,这就非常需要团队精神,而这一点在课堂常规教学中得到的锻炼是很有限的。嵌入式项目开发要求人必须互相信任、互相配合、分工合作。在顺境时小组成员要相互提醒保持冷静,逆境时要相互鼓励共度难关,出现问题时不能相互埋怨。这些与学校里面的课堂教学强调独立性是有明显区别的。

  (3)有利于我们应变能力的提高以及思维能力的提高。在做项目的过程中要求我们在规定时间内完成规定的项目,时间急迫会说出现各种意想不到的结果,所以我们必须在尽可能短的时间内解决问题,这就需要在平时的训练中提高应变能力。

  那么,如何来准备成为嵌入式实战项目高手呢?我认为,最好有一个前辈领着你一起学习,一起搞项目。这样你遇到问题你就可以有人教你,进步飞快! 其次,你可以使用一套有价值的教程领你进入linux世界!

   3、电子发烧友:能否给大家简单介绍一下学习linux的侧重点有哪些呢?

  aiku:很多朋友在学习arm+linux都很迷茫,他们都在问,作为一个新人,怎样学习嵌入式Linux或者如何学习嵌入式等问题这些问题被问过太多次,很多都可在这里找到答案,自学嵌入式最大的障碍是什么?就是有问题没有地方提问,从而打击了学习的积极性。

  作为一名嵌入式【创科之龙】团队的aiku来说,我想我可以做一些唠叨甚至可以说一下一些建议和意见,希望我的分享能给他们以启发。嵌入式的入门门槛稍微高一点,但是再高的城墙也是小砖头筑起来的,所以没有必要因为门槛高就觉得很困难,一步一个脚印,贵在坚持就可以了,当然,嵌入式学习是一个漫长的过程,如果你的兴趣不在于嵌入式,而只是为了某些目的而学习,那学习对你来说就是一件枯燥的事情。

  搞过ARM,其实有C语言基础,学起来就轻松很多,驱动,其实也不难,因为对于电子的学生来说。对硬件有一些了解,写驱动是不难的。驱动,有一个固定的模型,都差不多的。其实我们常见的驱动,LINUX内核里面都有的了。这些暂时从简单开始,没有必要研究太深入。

  4、电子发烧友:大家都知道学习讲究方法,那么学习嵌入式系统可以分为哪几个阶段呢?

  aiku:我个人认为可以分为4层,硬件层、驱动层、操作系统层和应用层。

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

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

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

  我个人觉得驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要了解。 驱动开发方面,建议先从简单的入手,比如串口/并口/LED/矩阵键盘/IIC等,难一点再做 PCI/USB等其他的。

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

  4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及Jave方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。

  目前为止,我了解驱动开发的待遇都是非常高的,本科出来工作5-6年,一般待遇都10k左右!如果我们初学者想从事android手机驱动开发,本科出来5-6年一般都会有15k月薪,研究生2-3经验那么也有20k。

  所以我建议大家先把字符设备驱动学好,后面把平台总线驱动学好,接下来就可以接手android的手机驱动开发或者android驱动开发。

  此处输入图片的描述

  5、电子发烧友:您做这么多项目,什么让你感觉最有成就?感觉最艰难的项目是什么?您又是如何克服这些问题的呢?

  aiku:我们【创科之龙】几个队友,做大大小小的项目应该不下100个嵌入式的项目,在开发嵌入式的项目的过程中让我们最有成就感的就是:积累丰富的项目经验。

  在做嵌入式项目中,最大的艰难就是眼看要交货了,现在项目遇到技术瓶颈,解决好多天甚至一个月了,都没有进展。遇到这样后,我一般都先网上查查,是不是有前辈有遇到跟我一样的问题,如果有,那当然好解决,如果没有,那么我接下来要冷静分析整个项目过程的思路,到底哪里出问题?为什么会出现这个问题?为什么会导致这样问题?是什么原因导致这样的问题~?然后和队友的一起谈论一下项目整个状况。因为每个人的思维都不一样,也许别人的思维就是可以解决我们现在遇到的问题,因此我还是要强调个人的力量是有限的,团队的力量是无穷的!

  6、电子发烧友:从事LINUX驱动或者是安卓驱动工作的话,初学者应具备哪些专业技能呢?

  aiku:1.学会写简单的makefile

  2.编一应用程序,可以用makefile跑起来

  3.学会写驱动的makefile

  4.写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world,insmod后应该能够通过dmesg看到输出。

  5.写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现。 在ioctl里完成从用户空间向内核空间传递结构体的实现。

  6.写一block驱动, 加上read,write,ioctl,poll等各种函数实现。

  7.简单学习下内存管理, 这个是最难的,明白各种memory

  alloc的函数实现细节。这是Linux开发的基本功。

  8.学习锁机制的应用,这个不是最难的但是最容易犯错的,涉及到很多同步和并发的问题。

  9.看内核中实际应用的驱动代码。 你会发现最基本的你已经知道了,

  大的框架都是一样的, 无非是read, write, ioctl等函数的实现, 但里面包含了很多很多细小的实现细节是之前不知道的。 这时候就要考虑到很多别的问题而不仅仅是基本功能的实现。 推荐您看2.6.20中integrated的一个驱动 kvm, 记得是在driver/lguest下,很好玩的, 就是Linux下的虚拟机驱动, 代码不长,但功能强大。

    7、电子发烧友:安卓驱动开发需要学习安卓的framwork框架吗?如果学习有什么好的建议。

  aiku:Android的驱动开发不需要学习framwork框架;而framwork框架只是正对一些系统架构人员开发的。

  不管学习linux驱动还是学习android驱动开发,它们的门槛都是比较高的,所以为什么说工作几年的android驱动工程师动不动就年薪10w以上的原因。

  因此,学习android的驱动最好的学习方法要找对人学,要找对资料学,最重要要找到目标来学。

  后记:很多人总说时间不够,没有时间去做想做的事情,这种时候你有没有静下心来思考过你是否真的有用心去做呢?时间就是海绵,挤一挤就有了。为了我们的青春无悔,珍惜时间,你会享受更好的生活。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多