免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: voidjackjiang

g-bios support JPEG decode [复制链接]

论坛徽章:
0
发表于 2010-09-29 13:01 |显示全部楼层
用 Graphviz + CodeViz可视化函数调用

“工预善其事,必先利其器”,在分析Jpeglib的过程中,我用Graphviz + CodeViz来可视化的显示函数调用关系。
先给大家看张图片, 这是我用Graphviz + CodeViz生成的Jpeglib调用关系图, 解解馋先^_^
tbag@:~/test/ jpeg$ ../../gcc-graph/bin/gcc *.c -o tbag
tbag@:~/test/ jpeg$ genfull
tbag@:~/test/jpeg$ gengraph -d 2 -output-type "png" -f jpeg_decompress2bmp
jpeg_decompress2bmp.png

Note: 由于篇幅有限这里只显示一小张图片,具体参数会在后面解释。

  看完效果图后就要开始安装我们的工具了,以下是我从网上搜集的一些资料,再加上自己的一些总结。
安装
  1. 安装 GraphViz
     调用图的生成依赖于 GraphViz,所以首先要安装 GraphViz。可以下载源码包编译、安装。
我在这偷点懒:tbag@:~$ sudo apt-get install graphviz

    2. 简单安装 CodeViz

下载CodeVize源码包:http://www.csn.ul.ie/~mel/projects/codeviz/codeviz-1.0.11.tar.gz
解压:tbag@:~/down$ tar xvf codeviz-1.0.11.tar.gz
tbag@:~/down$ cd codeviz-1.0.11/
   CodeViz 使用了一个 patch 版本的 GCC 编译器,而且不同的 CodeViz 版本使用的
GCC 版本也不同,可以下载 CodeViz 的源码包后查看 Makefile 文件来确定要使用的 GCC 版
本,codeviz-1.0.11 使用 GCC-3.4.6。实际上安装 CodeViz 时安装脚本会自动下载对应的 GCC
并打 patch,但是这里我们是分步安装,还是清楚一点好, 先安装gcc再回来安装CodeViz。
3. 安装 GCC
   下载gcc-3.4.6.tar.gz到 cd codeviz-1.0.11目录下的compilers里。
下载地址:ftp://ftp.mirrorservice.org/site ... cc/releases/gcc-3.4
.6/gcc-3.4.6.tar.gz
    CodeViz 的安装脚本 compilers/install_gcc-3.4.6.sh 会自动检测 compilers 目录下
是否有 gcc 的源码包,若是没有则自动下载并打 patch,这里前面已经下载,直接移到该
目录即可,则剩下的就是解压安装了。install_gcc-3.4.6.sh 会解压缩 gcc,打 patch,并将
其安装到指定目录,若是没有指定目录,则缺省使用$HOME/gcc-graph,通常指定/usr/
local/gcc-graph(这时需要 root 权限)。
tbag@:~/down/codeviz-1.0.11$ cd compilers/
tbag@:~/down/codeviz-1.0.11/compilers$ ls
gcc-3.4.6.tar.gz  gcc-graph  gcc-patches  install_gcc-3.4.6.sh
tbag@:~/down/codeviz-1.0.11/compilers$ ./install_gcc-3.4.6.sh
接下来就可以去喝杯咖啡了。。。。。
安装 CodeViz
tbag@:~/down/codeviz-1.0.11$ ./configure
tbag@:~/down/codeviz-1.0.11$ make
   # make (这里不需要是因为在脚本中不会检测是否已经 make 了 gcc-3.4.6,前
面已经作过了,所以只要安装 codeviz 即可。编译的目标只是 gcc-3.4.6,codeviz 不需要编
译。具体查看 Makefile 文件)

tbag@:~/down/codeviz-1.0.11$ make install-codeviz
(前面已经安装了 gcc,所谓的安装 codeviz 只是将make install-codeviz
脚本 genfull 和 gengraph 复制到/usr/local/bin 目录下。codeviz 需要 perl 库的支持,我
的系统上缺省安装了 perl,所以没有出现什么问题。若是安装出现问题,则查看
configure 和 Makefile 确定需要安装哪些库即可)
        目前为止,CodeViz 安装完成了,下面看一下它的使用吧。
4.使用
    GraphViz 支持生成不同风格的调用图,但是一些需要安装额外的支持工具或者库程序,
有兴趣的朋友可以到 http://www.graphviz.org 上查找相关资料。这里重点讲述 CodeViz 的
使用方法,具体的图像风格控制不再详述。
    CodeViz 使用两个脚本来生成调用图,一个是 genfull,该脚本可以生成项目的完整调
用图,因此调用图可能很大很复杂,缺省使用 cdepn 文件来创建调用图;另一个是
gengraph,该脚本可以对给定一组函数生成一个小的调用图,还可以生成对应的
postscript 文件。安装时这两个脚本被复制到/usr/local/bin 目录下,所以可以直接使用
而不需要指定路径。
    5.编译
    打了 patch 的 gcc/g++为编译的每个 C/C++文件生成.cdepn 文件,该文件包含函数调
