北京理工大学 20981 陈罡
今天无意间看了一下blog的访问量,竟然有这么多人看过我的帖子,真是让我惊奇。互联网真是一个不可思议的技术。发帖庆祝一下,顺便感谢各位网友对我的支持,只要时间允许,我还会继续写下去的。
目前待业在家。。。总算可以有时间放松一下自己,喝着咖啡、听听音乐,上上网,享受一下生活了。但是,好景不长,自己过得虽然舒服了,可是看看老婆大人还在每天忙忙碌碌,心里就很不是滋味。。。再这么下去,偶一个堂堂七尺男儿岂不是要吃“软饭”了?!于是乎,开始找点事情来做,投了几份简历出去,如同石沉大海一般。。。我就纳了闷了,难道我的水平真的就这么差,没有一家公司感兴趣吗?
还好有一家做手机视频方面的公司找到了我,希望我能够考虑他们提出的手机视频方案的team lead。仔细看了一下,那家公司是生产嵌入式视频设备的,似乎对我的嵌入式开发的能力还有所怀疑(毕竟这段时间,都是在忙于做手机方面的开发了,嵌入式这块关注得少了)。开始着手准备往开发板子上移植一个arm-linux,然后把视频弄上去,然后再把这个实时的视频弄到手机上去。做一个非常简单的demo出来,跟人家谈的时候,总能多一点“筹码”嘛(就好像虽然佃户与地主之间的阶级已经确定,无法改变,还是要继续做点准备,为了争一下做佃户头头,还是普通佃户罢了)。
开始着手准备了,我用的是s3c2410的板子,如下图所示:
普通的arm9开发板,原来做液晶屏驱动开发的时候买的。基本参数如下:
以前玩ucosii的时候,弄成一个类似单片机的系统了,不爽。现在有时间了,可以准备往里面弄套arm-linux来玩玩了。这些都是嵌入式linux开发者的必修课,先用buildroot(现在听说很多人都在用open embedded,不太清楚,我没用过,以后有时间再试试。)把编译arm-linux-gcc的工具链弄出来,然后就可以编译vivi(这就是bootloader了,我喜欢vivi这个软件,短小精悍!),vivi跟所有的bootloader一样,用来把系统的image“搬运”到内存中,然后再让cpu跳到那个地方去执行的;vivi还有一个好处就是可以把系统的内核先直接载入到内存里面,然后启动系统。这样,如果系统能够跑得起来,你就可以用vivi的写入功能把系统写到flash中,掉电再上电以后,仍然保留;如果系统image有问题,就可以直接关掉板子,内存中的东西就都没了,可以再做新的实验了。用jflash从并口把vivi烧写到板子里面去,然后内存加载mizi的arm-linux映像,还好,一次性通过,然后就是写入。。。这些都弄完也耗了将近3个多小时,sign。。。确实有点生疏了。。。
然后就是启动系统,先用minicom通过串口登进去检查一下,看看telnetd什么的起来了没有。然后就可以把台式机甩掉了,直接用笔记本通过网线telnet到板子上了。
然后就是在pc上考虑摄像头的驱动问题了(毕竟是实时视频流嘛),我用的是那种便宜得要死的摄像头,可以肯定普通的linux内核是不会支持的了。幸好有个法国的老头很厉害,那么大岁数了还在为各种摄像头编写驱动,他写得驱动可以支持260多款摄像头在linux下面使用呢!在linux 2.4.xx的内核中,叫做spca5xx;在linux 2.6.16以上的内核版本中就是gspcav1了。网址在上面,传闻说有一位linux内核开发者把自己写得摄像头驱动弄到内核中了,而且跟这个mxhaard写得是同一个芯片的,这让mxhaard很生气。我是不知道什么原因了,反正这个网站是上不去了。让我很是恼火,找了半天才找到for 2.6的内核的源代码。
接下来就是编译gspcav1,用常规的“三板斧”,make, make install即可;
代码写得很好,几乎没有error,有一些warnning而已。
然后就是编译spcaview,这个是加载v4l的简单客户端是用sdl来显示的。这里面有一个有用的东西就是spcaserv,这是一个“视频服务器”(如果能够称之为视频服务器的话)。spcaserv把v4l采集到的摄像头数据利用mjpeg压缩,然后放到队列里面。采用完全被动式服务,每次客户端往spcaserv发一个请求图片的message,spcaserv收到后,就从队列中取出一帧压缩成mjpeg的图片数据发送给客户端。
简单测试一下spcaserv好不好使:
$spcaserv -s 640x480
换一个终端:
$spcaview -w 192.168.0.19:7070
如果可以看到图像,就证明这个spcaserv是工作正常的,只要能够在手机和开发板的arm-linux中实现一个类似spcaview功能的客户端就可以了。目标确定,就可以开始开工了。。。具体的过程,不做过多解释了。
需要说明的一点是 —— 一定要注意arm下面的字节对齐问题。
例如:
typedef struct Myrgb16 {
unsigned short blue:5;
unsigned short green:6;
unsigned short red:5;
}
struct Myrgb24 {
unsigned char blue;
unsigned char green;
unsigned char red;
}
struct Myrgb32 {
unsigned char blue;
unsigned char green;
unsigned char red;
unsigned char alpha;
}
这些在linux下面直接编译是没问题的,如果在arm-linux下面,就会面临4字节对齐的问题。
所以必须要加入__attribute__((packed)) 这一句,保证这些结构体都是1字节对齐的。
typedef struct Myrgb16 {
unsigned short blue:5;
unsigned short green:6;
unsigned short red:5;
} __attribute__((packed)) ;
struct Myrgb24 {
unsigned char blue;
unsigned char green;
unsigned char red;
} __attribute__((packed)) ;
struct Myrgb32 {
unsigned char blue;
unsigned char green;
unsigned char red;
unsigned char alpha;
} __attribute__((packed)) ;
类似这个样子的。尤其是spcaview里面的client_t,在pc上sizeof(struct client_t)的值是13,而到了开发板和手机上,它的值就是16了。所以,这个__attribute__((packed))一定要加上才行。
其它的就是基本的编程技巧了,把一些全局变量改成局部的,把一些不必要的定义去掉、能查表的查表,加快运行速度,把频繁多次计算的数变成值直接附值过去,尽量把浮点数乘除法变成移位操作。。。等等。只是为了能够让程序在板子和手机上跑得更顺利一些。这些都做完,呵呵,看着它们全部正常运行,还是很有成就感的,我一高兴就拍了几张照片贴上来,大家也跟我一起高兴高兴。毕竟一个还不算太复杂、又能说明问题的用于演示的小demo搞出来了。手机这块用的是motorola e6做的。
基本的配置图如下所示:
下面是没有打闪光灯拍出来的效果图:
但愿在接下来的面试中,这个demo能够给我带来好运气。如果面试官拒绝看看我的demo,那么这一切工作就都白费了。。。呵呵。。。
祝大家好运,也祝我自己能够找到满意的工作。
加油2008
阅读(5203) | 评论(16) | 转发(0) |