跳至主要内容

【转】vivi开发笔记(二):软件架构分析

文章说明:calmarrow(lqm)原创

文章引自:http://piaoxiang.cublog.cn

 
   虽然想写《vivi软件架构分析》,但是对软件架构并没有清晰的认识。只是以学习的态度,去尽可能的理解吸收vivi的设计思想,以后可以应用到自己的设计中。
 
    vivi的软件架构分为三个层次:vivi配置bootloader stage1bootloader stage2。另外,Vivi还提供了测试程序和工具,并且有简明的文档。具体如图1所示。

    下面进行详细分析。
 
    1 获取源代码
    mizi公司提供vivi的源代码,如果你不知道下载的地址,那么到百度或者google搜索一下,很容易找到。在这里多说两句,搜索引擎之争很激烈。不过你没有必要关注那么多,你所需要的是尽可能快的找到你所需要的有价值的资料。一般而言,百度是土生土长的,搜索时用中文关键词比较合适,而google搜索最好用英文关键词。vivi是国外公司的产品,推荐用google搜索。在google中输入vivi download,很容易发现: http://www.mizi.com/developer/s3c2410x/download/vivi.html。不过很不幸,现在下载地址已经失效了。这时你也许放弃了,我也曾经放弃过。但是你如果使用ftp尝试一下就会发现,就会得到你想要的结果:
 