用信息、声明信息等等。
演示:
1)  tbag@:~/test/ jpeg$ ../../gcc-graph/bin/gcc *.c -o tbag
2)  tbag@:~/test/ jpeg$ genfull
3)  tbag@:~/test/jpeg$ gengraph -d 2 -output-type "png" -f jpeg_decompress2bmp

第一步,使用刚刚安装的gcc-3.4.6来编译当前目录下所有.c文件,gcc/g++为编译的每个 C/C++文件生成.cdepn 文件。
第二步:使用此脚本会在当前目录生成一个full.graph文件,该脚本可以生成项目的完整调
用图信息文件, 因此调用图信息文件可能很大很复杂, 缺省使用 cdepn 文件来创建调用图信息文件;
第三步:该脚本可以对给定一组函数生成一个小的调用图,  ‘-d 2’参数是只显示两层调用关系,‘ -output-type "png"’指定 输出格式为png,‘-f jpeg_decompress2bmp’指定从哪个函数开始生成调用关系图。



如果有朋友想更深入的了解使用参数,那么你肯定需要一个“男人”(man) .
以上是我的一些见解,有些地方可能不对,欢迎大家指正。

论坛徽章:
0
发表于 2010-09-30 02:26 |显示全部楼层
工作进展:
最近的裁减工作一直在PC机上完成,从PC机上的显示结果已经裁减了近20K,刚刚我将代码移植到g-bios上,发现下半部分的BIN文件已经少了25K,但是通过计算,jpeg解码部分程序仍有近45K,所以还需努力!

论坛徽章:
0
发表于 2010-10-01 18:10 |显示全部楼层
昨天重新下了g-bios源码,将jpeg移植上去,发现了一个问题,在lib目录下的Makefile少加了一个目录,所以一直编译不过,最后经过跟踪,解决了问题。

论坛徽章:
0
发表于 2010-10-09 01:31 |显示全部楼层
原来的方案:将logo图片cat到下半部的bin文件的尾部,然后在下半部启动时将jpeg移至bss段尾部,这样处理的话需要修改head.S,所以方案不太合理。
新的方案:通过xxd -i 命令将图片转成数组,然后将数组编译到下半部中,此方案比较合理,而且也编译实现。

现在的进展情况:基本完成了对jpeg的移植和精简,方案比较合理。

论坛徽章:
0
发表于 2010-10-09 09:56 |显示全部楼层
国庆7天学习总结

10月1日:完成linux driver module 3和linux driver module 4
.在写linux driver module 4的过程中,出现了以下问题

1)模块不能卸载,每次出现下面这个问题都得重启
tbag@:~/test/LDM/ldm4$ make uninstall
sudo rmmod ldm4_device.ko
ERROR: Module ldm4_device does not exist in /proc/modules
make: [uninstall] Error 1 (ignored)
sudo rmmod ldm4_driver.ko
ERROR: Module ldm4_driver does not exist in /proc/modules

原因是在 struct platform_driver 中没有添加驱动名
        .driver = {
                .name = "ldm4",
        },

2)在写驱动模型的过程中,对函数调用的先后顺序不是很清楚
解决办法:参考linux内核里现有的驱动,比如:linux-2.6xx/driver/char/tty_io.c

总结:10月1日基本完成了ldm3和ldm4,在/dev下面生成了ldm4设备节点,并可以对其读写操作。

计划:接下来的计划是查看jpeg压缩与解压算法的相关资料,并写出一个精简版的解压算法应用到g-bios中。

10月2日:
1)查看jpeg压缩与解压的相关资料,并写了一个字符统计程序(建立huffman树前的一次扫描)。
2)查看色彩模型资料,了解了YUV模型跟RGB模型之间的区别。
3)跟同学一起调试他的ldm4,出现的问题也是安装模块后不能卸载。
问题出在module_exit函数里,跟函数的执行先后顺序有关系。

10月3日:
1)这天没什么进展,尝试去写huffman算法,但没写出来。
2)查看DCT(离散余弦变换)算法的相关资料。

10月4日:
1)通过前两天查看jpeg压缩与解压的相关资料以及自己写的一些程序后,对自己能写出解压算法很是怀疑。
2)这天基本上在看资料,没动手写过代码。
3)晚上看了部电影(如果里面没有李连杰就好了)。

10月5日:
1)已经放弃了写jpeg解压算法。
2)重新写了遍ldm4。

10月6日:
1)学了一些vim技巧,eg.
        vim 如何实现多文件之间字符串的拷贝,关于这个技巧我已经发贴到CU上。
2)练习了一些Makefile的规则
3) 看电影:魔戒2和魔戒3
这次看魔戒比前几次体会更加深刻,山姆再次让我感动,对第二部结束时山姆说的那段话很有感觉。

10月7日:
1) 看K&R C Bible
2) 编译内核
3) 看电影

论坛徽章:
0
发表于 2010-10-11 12:42 |显示全部楼层
现在,jpeg项目快接近尾声了,在结束之前,还在思索能不能让代码更精简。其实,如果有时间的话还是觉得看懂代码之后自己写一个,这样对自己也有很大的帮助,也能使代码更精炼。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP