【23xiu.com-爱上秀-教育信息门户网】
嵌入式开发心得
从实习到现在搞嵌入式开发快一年了,蓦然回首好像一年过得挺快,挺顺利的。细细品味,发现这一年还是有很多值得回忆和总结的东西。至少这一年看书挺多,大概二十几本,当然和那些一年看一百多本书的人没法比,但是我已经超越了自己。这是我大学毕业的第一年,初次走上社会,很想一展身手,可是.....其实也不用可是了,和很多朋友一样碰了很多钉子,现在我和老板的关系就挺一般的,只是我性格还不错。呵呵~~,做优秀员工看来还得慢慢学。
今年最大的收获就是做了一个半项目,是在uClinux下面跑的。半个是SNMP-Agent的实现,因为我去的时候snmpd已经跑起来了,我只是实现部分管理功能;一个是基于Web的管理系统,使公司的主打产品微波通信设备上网。这个项目是我一手策划,一手实现(界面设计是一位女同事,很优秀的程序员),从中学到的东西也最多,感情不可谓不深。
SNMP即简单网络管理协议,其实一点都不简单。在我所知的网络协议里面,它仅仅比OSI的CMIP简单一点,而CMIP直到现在还没得到广泛应用。我们能够实现SNMP-Agent不能不感谢Carnegie Mellon大学免费发布的ucd-snmp软件包。它使得开发人员专注于实现对特定设备的管理功能。
我在项目中的工作主要是扩展MIB,实现相应的管理功能以及网络功能的扩展。我们公司的MIB库比较庞大,但是程序运行还是挺快的。因为ucd-snmp软件包中大量使用回调函数,而且它将MIB树以二叉树形式表示,但是每个结点不是单个的MIB结点,而是一个表,包括了多个结点。回调函数和两层表示法的使用是操作快速的主要因素。
基于Web的管理系统我原本是打算在设备外实现SNMP-Manager的功能,因为设备中已经嵌入了Agent。这样管理人员可以在世界各地通过WWW登录公司的管理平台,实现对所有设备的管理。但是老板想在设备中嵌入一个管理系统,可以通过www管理单个设备就行。呵呵~~,这样工作又轻松了一点,就按老板的意思做了。
我用的http服务器是BOA,它比现在市场占有率第一的Apache速度要快。目前还只支持CGI,我就用C写CGI程序,古老了点。但是在开发过程中感觉用CGI比用现在流行的ASP,JSP要爽,可以随心所欲,哈哈~~,而且这也是用C\C++语言的优点。CGI程序很简单,它的输入就是标准输入,它的输出就是标准输出。BOA在uClinux上面跑总要出点问题的,出问题好,出了问题我就能找到问题,一来一往,我对socket编程,I/O多路等编程技术了解也就越来越深了。
在Linux下面搞了一年,不爱上Linux都难,个人认为软件开发人员在Linux下面进步是最快的。那么多优秀的开源代码供我们研究,犹如每天与世界上最优秀的程序员打交道,进步于不经意间。哈哈~~。正所谓“熟读唐诗三百首,不会作诗也会吟”。GCC编译器的优秀不用多说,我觉得写Makefile也是很件开心的事。不推荐程序员搞开发都用IDE,隔靴捎痒很不爽。但是Linux缺点也很明显,听歌、看碟、玩游戏不如Windows。恰巧公司的电脑没音箱,干脆我就懒得用Windows了。
用Linux而不讲开源是不道德的,我们程序员享受着开源的好处,自然也要为开源做点贡献。我开发的所有软件都开源,但是我也有个“怪癖”:不喜欢别人在我代码未完成的时候问我要源代码。
做嵌入式开发一年,稍稍有点心得。总结了一下,有以下几点经验:
1 .不要玩Linux。这一点主要是对像我这样在Linux下面开发的程序员来说的。因为Linux对程序员的吸引力很大,但它下面可以直接用的软件还是比较少。于是我们总想到网上找一些开源的软件装到我们的机器上,从无到有让人很有成就感的,呵呵~~。要是装上的不是最新版本的还不满意,于是又开始忙升级。在Windows下这个过程大概没什么意思,全都next了。在Linux下就不一样了,直接拿过来的源代码很多编译都不能通过,最新版本更是这样,得我们自己改,而且往往时改了又改。这个过程很花时间,我就在这方面浪费了很多时间,本来有个月工作比较轻松,打算阅读Linux kernel代码(也想成高手,呵呵~~),当时我机子上没有好的阅读工具,于是先弄了个source navigator,觉得不够又装了个open office,然后又找来了几份不同版本的kernel代码。结果一个月过去了,一个文件夹还没看完。后面工作紧了,只能把看kernel当休息,直到现在才粗略看完fs,mm两个文件夹。
2.不要满足于C语言。C语言很优秀,也很简单。程序设计能力不等同于用C语言能力。嵌入式开发程序员要有扎实的数据结构基础,要积极的学习操作系统,积极的学习网络编程,要是想进行驱动开发还需要积极的学习硬件知识。
3.了解几种芯片体系结构。嵌入式不像PC领域x86一统天下,在嵌入式领域ARM、MIPS、M68k等各显神通。例如ARM7是没有MMU的,uClinux在它上面跑是最合适了,但是没有MMU我们也必须实现简单的MM功能,同时没有MMU一些常用库函数是不能实现的,这些嵌入式开发程序员必须要了解。
4.编写无错的C程序。关于这一点建议阅读Steve Maguire的《Writing Clean Code》。我对MS没有好感,但这不影响我对MS里面大牛们的尊敬。嵌入式的调试是非常麻烦的,很耗时。虽然有gdbserver这类工具,但是你用的开发工具链中不一定包括它,而且就算用上了调试仍然是很花时间的。所以要是不想天天通宵调程序呢,那就要时时以编写无错程序为目标。
5.了解一点编译知识。这对编写高性能程序很有帮助。
6.学习设计模式。设计模式一般在高级语言中讨论较多,但是好东西应该大家一起分享。学习设计模式对提高我们的设计能力非常有帮助。用C语言也可以实现一些模式思想,例如我们常用的回调函数,就可看作是Command模式的C语言版本。
7.要有前瞻性,要积极学习新技术。目前的嵌入式开发一般都是将PC应用加以剪裁,移植到嵌入式系统中。但是随着通信技术的发展,IPv6的广泛应用,设备上网是大势所趋。许多新技术有可能在嵌入式领域率先应用。把握住这个趋势,嵌入式程序员大有可为。
现在很多公司招程序员要求有嵌入式开发经验,其实本质上嵌入式开发和我们平常的开发没什么不同,只是要求严格一点。我写下这些希望对学习嵌入式开发的朋友们有所帮助。
嵌入式开发心得
从实习到现在搞嵌入式开发快一年了,蓦然回首好像一年过得挺快,挺顺利的。细细品味,发现这一年还是有很多值得回忆和总结的东西。至少这一年看书挺多,大概二十几本,当然和那些一年看一百多本书的人没法比,但是我已经超越了自己。这是我大学毕业的第一年,初次走上社会,很想一展身手,可是.....其实也不用可是了,和很多朋友一样碰了很多钉子,现在我和老板的关系就挺一般的,只是我性格还不错。呵呵~~,做优秀员工看来还得慢慢学。
今年最大的收获就是做了一个半项目,是在uClinux下面跑的。半个是SNMP-Agent的实现,因为我去的时候snmpd已经跑起来了,我只是实现部分管理功能;一个是基于Web的管理系统,使公司的主打产品微波通信设备上网。这个项目是我一手策划,一手实现(界面设计是一位女同事,很优秀的程序员),从中学到的东西也最多,感情不可谓不深。
SNMP即简单网络管理协议,其实一点都不简单。在我所知的网络协议里面,它仅仅比OSI的CMIP简单一点,而CMIP直到现在还没得到广泛应用。我们能够实现SNMP-Agent不能不感谢Carnegie Mellon大学免费发布的ucd-snmp软件包。它使得开发人员专注于实现对特定设备的管理功能。
我在项目中的工作主要是扩展MIB,实现相应的管理功能以及网络功能的扩展。我们公司的MIB库比较庞大,但是程序运行还是挺快的。因为ucd-snmp软件包中大量使用回调函数,而且它将MIB树以二叉树形式表示,但是每个结点不是单个的MIB结点,而是一个表,包括了多个结点。回调函数和两层表示法的使用是操作快速的主要因素。
基于Web的管理系统我原本是打算在设备外实现SNMP-Manager的功能,因为设备中已经嵌入了Agent。这样管理人员可以在世界各地通过WWW登录公司的管理平台,实现对所有设备的管理。但是老板想在设备中嵌入一个管理系统,可以通过www管理单个设备就行。呵呵~~,这样工作又轻松了一点,就按老板的意思做了。
我用的http服务器是BOA,它比现在市场占有率第一的Apache速度要快。目前还只支持CGI,我就用C写CGI程序,古老了点。但是在开发过程中感觉用CGI比用现在流行的ASP,JSP要爽,可以随心所欲,哈哈~~,而且这也是用C\C++语言的优点。CGI程序很简单,它的输入就是标准输入,它的输出就是标准输出。BOA在uClinux上面跑总要出点问题的,出问题好,出了问题我就能找到问题,一来一往,我对socket编程,I/O多路等编程技术了解也就越来越深了。
在Linux下面搞了一年,不爱上Linux都难,个人认为软件开发人员在Linux下面进步是最快的。那么多优秀的开源代码供我们研究,犹如每天与世界上最优秀的程序员打交道,进步于不经意间。哈哈~~。正所谓“熟读唐诗三百首,不会作诗也会吟”。GCC编译器的优秀不用多说,我觉得写Makefile也是很件开心的事。不推荐程序员搞开发都用IDE,隔靴捎痒很不爽。但是Linux缺点也很明显,听歌、看碟、玩游戏不如Windows。恰巧公司的电脑没音箱,干脆我就懒得用Windows了。
用Linux而不讲开源是不道德的,我们程序员享受着开源的好处,自然也要为开源做点贡献。我开发的所有软件都开源,但是我也有个“怪癖”:不喜欢别人在我代码未完成的时候问我要源代码。
做嵌入式开发一年,稍稍有点心得。总结了一下,有以下几点经验:
1 .不要玩Linux。这一点主要是对像我这样在Linux下面开发的程序员来说的。因为Linux对程序员的吸引力很大,但它下面可以直接用的软件还是比较少。于是我们总想到网上找一些开源的软件装到我们的机器上,从无到有让人很有成就感的,呵呵~~。要是装上的不是最新版本的还不满意,于是又开始忙升级。在Windows下这个过程大概没什么意思,全都next了。在Linux下就不一样了,直接拿过来的源代码很多编译都不能通过,最新版本更是这样,得我们自己改,而且往往时改了又改。这个过程很花时间,我就在这方面浪费了很多时间,本来有个月工作比较轻松,打算阅读Linux kernel代码(也想成高手,呵呵~~),当时我机子上没有好的阅读工具,于是先弄了个source navigator,觉得不够又装了个open office,然后又找来了几份不同版本的kernel代码。结果一个月过去了,一个文件夹还没看完。后面工作紧了,只能把看kernel当休息,直到现在才粗略看完fs,mm两个文件夹。
2.不要满足于C语言。C语言很优秀,也很简单。程序设计能力不等同于用C语言能力。嵌入式开发程序员要有扎实的数据结构基础,要积极的学习操作系统,积极的学习网络编程,要是想进行驱动开发还需要积极的学习硬件知识。
3.了解几种芯片体系结构。嵌入式不像PC领域x86一统天下,在嵌入式领域ARM、MIPS、M68k等各显神通。例如ARM7是没有MMU的,uClinux在它上面跑是最合适了,但是没有MMU我们也必须实现简单的MM功能,同时没有MMU一些常用库函数是不能实现的,这些嵌入式开发程序员必须要了解。
4.编写无错的C程序。关于这一点建议阅读Steve Maguire的《Writing Clean Code》。我对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操作系统,从学习的角度来讲,这方面要多下功夫。
至于应用程序的开发,那就要看具体的应用了,这个难度不是很大。