[armlinux@lqm vivi]$ ftp ftp.mizi.com
Connected to ftp.mizi.com (203.236.241.50).
220 ProFTPD 1.3.0 Server (MIZI Research, Inc. FTP Server) [::ffff:203.236.241.50]
Name (ftp.mizi.com:armlinux): anonymous
331 Anonymous login ok, send your complete email address as your password.
Password:
230-
230-
230- ftp.mizi.com俊 坷脚巴阑 券康钦聪促.
230- ftp.mizi.com篮 固瘤 府辑摹(林)俊辑 款康窍绰 FTP 辑滚 涝聪促.
230-
230- 固瘤 府椽胶 硅器魄篮 力傍阑 吝窜钦聪促.
230- 捞寇 绢敲府纳捞记 棺 包访 磊丰绰 力傍登绊 乐嚼聪促.
230-
230- Warez啊 酒聪骨肺 惑侩绢敲府纳捞记阑 诀肺靛 窍绰巴篮 阂啊钦聪促.
230-
230- 立加磊 : anonymous
230- 肺弊牢 矫埃 : Wed Jul 25 01:38:38 2007
230- 立加 IP : ::ffff:122.4.41.168
230- 立加磊 荐 : 泅犁 (3) / 弥措 (25)
230-
230-
230-
230-
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (203,236,241,50,234,217).
150 Opening ASCII mode data connection for file list
drwxrwxr-x 3 root users 72 Jan 18 2007 incoming
drwxr-xr-x 14 root root 336 Dec 23 2006 pub
d-wx-wx--x 2 (?) staff 48 Nov 18 2004 uploads
-rw-r--r-- 1 root root 399 Jun 29 08:10 welcome.msg
226 Transfer complete.
ftp> cd pub
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,163,137).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 6 root root 456 Sep 6 2002 baekmuk
drwxr-xr-x 7 root root 232 Oct 27 2004 file
drwxr-xr-x 2 root root 344 Feb 27 2004 hanIM
drwxr-xr-x 2 root root 672 Dec 18 2000 htm
drwxr-xr-x 2 root root 376 Jun 7 2000 hwpview
drwxr-xr-x 2 root root 152 May 8 2006 i519
drwxr-xr-x 7 root root 200 Sep 1 2006 kernel
drwxr-xr-x 3 root root 72 Jun 27 2006 linuette
drwxr-xr-x 8 root root 208 Nov 7 2005 misc
drwxr-xr-x 2 root root 344 Dec 20 2001 pen
drwxr-xr-x 6 yjseo cvs 192 Dec 23 2006 prizm
drwxr-xr-x 2 root root 136 Jun 8 2000 xmath
226 Transfer complete.
ftp> cd linuette
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,215,24).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 3 root root 72 Jun 27 2006 SDK
226 Transfer complete.
ftp> cd SDK
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,184,89).
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 root root 96 Jun 27 2006 iso
226 Transfer complete.
ftp> cd iso
250 CWD command successful
ftp> ls
227 Entering Passive Mode (203,236,241,50,132,159).
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 yjseo cvs 640122880 Jun 27 2006 sdk15-S3C2410-tk-20030630.iso
226 Transfer complete.
ftp>
 
    可见,网站改版后,mizi公司把所有的工具都做成iso文件了,600多M。你把该文件下载下,使用搜索功能,可以找到target/box/boot/vivi-20030629.tar.bz2。如果这样的方法还不能找到,那就需要到论坛求助了。
 
    2 解压分析
    解压就不必多说,完成后可以利用tree工具查看一下代码树。(注:tree是Linux下查看目录树的小工具,你可以从ftp://mama.indstate.edu/linux/tree/下载,现在的最新版本是1.5.1)。
 
[armlinux@lqm vivi]$ tree -L 3
… …
45 directories, 233 files
 
    可见vivi的源代码一共有45个文件夹,233个文件。
 
[armlinux@lqm vivi]$ tree -L 1
.
|-- COPYING
|-- CVS
|-- Documentation
|-- Makefile
|-- Makefile.newSDK
|-- Rules.make
|-- arch
|-- drivers
|-- include
|-- init
|-- lib
|-- scripts
|-- test
`-- util

10 directories, 4 files
 
    可以看出,vivi的代码的组织是模仿Linux的内核,如果看过kernel的架构,那么应该会很熟悉。不过现在,我们要分析vivi的核心代码架构,先对上述文件做一下简要的说明。
 

COPYING:GPL协议声明,Gnu General Public License,这里是version 2。如果要具体了解一下GPL协议,那么可以仔细读一下该文件。

CVS: Control version system,一种版本控制的工具。使用cvs,可以很方便的进行版本的控制,节约大量的时间。不过该部分并不属于vivi核心软件架构。

Documentation:帮助文档。关于vivi的简单介绍,如何进行编译,如何booting ARM都有简要的描述。拿到源代码,首先应该看该文件夹,了解一下,它是什么,可以如何进行操作。不过,里面有些帮助文档是韩语,看不懂。

Makefile Makefile.newSDK Rules.make:工程管理。Linux下用make来进行工程管理,对Makefile应该不会陌生。读源代码,首先了解Makefile的内容,会很有帮助。

arch: 处理器架构相关的核心代码。这是vivi bootloader stage1的实现部分。如果要支持其他架构,也需要放到这个文件夹下面。

drivers: 通用的驱动程序。

include: 包含的头文件

init: 初始化的核心代码。这是vivi bootloader stage2的实现部分。

lib: 库文件

scripts: Shell脚本。vivi提供了一种交互式配置机制,实现部分是利用shell脚本来完成的。这也是一个重要的研究内容。

test: 测试文件

util: 小工具。现在包含两个文件,ecc.c, imagewrite.c。

   
    现在首先要去掉不必要的部分。首先,COPYING可以去掉,CVS也可以去掉,Documentation在读完后就可以去掉了,没什么太复杂的东西。
 

[armlinux@lqm bootloader]$ cp vivi architecture –rf //备份先

[armlinux@lqm bootloader]$ cd architecture/
//观察architecture

[armlinux@lqm architecture]$ find . \( -name COPYING -o -name Documentation -o -name CVS -o -name

test -o -name util \) | xargs rm -rf
[armlinux@lqm architecture]$ ls
Makefile Makefile.newSDK Rules.make arch drivers include init lib scripts
//下面分析一下Makefile Makefile.newSDK有什么区别

[armlinux@lqm architecture]$ diff -uN Makefile Makefile.newSDK
--- Makefile 2007-07-25 10:32:55.000000000 +0800
+++ Makefile.newSDK 2007-07-25 10:32:55.000000000 +0800
@@ -14,7 +14,7 @@
 #
 # change this to point to the Linux include directory
 #
-LINUX_INCLUDE_DIR = /opt/host/armv4l/include/
+LINUX_INCLUDE_DIR = /opt/kernel/armv4l/include/
 
 
 VIVIPATH = $(TOPDIR)/include
@@ -22,8 +22,7 @@
 HOSTCC = gcc
 HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
 
-CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-
-#CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-redhat-linux-
+CROSS_COMPILE = /opt/kernel/armv4l/bin/armv4l-mizi-linux-
 
 #
 # Include the make variables (CC, etc...)
@@ -85,8 +84,7 @@
 #
 # Location of the gcc arm libs.
 #
-ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-unknown-linux/2.95.2
-#ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-redhat-linux/2.95.3
+ARM_GCC_LIBS = /opt/kernel/armv4l/lib/gcc-lib/armv4l-mizi-linux/2.95.2
 
 OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr
//可见只是更改了三个宏定义,而这也是移植需要更改的,所以,把Makefile.newSDK删掉

[armlinux@lqm architecture]$ rm Makefile.newSDK
[armlinux@lqm architecture]$ ls
Makefile Rules.make arch drivers include init lib scripts
//然后清理一下内部的测试文档

[armlinux@lqm architecture]$ find . -name *test* -print | xargs rm –rf
[armlinux@lqm architecture]$ tree -L 1
.
|-- Makefile
|-- Rules.make
|-- arch
|-- drivers
|-- include
|-- init
|-- lib
`-- scripts

   
    就vivi工程的管理来说,按照功能划分非常清晰,模块化的划分,设计上很容易增加新的硬件设备。模块与模块之间的接口也很清晰。读完Makefile之后,就会有更为深入的体会。它的配置机制也是如此。这在以后的文档里会详细说明。
 
    当你看清楚了作者组织的思路时,读取源代码就容易得多了。而这个软件架构是否合理,是否清晰,是需要不断借鉴,修改并完善的。这也正是我学习的所在。

评论

此博客中的热门博文

【转】VxWorks中的地址映射

在运用嵌入式系统VxWorks和MPC860进行通信系统设计开发时,会遇到一个映射地址不能访问的问题。 缺省情况下,VxWorks系统已经进行了如下地址的映射:   memory地址、bcsr(Board Control and Status)地址、PC_BASE_ADRS(PCMCIA)地址、Internal Memory地址、rom(Flach memory)地址等,但是当你的硬件开发中要加上别的外设时,如(falsh、dsp、FPGA等),对这些外设的访问也是通过地址形式进行读写,如果你没有加相应的地址映射,那么是无法访问这些外设的。   和VxWorks缺省地址映射类似,你也可以进行相应的地址映射。   如下是地址映射原理及实现:   1、 地址映射结构 在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虚拟地址 physicalAddr:硬件设计时定义的实际物理地址 len;要进行映射的地址长度 initialStateMask:可以初始化的地址状态: 有如下状态: #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片类型还有其特殊状态 initialState:实际初始化的地址状态: 有如下状态: #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITA

【转】cs8900网卡的移植至基于linux2.6内核的s3c2410平台

cs8900网卡的移植至基于linux2.6内核的s3c2410平台(转) 2008-03-11 20:58 硬件环境:SBC-2410X开发板(CPU:S3C2410X) 内核版本:2.6.11.1 运行环境:Debian2.6.8 交叉编译环境:gcc-3.3.4-glibc-2.3.3 第一部分 网卡CS8900A驱动程序的移植 一、从网上将Linux内核源代码下载到本机上,并将其解压: #tar jxf linux-2.6.11.1.tar.bz2 二、打开内核顶层目录中的Makefile文件,这个文件中需要修改的内容包括以下两个方面。 (1)指定目标平台。 移植前:         ARCH?= $(SUBARCH) 移植后: ARCH            :=arm (2)指定交叉编译器。 移植前: CROSS_COMPILE ?= 移植后: CROSS_COMPILE   :=/opt/crosstool/arm-s3c2410-linux-gnu/gcc-3.3.4-glibc-2.3.3/bin/arm-s3c2410-linux-gnu- 注:这里假设编译器就放在本机的那个目录下。 三、添加驱动程序源代码,这涉及到以下几个方面。(1)、从网上下载了cs8900.c和cs8900.h两个针对2.6.7的内核的驱动程序源代码,将其放在drivers/net/arm/目录下面。 #cp cs8900.c ./drivers/net/arm/ #cp cs8900.h ./drivers/net/arm/ 并在cs8900_probe()函数中,memset (&priv,0,sizeof (cs8900_t));函数之后添加如下两条语句: __raw_writel(0x2211d110,S3C2410_BWSCON); __raw_writel(0x1f7c,S3C2410_BANKCON3); 注:其原因在"第二部分"解释。 (2)、修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容: Config ARM_CS8900    tristate "CS8900 support" depends on NET_ETHERNET && A

【转】多迷人Gtkmm啊

前边已经说过用glade设计界面然后动态装载,接下来再来看看怎么改变程序的皮肤(主题)     首先从 http://art.gnome.org/themes/gtk2 下载喜欢的主题,从压缩包里提取gtk-2.0文件夹让它和我们下边代码生成的可执行文件放在同一个目录下,这里我下载的的 http://art.gnome.org/download/themes/gtk2/1317/GTK2-CillopMidnite.tar.gz     然后用glade设计界面,命名为main.glade,一会让它和我们下边代码生成的可执行程序放在同一个目录下边     然后开始写代码如下: //main.cc #include <gtkmm.h> #include <libglademm/xml.h> int main(int argc, char *argv[]) {     Gtk::Main kit(argc,argv);         Gtk::Window *pWnd;        gtk_rc_parse("E:\\theme-viewer\\themes\\gtk-2.0\\gtkrc");       Glib::RefPtr<Gnome::Glade::Xml> refXml;     try     {         refXml = Gnome::Glade::Xml::create("main.glade");     }     catch(const Gnome::Glade::XmlError& ex)     {         Gtk::MessageDialog dialog("Load glade file failed!", false,       \                                   Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);         dialog.run();               return 1;     }         refXml->get_widget("main", pWnd);     if(pW