技术门诊是51CTO社区品牌栏目,每周邀请一位客座专家,为广大技术网友解答疑问。从热门技术到前沿知识,从技术答疑到职业规划。每期一个主题,站在***最热的技术前沿为你引航!
本期特邀C/C++语言专家、软件开发专家、系统架构师李云先生,将针对嵌入式软件开发学习过程中遇到的问题给予解答。
本期专家:李云
擅长领域:嵌入式系统软件开发、软件平台与框架设计、UML建模
专家简介:摩托罗拉网络部软件架构师,资深软件开发工程师、51CTO专家博主。专注于嵌入式系统开发、软件平台与框架设计和UML建模。早在2000年开始从事嵌入式软件开发工作,包含:操作系统内核、文件系统和IP协议栈的移植,IDE硬盘、以太网芯片和PCI等外设的驱动开发。熟悉x86、PowerPC、XScale处理器,以及TI DSP。源码级熟悉uC/OS、RTEMS和VxWorks实时操作系统的实现,并在这些操作系统和Linux操作系统上有着丰富的软件开发经验。著有《专业嵌入式软件开发 — 全面走向高质高效编程》。
查看本期门诊精彩实录:http://doctor.51cto.com/develop-244.html
参与***技术门诊:http://doctor.51cto.com/
精选本期网友提问与专家解答,以供网友学习参考。
Q:李老师,您好!我想请问下,现在常用的嵌入式开发工具有哪些?哪个比较好用常用,以前到了解用过RealView MDK 开发工具,不知它与别的工具有什么不同。
A:你好,从我的个人经验来看,大型的嵌入式软件开发大多采用的是基于命令行的开发方式,很少有采用GUI界面的。即使象VxWorks有那么好用的Workbench,我曾工作的团队也是基于命令行进行开发工作的。至于RealView MDK,我想它更多地运用于基于ARM处理器的嵌入式系统开发中,是一款很好的开发工具。至于与其他工具的比较问题,我不能很好地回答。
大体说来,一个好的开发工具能极大地提高工作效率,但成为一个专业的嵌入式开发工程师这不是至关重要的一步。因为你会用这个别人也会用,对于我们的能力没有什么区分度。就开发工具方面,成为专业的嵌入式开发工程师的关键点,在于我们能否理解和掌握开发工具背后的行为。比如,编译器是如何编译整个项目的?程序文件的结构是怎样的?调试时断点的原理又是什么?如何通过编写Makefile来更好地完成项目编译?等等。这也是我为什么会在《专业嵌入式软件开发》中加入介绍程序结构和开发工具相关篇章的缘故。
Q: 李老师,你好,我是嵌入式初学者,嵌入式从应用层到驱动动层的一些实验都走过了,然后觉得这个专业学的东西太多了,涉及太多的知识,即将毕业,不知道从应用层还是从底层入手进入这个行业,本人比较喜欢偏向底层开发,但是自己在这方面的知识和经验还是不足,请问李老师有什么好的意见呢?
A:我相信这是很多新手都会面临的问题,我也是曾经这样走过来的。首先,正如您所说,真正的嵌入式软件开发需要掌握很多的知识。从硬件方面,工程师需要完全理解计算机的体系结构;从软件方面,工程师需要掌握各种开发工具、了解程序的结构、精通编程语言等等。正因如此,这决定了从事嵌入式软件开发是一个艰难和长期的学习和成长过程,我们先要从思想上树立这种观念,这使得我们在成长的过程中不会因为畏惧而放弃。
短期来看,我觉得您需要从软件基础入手,掌握嵌入式软件开发所需掌握的各种软件开发技能。毕竟,我们一上手工作是以软件作为切入点的。至于硬件方面的知识,虽然也很重要,但学习它的紧迫程度更低一点,我们可以边工作边积累。
如果您喜欢做底层开发,那我建议您跟着自己的兴趣走。有兴趣是很难能可贵的一件事!至于知识和经验,每一个新手上路时都缺乏,这不是根本问题。对您最关键的,或许是能找到一个符合自己兴趣的新工作,这样就有机会成为一个真正的底层嵌入式软件开发人才。
祝您进入职场有一个好的起点!也愿您能坚持自己的兴趣!
Q:李老师,您好。嵌入式软件开发相对而言与硬件结合更加紧密,但各种芯片又不可能全部掌握。作为软件开发人员,您认为应该对硬件知识的掌握达到何种程度?另外需不需要研究算法呢?
A:你好,其实不论是什么芯片,我们掌握它们的方法都是一样的:1)能看懂时序图。2)能熟练地查阅芯片手册。这也间接地回答了要掌握到什么程度。
我认为您是在问软件算法对吗?如果这样,是否要研究算法取决于工作内容。在很多情形下,掌握《数据结构》这类书中的算法就够用了。
Q:李老师,您好!我在学习嵌入式的过程中,发现总是不能专注于一种平台来学习,今天学两下Linux,明天就开始玩Android,老是无法专注,对此您有好的建议吗?
A:这可能和我们自己的定位有关 — 不清楚以后到底要干什么。
我个人觉得学习Linux与学习Android是不大一样的。前者侧重于操作系统,后者则更侧重于应用框架;前者是用C语言,后者则更多的是Java。相比之下,做Android应用(不是驱动等)的门槛更低。对于没有多少工作经验的人来说,从事Android是一件好事。从就业前景来讲,移动互联网是个大趋势,因此Android所需的开发工程师数量会很大。
做软件开发有一些内容我们要注意。比如,真正的高水平是指我们能掌握一定的开发方法、能理解软件开发的困境、有很强的设计能力、熟悉计算机体系结构和操作系统实现原理等。可以说,这些内容与具体是Linux或Android是无关的(还可以是其它的VxWorks或iOS什么的),我更倾向于将Linux和Android开发理解为是一条帮助我们理解困境和掌握技能的一种途径。
对于您的问题,我认为自己可以问几个问题:1)我是新手吗?如果是,我认为学Android应用开发是更好的选择,毕竟我们需要有一份工作,以便以后获得更多的学习机会。2)我是个能坚持的人吗?如果是,则无论现在学什么都行。在工作中我们还是有很多机会去改变自己的选择的,只要我们能坚持没有什么学(做)不好的。
总而言之,请根据自己的性格特点和爱好去定位好自己要做什么。一旦定位好了,您现在不能专注的问题也就解决了。
Q:我现在有个困惑,你书中提到,对于软件质量,软件设计是根本,这个我也很有感触。一个设计不良的软件产品,不仅影响质量,也带来很大的维护、扩展的困难,但设计好不好怎样来考量呢?这是架构师的职责?还有你怎么看待工具和流程的关系,因为我发现在我的公司有很多工具可以让我们使用,比如review board等,但我发现很少人将它用起来,很多时候很多低级错误我认为都是可以通过review的方式来控制的,但由于缺少这一环节硬性的流程控制,很少人用它。说了一堆,有点没有头绪一样,因为这些都是我有疑惑,但又不知问题在哪,期待您能解答,也同时能帮忙理出一个头绪来,谢谢!
A:正如我在书中所说,设计质量的度量是软件行业的一个难点,所以设计好坏的考量很难用某种具体的指标去表示。真正了解设计质量的人正是一线的软件工程师,尽管如此,也很难用某种具体的指标将工程师的这种“心知肚明”表达出来。
软件的设计质量必须由软件开发架构师去把控,就我的工作经验,软件行业的混乱很大程度上与缺乏高质量的软件开发架构师有很大的关系。
对于工具与流程的使用习惯,这需要公司的文化去强化。我们的工作特点可能平时太随意,只要工作做完就行,而没有考虑让自己专业做事。其实,对工具和流程的使用习惯能在某种程度上反映我们的专化化。形成使用习惯之前,需要公司领导层面鼓吹其重要性,并由各项目负责人带头去做好,否则很难真正落实。
Q:李老师您好,我是一名大一的学生,上的是专科,学的是计算机应用技术专业,课程是IT运维方面的,不过我想未来做嵌入式开发,现在在跟着学习数字电路和单片机,有C语言基础,我想问下老师,对于我未来走进嵌入式领域,该怎样学习,以及寻找实习单位时怎样选择?谢谢老师!
A:你好,如果有C语言和单片机的基础,我建议自己可能先巩固这两门内容。可以说,学好这两门对于嵌入式软件开发的学习非常有帮助。第二步可以考虑做一些实际或虚拟的软件项目,在此我推荐您看我的书。该书除了可以让您对开发工具、开发环境和操作系统原理有深入的掌握外,书中所提供的学习环境也可以用于编程实践。
第三步可以考虑选择某一款处理器以对之进行深入的学习。比如,ARM就是很不错的学习目标处理器。
有了以上三步后,我觉得您需要通过工作来加深各方面知识的理解,这是一个长期的过程。其中可能根据您的能力增长需要学习各方面的内容,这或许不是我在这里能简单回答的了。
对于实习单位,以现在的就业形势来看,我觉得只要单位愿意接收,且自己觉得有东西可学就行了。当然,如果实习单位与嵌入式系统开发有关就***了。刚开始我们要求不要太高,相比待遇,学习机会更重要。