arm+uClinux的嵌入式系统的开发


练,对提高效率很有帮助。(将你的程序用两个编辑器完成,一半是用emacs的,一半是不用emacs的,看看效果:-)
对具体的linux编程我就不板门弄斧了,需要提个醒的是咱硬件出身的人作软件应该养成良好的编程习惯,别让作软件的笑话咱。因为作了些网络应用,所以介绍一些网络编程时要用到的网站和书籍;
<>w.Richard.Stevens. 这可是linux网络编程的圣经级的书籍
::URL::http://www.fanqiang.com/a4/b7/ 适合于网络编程的入门。
还有IBM中国上关于linux的教程和文章,都是翻译过来的,有很多写非常不错。
其实类似的资源不计其数,遇到问题时应该先到google上狂搜一圈。
重点想说些关于编译器的东西,不了解它,在交叉编译环境下编译程序就寸步难行了,这无非是因为交叉编译环境下目标板编译器所处的寄人篱下的悲惨环境。想想在 linux下将myprogram.c编译链接成应用程序myprogram,最简单的一句 gcc –o myprogram myprogram.c 就可以了。(其实在诸如VC下你也可以找到类似的命令,集成开发环境只不过替你来调用它了)。一切看起来天经地义。
但试着把/usr/include路径改一个名字(比如改成stupid_include),再这样编译一下,会发现程序中被< >引用的头文件(比如#include)都找不到了。因为编译器看见这样的头文件会到系统指定的路径下寻找,而这个路径是由环境变量保存的(linux和windows下都是这样的)。针对以上情况,不将路径名字改回去,但是给编译器加一个参数如下:
gcc –I/usr/stupid_include –o myprogram myprogram.c 会发现错误信息没了,一切又恢复了往日的宁静,顿时明白,不用环境变量,通过参数,同样可以将这些信息告诉编译器。返回来说说你的目标编译器,虽然占用了人家的地盘,编译器,头文件,库文件,一个都不少,但你要编一个程序编译器照样发晕,因为没有环境变量告诉它自己需要的头文件和库文件在哪里。看来只有两种办法,一个是抢占了主机的环境变量改成自己的(整个儿一个土匪),或者在编译时加上必要参数(还是这样绅士一些),告诉编译器需要的文件的位置。(除此之外,还有其他一些参数也是如此)。
从源程序到可执行文件根据情况不同可能分好几步,一般每一步可能都会有一个应用程序实现,像gnu提供的arm开发工具链其实就是这么一组程序。提供从编译到链接到格式转化的全套服务。你可以用arm-elf-gcc命令一步到底直接产生可执行文件(其实也是在自己的任务完成后调用下一个程序),也可以每一步加上自己的参数,只作自己的事。
编译器的主要参数的使用下次将程序的移植时再讲。这里想说一下编译器产生应用程序的几个主要步鄹,讲这个问题的原因还是很多人无法区分诸如编译和链接,不用问,这一切还是IDE集成开发环境惹的祸。有人会说,IDE招你惹你了,你老贬它。其实不然,首先以上说的东西一般在IDE的project菜单下的 option或build option中找到,只是一般不用管罢了。另一个方面,IDE就像是傻瓜照相机,很多工作他都帮你完成了,使用简单。但如果要做摄影师的话,你就少不了要对每一个细节都了解。其实编译程序也是一样。(你可以对优化,警告级,宏定义等诸多选项进行自己的选择)。以下是几个主要步鄹:(以下有些我也不确认,如发现问题,请及时纠正。
(1) 预编译。主要工作就是处理所有#开头的,包括头文件。以前搞不清头文件和可执行文件有没有什么联系(因为总看见两个文件名字取一样的),现在知道,他们之间没有任何联系。在预编译结束后,头文件的使命就结束了。在下一次介绍不同平台程序移植时可以看到,预编译有时非常有用。
(2) 编译。编译应该是最主要的一步,就是将源文件生成CPU能识别的语言,一般是后缀为.o的目标文件,应该说,此时的文件就已经可以执行了。当然这个时候外部函数等外部符号都没有引入,对于被编译程序来说,这些外部符号还只是留一个倩影,压根儿不知它在不在。你可以在你的程序里调用一个不存在的函数,甚至都不用声明,在编译阶段,很多编译器只是给个警告。只有在链接时才会报错。(呵呵,够弱智!)
(3) 链接:链接才是清帐的时候,以前在程序里用到的外部符号都要把真正的东西交出来。你可以指定需要连接在一起的目标文件,也可以告诉编译器库文件的名字和路径(指定方法下次讲)。编译器会去找,需要注意的是,库的指定需要注意顺序。首先,如果不同的库里有同名函数,并且该函数被调用,那么在前面的就被链接进去了,这一点对于头文件路径的指定也适用,如果你自己的头文件和系统头文件相同,并且你的头文件路径在系统头文件路径前面,你的头文件就会代替头文件。库文件是由相应的程序(linux下是ar命令)将需要被添加到库里的目标文件(该文件是编译阶段生成的)组织起来生成档案文件,同时可以建立一个检索,检索内容为所包含的目标文件中定义的符号。也就是说,库文件并不是必须的,但它为经常使用的目标文件中的函数提供了快速的检索机制。
以上就是主要的步鄹,当然除此之外,还有一些用于格式转换的工具等。不一一介绍。知道编译器的细节对于程序的开发和移植都是很有好处的。

程序开发过程中调试也是至关重要,因为可以先在主机上调试,所以可以使用linux下的gdb,(有点像dos 下的debug)。但是只是用到了皮毛,还有一个专用于宿主机模式的调试工具gdbserver,一直没时间研究,希望用过的大侠多发些文章铺路。
另外还会遇到如何作ramdisk,如何让系统启动自己的程序,这些都太linux了,没接触过linux的人会晕,为了大家的健康,就不讲了,遇到问题可以给我email,大家一起讨论。

COPYRIGHT(C) 2011 厦门永宏亚得机电科技有限公司版权所有(闽ICP备05025945号) ALL RIGHTS RESERVED?

电话: 0592-5190891 传真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 厦门市海沧区兴港六里17号2607室 邮编:361009 联系人:翟先生