原创 arm

2009-4-20 13:14 3862 3 3 分类: MCU/ 嵌入式






在ubuntu7.10上搭建uClinux编译开发环境并用Skyeye进行仿真




转载自Ubuntu中文论坛(原文地址:http://forum.ubuntu.org.cn/viewtopic.php?t=88369) 
原文作者: wenwu



首先感谢http://hi.baidu.com/zkheartboy/blog/item/a73927ad3629c9094a36d6f1.html上提供的方法,我在写这篇文章的时候参考了作者的一些方法。
下面的所有操作,在 ubuntu7.10下全部调试通过。
但仅供参考!
我在写的时候,将shell命令完整部分都粘贴了下来,希望你能看清我在操作时的一些路径,这个很重要。
另外,我也是新手~
我写出来,一是希望能帮助其他像我一样的新手,二是希望自己能够从中学到更多的东西。也希望有更多的人能将自己的经历写下来,共同交流!
一、搭建开发环境
在www.uclinux.org上下载以下两个包:
交叉开发工具:arm-elf-tools-20040427.sh
uClinux的源码包:uClinux-dist-20040408.tar.gz
好像现在arm-elf-tools-20040427.sh不太好下,你也可以下载arm-elf-tools-20030314.sh
安装交叉开发工具:进入arm-elf-tools-20040427.sh所在的目录,执行以下命令进行安装:


代码:
$sudo chmod +x arm-elf-tools-20040427.sh
$sudo ./arm-elf-tools-20040427.sh

这两条命令首先是加可执行权限,然后安装。
解压uClinux源码包:
用以下命令:

代码:
$tar zxvf uClinux-dist-20040408.tar.gz


二、下载Skyeye 以便进行仿真:

SkyEye
是开源软件的一个项目,SkyEye的目标是在Linux和Windows操作系统里提供一个完全的仿真环境。SkyEye仿真环境相当于一个嵌入式计算
机系统,你可以在SkyEye里运行一些嵌入式Linux操作系统,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,并能分
析和调试它们的源代码。
如果你想知道关于SkyEye和嵌入式系统更详细的信息,请访问下面的站点:
www.SkyEye.org
http://www.skyeye.org/index_cn.html

安装SkyEye
网上介绍了很多安装方法,其实在ubuntu里面安装最方便:

代码:
wenwu@wenwu-desktop:~$ sudo apt-get install skyeye

这样,一个最新版的skyeye1.2.3就安装好了。
在shell 里面直接键入skyeye后看到如下说明:

代码:
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************

big_endian is false.
Failed to open skyeye config file skyeye.conf in the same directory
error: No such file or directory
------------------------- SkyEye -V1.2 ---------------------------
Usage: SkyEye [options] -e program [program args]
Default mode is STANDALONE mode
------------------------------------------------------------------
Options:
-e exec-file        the (ELF executable format)kernel file name.
-l load_address,load_address_mask
                    Load ELF file to another address, not its entry.
-b                  specify the data type is big endian when non "-e" option.
-d                  in GDB Server mode (can be connected by GDB).
-c config-file      the skyeye configure file name.
-h                  The SkyEye command options, and ARCHs and CPUs simulated.
------------------------------------------------------------------
----------- Architectures and CPUs simulated by SkyEye-------------
-------- ARM architectures ---------
at91
lpc
s3c4510b
s3c44b0x
s3c44b0
s3c3410x
ep7312
lh79520
ep9312
cs89712
sa1100
pxa_lubbock
pxa_mainstone
at91rm92
s3c2410x
s3c2440
sharp_lh7a400
ns9750
lpc2210
ps7500
integrator
-------- BlackFin architectures ----
bf533


表明你的skyeye 已经安装好了,可以随时使用了。
当然,如果你的源里面没有 skyeye,就尝试从下面的方法安装:
首先下载skyeye:
下载地址:http://gro.clinux.org/projects/skyeye/
在这个网址里面有如下两个版本,我建议用1.2.2版本的,1.2.3版本的在安装时往往存在一些问题
skyeye_1_2_2_Rel.tar.bz2
skyeye_1_2_3_Rel.tar.bz2


因为在安装skyeye 时会用到一些别的包,所以在新立得软件包管理器中找到下面的软件包:binutils-dev 标记并安装
下面是关于这个软件包的描述
The GNU binary utilities (BFD development files)
This package includes header files and static libraries necessary to build
programs which use the GNU BFD library, which is part of binutils. Note
that building Debian packages which depend on the shared libbfd is Not
Allowed.

最后使用make命令进行软件的安装,编译完毕后会在binary生成一个skyeye可执行文件,该文件就是skyeye模拟器了。
使用make命令的时候可以加入一些选项参数,例如:
不允许DBCT
$make NO_DBCT=1
不支持LCD
$make NO_LCD=1
不支持BFD库
$make NO_BFD=1
不支持网络设备
$make NO_NET=1
如果在binary目录下生成了skyeye文件,那么安装成功。

为了可以在shell 里面直接运用skyeye命令,将这个路径/source/skyeye_1_2_2_Rel/binary 加入到系统环境变量中

代码:
$gedit /etc/environment

找到有PATH那一行,加入skyeye 路径,比如下面所示
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/slickedit/bin:/source/skyeye_1_2_2_Rel/binary"

重启系统后生效
但我一再提示你,如果你的ubuntu源里面有skyeye,就不要再进行上面那些繁琐的步骤,一条命令apt-get install skyeye就搞定!

三、测试arm-elf-tool 的工作情况
建立一个源文件键入以下代码:

代码:
/*test.c*/
#include <stdio.h>

int main()
{
        int i;
        for(i=0;i<6;i++)
        {
                printf("i=%d\n",i);
                printf("Hello,embedded linux!\n");
        }
        return 0;
}

用以下命令进行编译:

代码:
wenwu@wenwu-desktop:/source/work/test$ arm-elf-gcc -Wl,-elf2flt -o test test.c
wenwu@wenwu-desktop:/source/work/test$ ls
test  test.c  test.gdb

可以看到编译输出两个文件:test和test.gdb,表示编译成功
其中-elf2flt参数是将elf文件格式转为flat文件格式,这个工具是在你安装交叉编译器产生的.
也可以写一个makefile测试,下面是我写的一个,仅供参考:


代码:
#begin
CC=arm-elf-gcc

LDFLAGS=-Wl,-elf2flt

LIBS=
OBJS=test.o

all:test

hello:$(OBJS)
   $(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS)
   
clean:
   rm -rf *.o *.elf *.gdb test
   
#end


执行make 命令后编译成功,最后也生成了test文件,我们来看一下这个test文件

代码:
wenwu@wenwu-desktop:/source/work/test$ file test
test: BFLT executable - version 4 ram

可以看到生成的文件格式为BFLT格式,这是目标平台所支持的格式,所以当你试图:./test时,系统会提示:

代码:
wenwu@wenwu-desktop:/source/work/test$ ./test
bash: ./test:无法执行二进制文件

我们也可以用下面的命令进行编译生成汇编代码

代码:
wenwu@wenwu-desktop:/source/work/test$ arm-elf-gcc -S -o test.S test.c
wenwu@wenwu-desktop:/source/work/test$ file test.S
test.S: ASCII assembler program text

用文本编辑器打开这个文件test.S,就可以看到熟悉的ARM 汇编代码了。

四、测试这个程序:

测试这个程序需要用到一个工具skyeye-testsuits,可以在下面的网址下载:
http://gro.clinux.org/projects/skyeye/
网址里面有testsuite2.1.tar.bz2 但是在这里我们直接下载1.2.0版的二进制的工具包,skyeye-binary-testutils-1.2.0.tar.bz2
下载后解压

代码:
wenwu@wenwu-desktop:/source$ tar jxvf skyeye-binary-testutils-1.2.0.tar.bz2

进入下面这个目录,这是我们主要用到的目录。

代码:
wenwu@wenwu-desktop:/source$ ls skyeye-binary-testutils-1.2.0/at91x40/uclinux2
boot.rom  linux  readme  skyeye.conf

这个目录里面有四个文件,其中linux就是内核映像,boot.rom是要写到Flash里面去的。里面包含文件系统。skyeye.conf是配置文件。
可以在命令行里键入以下代码,

代码:
skyeye -e linux

你看到了什么?没错,我没有骗你

代码:
          ____ _  _
         /  __| ||_|                 
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|

当你看到这幅图片的时候,是不是感觉很爽?呵呵,我也是。

刚才我们不是写了一个代码吗?下面我们就看看怎么运行我们的程序:
首先在skyeye-binary-testutils-1.2.0/at91x40/uclinux2这个目录里面建立一个文件夹:romfs
这个目录主要用来存放用户程序,就是最后你写的程序也要拷到这个目录里面。

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ mkdir romfs
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls
boot.rom  linux  readme  romfs  skyeye.conf

但是我们必须把系统已有的文件系统里面的程序也拷出来,也就是把boot.rom本身所有的程序也要拷到romfs这个文件夹里面,所以首先要进行一次挂载,所以进入/mnt目录,建立一个临时文件夹tmp,如下所示

代码:
wenwu@wenwu-desktop:/mnt$ ls
wenwu@wenwu-desktop:/mnt$ sudo mkdir tmp
wenwu@wenwu-desktop:/mnt$ ls
tmp

用 mount -o loop src dst命令进行挂载,如下所示:

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo mount -o loop boot.rom /mnt/tmp/
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls /mnt/tmp/
bin  dev  etc  home  lib  mnt  proc  sbin  tmp  usr  var

然后把这里面的所有文件拷贝到我们刚才所建的那个我们自己的文件夹romfs里面

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo cp -r /mnt/tmp/* ./romfs/

这时,我们自己的文件夹里面有以下内容:

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls romfs/
bin  dev  etc  home  lib  mnt  proc  sbin  tmp  usr  var

将我们刚才生成的一个测试程序test也拷贝过来到romfs/bin目录时面:

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo cp /source/work/test/test romfs/bin/
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls romfs/bin/
boa      dhcpcd  ftp   gdbserver  inetd  login  ping    route  telnet   test
busybox  expand  ftpd  ifconfig   init   mount  reboot  sh     telnetd  umount


用genromfs这个工具重新制作文件系统

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo genromfs -f boot.rom -d ./romfs/
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls -l boot.rom
-rw-r--r-- 1 wenwu wenwu 1561600 2007-11-11 14:03 boot.rom

好了,下面我们再运行skyeye进行仿真,键入:skyeye -e linux

代码:
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ skyeye -e linux
big_endian is false.
arch: arm
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x8057550
ethmod num="1", mac addr="0:4:3:2:1:f", hostip="10".0.0.1
can't find device module: (name:net, typenull))
log_info: log is off.
log_info:log file is /tmp/test.log, fd is 0x80f9318
log_info: log start clock 3200000
log_info: log end clock 3330000
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm7100 mmu ops
Loaded ROM   ./boot.rom
start addr is set to 0x01000000 by exec file.
Linux
version 2.4.20-uc0 (chy@localhost.localdomain) (gcc version 2.95.3
20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #7 ?? 8?? 1 19:43:07 CST 2003
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone(0): 0 pages.
zone(1): 1024 pages.
zone(2): 0 pages.
Kernel command line: root="/dev/rom0"
Calibrating delay loop... 12.97 BogoMIPS
Memory: 4MB = 4MB total
Memory: 2984KB available (833K code, 181K data, 40K init)
Dentry cache hash table entries: 512 (order: 0, 4096 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 1024 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 1400000-157D3FF [VIRTUAL 1400000-157D3FF] (RO)
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
SkyEye NE2k Ethernet driver version 0.2 (2003-04-27)
sene2k dev name: eth0: <6>NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
sys_mount:dev_name /dev/root,dir_name /root, type ext2, flag 0x8001, data 0
 sys_mount:1 data_page 1122000, type_page 113bf74, dev_page 0, dir_page 8001
sys_mount:2 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
sys_mount:3 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
sys_mount:4 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
sys_mount:dev_name /dev/root,dir_name /root, type romfs, flag 0x8001, data 0
 sys_mount:1 data_page 0, type_page 117f000, dev_page 117d000, dir_page 8001
sys_mount:2 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
sys_mount:3 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
sys_mount:4 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000
VFS: Mounted root (romfs filesystem) readonly.
sys_mount:dev_name .,dir_name /, type <NULL>, flag 0x2000, data 0
 sys_mount:1 data_page 111c120, type_page 0, dev_page 10e5d00, dir_page 10e5174
sys_mount:2 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000
sys_mount:3 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000
sys_mount:4 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
sys_mount:dev_name /proc,dir_name /proc, type proc, flag 0xc0ed0000, data 11d0008
 sys_mount:1 data_page 1000, type_page 1002, dev_page 118a008, dir_page c0ed0000
sys_mount:2 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000
sys_mount:3 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000
sys_mount:4 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000
mount: /etc/mtab: Read-only file system
Command: mount -t ext2 /dev/ram0 /var
sys_mount:dev_name /dev/ram0,dir_name /var, type ext2, flag 0xc0ed0000, data 11d0008
 sys_mount:1 data_page 111c260, type_page 119fe40, dev_page 0, dir_page c0ed0000
sys_mount:2 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000
sys_mount:3 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000
sys_mount:4 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000
mount: /etc/mtab: Read-only file system
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|                 
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|

GDB/ARMulator support by <davidm@snapgear.com>
For further information check:
http://www.uclinux.org/

Command: /bin/ifconfig eth0 up 10.0.0.2
Execution Finished, Exiting

Sash command shell (version 1.1.1)
/>

在这里面进行以下操作:

代码:
/> cd bin
/bin> ./test
i=0
Hello,embedded linux!
i=1
Hello,embedded linux!
i=2
Hello,embedded linux!
i=3
Hello,embedded linux!
i=4
Hello,embedded linux!
i=5
Hello,embedded linux!
/bin>


看到程序在运行了吗?

五、编译我们的uClinux内核

首先解压

代码:
tar zxvf uClinux-dist-20040408.tar.gz

这是在你解压的目录里面会生成一个 uClinux-dist目录
shell 中进 uClinux-dist目录,执行make menuconfig进行配置,我猜你遇到了和我一样的问题:


代码:
wenwu@wenwu-desktop:/source/uClinux-dist$ make menuconfig
config/mkconfig > config.in
make -C /source/uClinux-dist/config/scripts/lxdialog all
make[1]: Entering directory `/source/uClinux-dist/config/scripts/lxdialog'
/usr/bin/ld: cannot find -lncurses
collect2: ld 返回 1
-e
>> Unable to find the Ncurses libraries.
>>
>> You must have Ncurses installed in order
>> to use 'make menuconfig'

make[1]: *** [ncurses] 错误 1
make[1]: Leaving directory `/source/uClinux-dist/config/scripts/lxdialog'
make: *** [menuconfig] 错误 2
wenwu@wenwu-desktop:/source/uClinux-dist$


其实是没有安装ncurses开发包,安装就是了
在新立得软件管理器中找到libncurses5-dev,安装
用的朋友喜欢用make xconfig,直接运行会出现如下错误:

代码:
wenwu@wenwu-desktop:/source/uClinux-dist$ sudo make xconfig
config/mkconfig > config.in
make -C /source/uClinux-dist/config/scripts tkparse
make[1]: Entering directory `/source/uClinux-dist/config/scripts'
make[1]: “tkparse”是最新的。
make[1]: Leaving directory `/source/uClinux-dist/config/scripts'
ARCH=dummy /source/uClinux-dist/config/scripts/tkparse < config.in > config.tmp
cat /source/uClinux-dist/config/scripts/header.tk >> ./config.tk
cat config.tmp >> config.tk
rm -f config.tmp
echo "set defaults \"/dev/null\"" >> config.tk
echo "set help_file \"config/Configure.help\"" >> config.tk
cat /source/uClinux-dist/config/scripts/tail.tk >> config.tk
chmod 755 config.tk
make: wish:命令未找到
make: *** [xconfig] 错误 127


解决办法是在新立得软件包管理器中找到以下几项并安装,然后再运行make xconfig就可以看到图形界面了。
tcl8.4
tcl8.4-dev
tk8.4
k8.4-dev

然后再进行配置:在下面这个选项里面选择GDB ARMulator,怎么选择应该不用再说了吧?

代码:
  --- Select the Vendor you wish to target 
   (GDB) Vendor
 --- Select the Product you wish to target
     (ARMulator) GDB Products   


Kernel选择2.4内核,Libc Version选择uC-libc

代码:
(linux-2.4.x) Kernel Version 
  (uC-libc) Libc Version         
[ ] Default all settings (lose changes)
[ ] Customize Kernel Settings         
[ ] Customize Vendor/User Settings
[ ] Update Default Vendor Settings   

退出它会提示:

代码:

   Do you wish to save your new kernel configuration?
                   < Yes >      <  No  >                           

选择Yes
这个时候就可以进行编译了,编译首先用make dep
然后用make
很不幸,我们的错误总是不断存在!


代码:
arm/clone.S: Assembler messages:
arm/clone.S:34: Error: undefined symbol `EINVAL' in operation
make[3]: *** [arm/clone.o] 错误 1
make[3]: Leaving directory `/source/uClinux-dist/lib/libc/sysdeps'
make[2]: *** [subdirs] 错误 1
make[2]: Leaving directory `/source/uClinux-dist/lib/libc'
make[1]: *** [all] 错误 2
make[1]: Leaving directory `/source/uClinux-dist/lib'
make: *** [subdirs] 错误 1

但有时候,就是因为这些错误使我们不断前行。
其实很多人都遇到了这个错误 ,是上面的库文件选择错了,什么?错了你还写在上面?我是想让你有更深的记忆!
make clean把上次编译过程生成的中间文件删除
然后make menuconfig
这次,我们把Libc Version换成uClibc

代码:
(uClibc) Libc Version

再重复上面的步骤:

代码:
make dep
make


这个编译过程比较长,耐心等待。
编译成功后会在uClinux-dist目录里面生成一个images目录,这个目录里面有四个文件:
image.bin:这是包含内核映像和 romfs文件系统映像,可以写到Flash中的文件,
linux.data:包括内核所有的数据段
linux.text:包括内核所有的代码段
romfs.img:文件系统
另外在uClinux-dist/linux-2.4.x目录里面生成了两个文件:linux和system.map
linux:linux内核文件
system.map:内核符号表

然后在uClinux-dist目录里面建一个skyeye.conf文件,并键入以下配置文件

代码:
#skyeye config file sample
cpu: arm7tdmi

mach: at91

mem_bank: map="M", type="RW", addr="0x00000000", size="0x00004000"
mem_bank: map="M", type="RW", addr="0x01000000", size="0x00400000"
mem_bank: map="M", type="R",  addr="0x01400000", size="0x00400000", file=./boot.rom
mem_bank: map="M", type="RW", addr="0x02000000", size="0x00400000"
mem_bank: map="M", type="RW", addr="0x02400000", size="0x00008000"
mem_bank: map="M", type="RW", addr="0x04000000", size="0x00400000"
mem_bank: map="I", type="RW", addr="0xf0000000", size="0x10000000"

注意这个配置文件中需要boot.rom 文件系统,但是我们并没有生成boot.rom文件系统,怎么办?
ln -s images/romfs.img boot.rom

代码:
wenwu@wenwu-desktop:/source/uClinux-dist$ ln -s images/romfs.img boot.rom

这是就可以在uClinux-dist 目录里面看到boot.rom这个文件
下面就可以用skyeye运行我们自己编译出来的内核了。

代码:
wenwu@wenwu-desktop:/source/uClinux-dist$ skyeye -e linux-2.4.x/linux
big_endian is false.
arch: arm
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x8057550
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm7100 mmu ops
Loaded ROM   ./boot.rom
start addr is set to 0x01000000 by exec file.
Linux
version 2.4.24-uc0 (wenwu@wenwu-desktop) (gcc version 2.95.3 20010315
(release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #2 2007年 11月 11日 星期日 16:21:16 CST
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone(0): 0 pages.
zone(1): 1024 pages.
zone(2): 0 pages.
Kernel command line: root="/dev/rom0"
Calibrating delay loop... 15.82 BogoMIPS
Memory: 4MB = 4MB total
Memory: 2968KB available (850K code, 180K data, 40K init)
Dentry cache hash table entries: 512 (order: 0, 4096 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 1024 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 1400000-14AC3FF [VIRTUAL 1400000-14AC3FF] (RO)
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
VFS: Mounted root (romfs filesystem) readonly.
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|                 
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|

GDB/ARMulator support by <davidm@snapgear.com>
For further information check:
http://www.uclinux.org/

Execution Finished, Exiting

Sash command shell (version 1.1.1)
/>


相信到这里整个uClinux 开发环境的拱建以及在skyeye上的运行方法都已经很清楚了。








系统分类:


嵌入式


用户分类:

LINUX

标签:

Ubuntu uClinux skyeye

来源:

转贴



发表评论
阅读全文(613) | 回复(0)









1




关于投票





skyeye使用简介




摘自http://www.dzkf.cn/html/qianrushixitong/2006/1031/941.html


SkyEye是一个开源软件(opensource
software)项目,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式
计算机系统(目前支持基于arm7tdmi的AT91开发板);可在SkyEye上运行uclinux以及uC/OS-II等多种嵌入式操作系统,并对它
们进行源码级的分析和测试。SkyEye的推出具有下面两方面的意义:


   
首先,通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境的用户来说,它将是一个非
常有效的学习工具和开发手段。因此,如果您想学习Liunx操作系统或者进行嵌入式系统开发,但苦于没有硬件支持的话,欢迎使用SkyEye仿真环境软
件!


1 在linux 下安装skyeye


1.1 从源代码进行安装skyeye
下载最新的skyeye-v0.x.x.tar.bz2源码包,目前最新的为skyeye-v0.4.7.tar.bz2


解开skyeye-v0.x.x.tar.bz2 :
tar jxf skyeye-v0.x.x.tar.bz2


进入解压后的skyeye目录,按照SkyEye.README介绍的步骤做configure,make,make install
cd skyeye
./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
make
make install


如果一切正常,则在/usr/local/bin目录下,有一个执行文件skyeye



注意:
需要指出的是,在mandrake8.2环境中,make 时会有error,不过不是什么大问题,


error:display.c->tcap.h->termcap.h:no such file or directory


在本机/usr/include下find一下,termcap.h头文件在/usr/include/ncurses目录下,


将termcap.h中的<termcap.h>改成<ncurses/termcap.h>


重新执行make就ok了。


执行make install命令后,skyeye默认安装在/usr/local/bin/目录下,你可以通过改configure命令参数prefix来改变安装路径。


1.2 直接安装编译好的skyeye
下载最新的skyeye执行代码skyeye-0.x.x-redhat9.0.bin (目前只提供了在redhat9下编译好的代码),目前最新的版本为 skyeye-0.4.7-redhat9.0.bin
把下载的skyeye-0.4.7-redhat9.0.bin 移动到/usr/local/bin下,并改名为skyeye,改变skyeye的属性:
mv skyeye-0.4.7-redhat9.0.bin /usr/local/bin/skyeye
chmod 755 /usr/local/bin/skyeye



2 安装arm-elf交叉编译器 (用于编译ucosii4skyeye 和 uclinux4skyeye)
下载arm-elf-tools-20030314.sh 位于 ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm目录下,或到www.uclinux.org处下载
改变文件属性,并执行:
chmod 755 arm-elf-tools-20030314.sh
./arm-elf-tools-20030314.sh


结束后,arm-elf-gcc/gdb....工具会安装到/usr/local/bin下



3 安装 ucosii for skyeye
3.1 从源码安装
下载ucosii for skyeye源代码,目前的最新版本源代码为ucosii4skyeye-v1.8.2.tgz
解压文件:
tar zxf ucosii4skyeye-vx.x.x.tgz


进入解压生成的目录下,编译ucosii for skyeye:
cd ucosii4skyeye
make config
make dep
make


结束后,则生成五个sample的执行文件,分别位于ucosii4skyeye/samples/对应的应用名目录下。


3.2 直接下载编译好的cuosii for skyeye
目前最新的版本为ucosii4skyeye-binary-v1.8.tgz
解压文件:
tar zxf ucosii4skyeye-binary-v1.8.2.tgz


4 调试 ucosii for skyeye
在一个存在 skyeye.conf和*.elf文件(设为simple_test.elf)的目录下,执行:
skyeye simple_test.elf
(skyeye) target sim
(skyeye) load
(skyeye) run


就可以看到程序运行的情况



5 编译并运行uClinux-dist-20020927.tar.gz


运行环境:redhat9


前提:安装了 arm-elf-tools工具
以uClinux-dist-20020927.tar.gz为例。位于 ftp://166.111.68.183/pub/embed/uclinux/soft/目录下,或到www.uclinux.org处下载
将uClinux-dist-20020927.tar.gz下载并解开,比如解开在/usr/src/uclinux-dist/下,然后在/usr/src/uclinux-dist/目录下执行如下命令:
tar zxf uClinux-dist-20020927.tar.gz
cd uClinux-dist
在图形方式下可用命令 make xconfig 或 在命令行方式下可用命令 make menuconfig


在vendor/product中选择GDB/ARMulator,kernel版本选择2.4,save and exit.


------------------------------------------------------------------------------------------------------------------------------------------------


这时在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux文件


如果想一步生成带调试信息的linux kernel执行文件和linux kenel 执行文件映像和磁盘映像文件romfs.img


可简单是运行命令
make dep
make
就行了。可查看/usr/src/uclinux-dist/images/下是否有文件 romfs.img等
在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux的elf格式的内核执行文件
-------------------------------------------------------------------------------------------------------------------------------------------------
在 uclinux-dist 目录下建立仿真AT91的skyeye配置文件 skyeye.conf,内容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map="M", type="RW", addr="0x00000000", size="0x00004000"
mem_bank: map="M", type="RW", addr="0x01000000", size="0x00400000"
mem_bank: map="M", type="R", addr="0x01400000", size="0x00400000", file="images/romfs".img
mem_bank: map="M", type="RW", addr="0x02000000", size="0x00400000"
mem_bank: map="M", type="RW", addr="0x02400000", size="0x00008000"
mem_bank: map="M", type="RW", addr="0x04000000", size="0x00400000"
mem_bank: map="I", type="RW", addr="0xf0000000", size="0x10000000"



这个时候就可以用skyeye来调试运行kernel了,在/usr/src/uclinux-dist执行如下命令:


skyeye linux-2.4.x/linux


(skyeye)target sim


(skyeye)load


(skyeye)run


kernel start.....


注意:
要在 skyeye.conf 所在目录下执行skyeye。


6 下载测试软件集合
目前最新版本的测试软件集合为:
skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
到 ftp:/166.111.68.183/pub/embed/skyeye/binary/下载


解压并测试:
tar jxf skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
cd test


可以看到有编译好的skyeye 和编译好的针对各个硬件平台的内核代码执行过程与上面类似






系统分类:


嵌入式


用户分类:

LINUX

标签:

skyeye

来源:

转贴



发表评论
阅读全文(514) | 回复(1)









1




关于投票





SKYEYE安装笔记




摘自:http://www.dzkf.cn/html/qianrushixitong/2007/0803/2460.html


1.简介
    SkyEye是一个开源软件项目,它是在Linux和Windows平台上实现一个纯软件模拟集成开发环境,模拟常见的嵌入式系统。可以在SkyEye上运行Linux,uClinux以及uC/OS-II等多款嵌入式操作系统和各种系统软件。
    目前最新版本的SkyEye是skyeye-1.2-RC6.tar.bz2版本,该版本可以从www.skyeye.org获取。SkyEye目前支持多款嵌入式处理器:


  • ATMEL AT91X40
  • PHILIPS LPC2xxxx
  • Samsung s3c4510b
  • Samsung s3c44b0
  • Cirrus Logic EP7312
  • sharp LH79520
  • Cirrus Logic EP9312
  • cs89712
  • sa1100
  • xscale pxa250 lubbock developboard
  • xscale pxa270 mainstone developboard
  • at91RM9200
  • s3c2410x
  • s3c2440
  • sharp lh7a400 developbaord
  • NetSilicon ns9750
  • Philips LPC2210

对于附加设备该项目已经完成对Flash,LCD,Network Interface Card,touchsceen, UART的支持


2.SkyEye的安装
下面我就以最新版本的skyeye-1.2.RC6为例子安装SkyEye.
我的系统配置入下
操作系统: Fedora Core 2 Linux(2.4.x)
GCC Version: 3.3.2
arm-elf-gcc Version: 2.95.3 20010315


首先从www.uClinux.org下载arm-elf-tools,里面包含arm-elf-gcc, arm-elf-ld等工具。下载后可以通过如下方式安装:
$su -c './arm-elf-tools-20030315.sh'
$password:


安装完毕后,可以进入存放skyeye的目录,例如我的是放在/home/jelly/download/目录。然后进行解压。
$cd ~/download
$ls
skyeye-1.2-RC6.tar.bz2


$tar jxvf skyeye-1.2-RC6-tar.bz2


然后进入解压的skyeye目录
$cd skyeye-v1


最后使用make命令进行软件的安装,编译完毕后会在binary生成一个skyeye可执行文件,该文件就是skyeye模拟器了。
使用make命令的时候可以加入一些选项参数,例如:


  • 不允许DBCT
    $make NO_DBCT=1
  • 不支持LCD
    $make NO_LCD=1
  • 不支持BFD库
    $make NO_BFD=1
  • 不支持网络设备
    $make NO_NET=1

如果在binary目录下生成了skyeye文件,那么安装成功。下面我以uClinux为例子,在skyeye上模拟。可以通过使用-h参数来获取帮助
$skyeye -h
------------------------- SkyEye -V1.2 ---------------------------
Usage: SkyEye [options] -e program [program args]
Default mode is STANDALONE mode
------------------------------------------------------------------
Options:
-e exec-file the (ELF executable format)kernel file name.
-d in GDB Server mode (can be connected by GDB).
-c config-file the skyeye configure file name.
-h This Help Display
-v This shows arch and cpu supported
------------------------------------------------------------------
-e 指定elf各式的内核文件
-d GDB调试模式
-c 指定配置文件
-h 获取帮助
-v 显示体系结构和CPU支持信息(不知道是不是我用的这个版本没有实现该功能,使用-v选项后显示:Unknown option '-v')


3.uClinux移植
www.uclinux.org网站上下载比较新的内核包文件,并且解压。
$tar xvzf uClinux-dist-xxxxxxxx.tar.gz
进入生成的uClinux-dist目录
可以使用make xconfig - 图形配置模式,make menuconfig - 菜单模式配置,方式来配置uClinux.
在uClinux-dist目录下执行:
$make xconfig


在Target Platform Selection选项卡中选择:
Vendor/Product: GDB/ARMulator
Kernel Version: linux-2.4.x
Libc Version: uC-libc
然后选择save and exit


完成配置后,可以使用make dep建立内核依赖关系,然后使用make编译内核和文件系统
$make dep; make


经过一段时间的编译后,如果没有出现错误,则在uClinux-dist目录下的images目录里会建立如下几个文件:
image.bin linux.data linux.text. romfs.img
该romfs.img就是我们需要的文件系统映象了
同时,在uClinux-dist/linux-2.4.x/目录下会生成linux,该文件是一个我们需要模拟的内核文件。


接下来我们可以使用skyeye软件来模拟我们编译的uClinux系统了。
我们在uClinux-dist目录下建立一个名为skyeye.conf的配置文件。
内容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map="M", type="RW", addr="0x00000000", size="0x00004000"
mem_bank: map="M", type="RW", addr="0x01000000", size="0x00400000"
mem_bank: map="M", type="R", addr="0x01400000", size="0x00400000", file="images/romfs".img
mem_bank: map="M", type="RW", addr="0x02000000", size="0x00400000"
mem_bank: map="M", type="RW", addr="0x02400000", size="0x00008000"
mem_bank: map="M", type="RW", addr="0x04000000", size="0x00400000"
mem_bank: map="I", type="RW", addr="0xf0000000", size="0x10000000"
lcd: state="on"


保存退出


然后在uClinux-dist目录里执行~/download/skyeye-v1/binary/skyeye -e linux-2.4.x/linux
看看uclinux是不是跑起来了?
下面是我的输出


arch: arm
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x80727e0
can't find device module: (null)
SKYEYE: use arm7100 mmu ops
Loaded ROM images/romfs.img
exec file "linux-2.4.x/linux"'s format is elf32-little.
load section .init: addr = 0x01000000 size = 0x0000a000.
load section .text: addr = 0x0100a000 size = 0x000c5ca0.
load section .data: addr = 0x010d0000 size = 0x00008320.
not load section .bss: addr = 0x010d8320 size = 0x00022198 .
not load section .debug_abbrev: addr = 0x00000000 size = 0x00039846 .
not load section .debug_info: addr = 0x00000000 size = 0x016b812f .
not load section .debug_line: addr = 0x00000000 size = 0x00378ef3 .
not load section .debug_pubnames: addr = 0x00000000 size = 0x0000b40d .
not load section .debug_aranges: addr = 0x00000000 size = 0x000022e0 .
start addr is set to 0x01000000 by exec file.
Linux
version 2.4.19-uc1 (jelly@localhost.localdomain) (gcc version 2.95.3
20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #1 五 4#1 五 4月 7 23:41:40 CST 2006
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone(0): 0 pages.
zone(1): 1024 pages.
zone(2): 0 pages.
Kernel command line: root="/dev/rom0"
Calibrating delay loop... 12.97 BogoMIPS
Memory: 4MB = 4MB total
Memory: 3036KB available (791K code, 170K data, 40K init)
Dentry cache hash table entries: 512 (order: 0, 4096 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 1024 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 1400000-145DBFF [VIRTUAL 1400000-145DBFF] (RO)
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
VFS: Mounted root (romfs filesystem) readonly.
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|               
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|


GDB/ARMulator support by <davidm@snapgear.com>
For further information check:
http://www.uclinux.org/


Execution Finished, Exiting


Sash command shell (version 1.1.1)
/>


对于skyeye.conf文件的一点说明
对于skyeye-v0.2.5版本之前的skyeye使用的是memmap.conf文件,而之后的是使用skyeye.conf文件
cpu: 指定CPU类型,如arm7tdmi,arm720t等
mach: 开发板类型,如at91, ep7312
mem_bank: 内存块
map=M 指定为rom/ram, map="I" 指定为IO空间
type=RW 可读写,type=R 只读
addr=0x00000000 内存块开始地址
size=0x10000000 内存块大小
files=romfs.img 文件系统映象文件
net: 网络配置
state=on 模拟NIC,等于off则不模拟
mac=0:4:3:2:1:f 指定MAC地址
ethmod=tuntap/vnet 使用虚拟驱动
hostip= 指定ip地址
例如:net: state = on, mac="0:4:3:2:1:f", ethmod="tuntap", hostip="10".0.0.1


uart: 串口支持
fd_in= 指定输入文件
fd_out= 指定输出文件
例如:uart: fd_in=/dev/ttyS0, fd_out=/dev/ttyS1
则你可以使用minicon来监听COM1口来进行数据交换


LCD:LCD模拟
state = on/off 打开或者关闭LCD模拟


4.SkyEye调试功能
要使用SkeyEye调试功能,可以在执行的时候加入-d参数,例如:
$skyeye -e linux -d
这时就在本机的12345端口开启了gdb服务


这时重新开一个终端程序
$arm-elf-gdb linux
(gdb)target remote 127.0.0.1:12345
此时就可以象使用本地gdb一样来调试服务端的uClinux了。



5.参考文档
1.skyeye源码
2.SkyEye User Manual http://skyeye.sourceforge.net/wiki/UserManual
3.skyeyelcdts http://gro.clinux.org/frs/download.php/789/SkyEyelcdtouchscreen4gro.pdf
4.skyeyeinternal http://gro.clinux.org/frs/download.php/719/skyeyeinternal-0.6.8.pdf
5.hardwaredoc4skyeye http://gro.clinux.org/frs/download.php/835/hardwaredoc4skyeye.tar.bz2






系统分类:


嵌入式


用户分类:

LINUX

标签:

skyeye

来源:

转贴



发表评论
阅读全文(368) | 回复(1)









0




关于投票





使用SkyEye仿真




SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具,这样就可以在没有硬件条件下来进行嵌入式系统的开发。以下操作均在Fedora Core 1.0里通过。


Skyeye项目资源列表
http://gro.clinux.org/projects/skyeye/



文档摘要:
1、什么是SkyEye?
2、SkyEye可以做什么事情?
3、安装SkyEye
4、安装arm-elf交叉编译器
5、测试你的arm-elf-gcc编译器

6、执行你的hello程序
7、一个应用程序的开发实例
8、编译并运行uClinux-dist-20030909.tar.gz
9、加入网络功能
10、安装完成SkyEye后,下一步将做什么?



1、什么是SkyEye?
SkyEye是开源软件的一个项
目,SkyEye的目标是在Linux和Windows操作系统里提供一个完全的仿真环境。SkyEye仿真环境相当于一个嵌入式计算机系统,你可以在
SkyEye里运行一些嵌入式Linux操作系统,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,并能分析和调试它们的源
代码。


如果你想知道关于SkyEye和嵌入式系统更详细的信息,请访问下面的站点:
www.SkyEye.org
http://www.skyeye.org/index_cn.html


通过SkyEye能仿真下面的硬件:
CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale
CPU:
Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel
XScale PXA 250/255, CS89712, samsung 4510B,samsung 44B0(还不全)
内存: RAM, ROM, Flash
周边设备: Timer, UART, ne2k网络芯片, LCD, 触摸屏等


目前能在SkyEye上运行下面的操作系统和系统软件:
uC/OSII-2.5.x(支持网络)
uClinux(基于Linux2.4.x内核, 支持网络)
ARM Linux 2.4.x/2.6.x
lwIP on uC/OSII
基于uC/OSII, uClinux, ARM Linux的应用程序


2.SkyEye可以做什么事情?
1. 通过SkyEye可以帮助促进嵌入式系统的学习,在不需要额外硬件的情况下学习和分析uclinux操作系统和其它嵌入式操作系统,如ucosII等。
2. SkyEye可用于嵌入式系统的教学。
3. 希望通过skyeye促进操作系统的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。
4. 可以基于SkyEye进行仿真特定硬件模块的研究。
5. SkyEye可以作为嵌入式集成开发环境开发嵌入式系统(当然需要对SkyEye做大量的工作)。
注:引自陈渝《SkyEye Project FAQ》



3、安装SkyEye
http://gro.clinux.org/projects/skyeye/下载skyeye-0.7.0.tar.bz2包:


tar jxvf skyeye-v0.7.0.tar.bz2


进入解压后的skyeye目录,如果SkyEye的版本低于0.6.0,则运行下面的命令:


./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest


如果SkyEye的版本高于0.6.0,则运行下面的命令:


./configure --target=arm-elf --prefix=/usr/local


接下来执行:


make
make install


安装完成后执行skyeye


注意:
a.如果你使用的是Mandrake Linux发行版,那么你在编译SkyEye时遇到错误,并且错误与readline, ncurse, termcap等有关,你可以试试下面的方法:


ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h


接着再make和make install看能否成功!
b.如果你的Linux发行版是Debian Linux,那么不要使用gcc 2.95或是gcc 3.0,请使用gcc 3.2+
c.gcc的版本要在2.96或以上
d.如果SkyEye的版本大于0.6.0,那么使用LCD仿真需要在Linux系统里安装GTK软件。


4、安装arm-elf交叉编译器
下载arm-elf-tools-20030314.sh
ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm
或到
ftp://166.111.8.229/OS/Embeded


执行:
chmod a+x arm-elf-tools-20030314.sh
然后:
./arm-elf-tools-20030314.sh


ls /usr/local/bin/


你应能看到以arm-elf开头的可执行文件,其中arm-elf-gcc就是用来编译你目标平台的编译器的,当然还有一些小工具,后面将一一讲来。


5、测试你的arm-elf-gcc编译器
先写一个小程序hello.c

#include <stdio.h>
int main(void)
{
    int i;
    for(i = 0; i < 6; i++){
        printf("i = %d  ",i);
        printf("Hello, embedded linux!\n");
    }
    return 0;
}
然后执行:


arm-elf-gcc -Wl,-elf2flt -o hello hello.c


-elf2flt参数是将elf文件格式转为flat文件格式,这个工具是在你安装交叉编译器产生的。或者你可以写个Makefile文件,执行:


make


这里是我的Makefile文件,仅供参考:

# begin
CC = arm-elf-gcc
CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS = -Wl,-elf2flt
LIBS =
OBJS = hello.o
all:    hello
hello:  $(OBJS)
        $(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) $(LIBS)
clean:
        rm -rf *.o *.elf *.gdb hello
# end
如果编译通过,就会产生hello可执行文件。用下面的命令:


file hello


你会发现,它是BFLT(binary FLAT),你目标平台所支持的文件格式。


6、执行你的hello程序
这里,我们将借助genromfs这个小工具来完成测试,这个工具就是你在安装交叉编译器时产生的,你可以直接使用它。


http://gro.clinux.org/projects/skyey...-1.0.4.tar.bz2包:


tar jxvf skyeye-binary-testutils-1.0.4.tar.bz2
cd testsuits/at91/uclinux2(当然你还可以用别的)
mkdir romfs(建一个目录,后面用)
mount -o loop boot.rom /mnt/xxx
cp -r /mnt/xxx/* romfs


另外,把你编译好的可执行程序拷贝到/romfs/bin目录里,这里就是hello了!


genromfs -f boot.rom -d romfs/


注:可以用genromfs -h来获得帮助!


OK!执行下面的命令:


skyeye linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....


很熟悉了吧。。。


cd /bin
hello


可以看到结果了吗?其实到了这一步,你就可以开发自己的程序了!


7、一个应用程序的开发实例


下面介绍的程序主要是完成一个网络应用,网络应用的标准模型是客户机-服务器模型,它的主要执行过程如下:
(1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求;
(2)在网络的某台机器上,用户执行客户机程序;
(3)客户机进程与服务器进程建立一条连接;
(4)连接建立之后,客户机通过网络向服务器发出请求,请求某种服务;
(5)服务器接收到客户机请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回;
(6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求;


Linux系统中的很多服务器是在系统初启时启动的,如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器进程处于
睡眠状态,等待客户机的请求。下面这两个客户机-服务器程序比较简单,主要是对网络客户机-服务器模型的实际运行有大致印象。这个客户机-服务器的操作过
程非常简单:客户机与服务器建立连接之后,服务器向客户机返回一条消息。服务器程序的源代码如下:

/* tcpserver.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>


#define WAITBUF 10


int main(int argc, char *argv[])
{
    int sockfd, new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    unsigned int sin_size, portnumber;
    char hello[]="Hello! Socket communication world!\n";


    if(argc != 2)
    {
        fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
        exit(1);
    }


    if((portnumber = atoi(argv[1])) < 0)
    {
        fprintf(stderr, "Usage: %s portnumber error\a\n", argv[0]);
    }


    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
        exit(1);
    }


    bzero(&server_addr, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;


    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = portnumber;


    if(bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
        fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
        exit(1);
    }


    if(listen(sockfd, WAITBUF) == -1)
    {
        fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
        exit(1);
    }


    while(1)
    {
        sin_size = sizeof(struct sockaddr_in);
        if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
        {
            fprintf( stderr, "Accept error:%s\n\a", strerror(errno));
            exit(1);
        }
        fprintf(stderr, "Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
        if(send(new_fd, hello, strlen(hello), 0) == -1)
        {
            fprintf(stderr, "Write Error:%s\n", strerror(errno));
            exit(1);
        }


        close(new_fd);
    }
    close(sockfd);
    exit(0);
}


给服务器程序写一个Makefile文件,如下:

# start
CC = arm-elf-gcc
CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS = -Wl,-elf2flt
LIBS =
OBJS = tcpserver.o
all:    tcpserver
tcpser:  $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o tcpserver $(OBJS) $(LIBS)
clean:
    rm -rf *.o *.elf *.gdb hello
# end


客户机程序的源代码如下:

/* tcpclient.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>


#define RECVBUFSIZE 1024


int main(int argc, char *argv[])
{
    int sockfd;
    char buffer[RECVBUFSIZE];
    struct sockaddr_in server_addr;
    int portnumber, nbytes;
   
    if(argc != 3)
    {
        fprintf(stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
        exit(1);
    }


    if((portnumber=atoi(argv[2])) < 0)
    {
        fprintf(stderr,"Usage:%s hostname portnumber\a\n", argv[0]);
        exit(1);
    }
   
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
        exit(1);
    }
   
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = portnumber;
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);
   
    if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
        fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
        exit(1);
    }
   
    if((nbytes = recv(sockfd, buffer, RECVBUFSIZE, 0)) == -1)
    {
        fprintf(stderr, "Read Error:%s\n", strerror(errno));
        exit(1);
    }
    buffer[nbytes]='\0';
    printf("I have received:%s\n", buffer );
    close(sockfd);
    exit(0);
}


最后,skyeye-binary-testutils-1.1.0.tar.bz2/at91x40/uclinux1包里提取
boot.rom,用步骤6中的方法,把tcpserver程序放在boot.rom的bin目录中,在目标板上运行tcpserver
2000,在主机上运行./tcpclient 10.0.0.2 2000,看看结果!


程序的源码的注释因篇幅不在这给出,大家可以参考一些Linux网络编程的书籍,我也会在我的主页上更新一些资料,有需要的朋友可以去下载


8、编译并运行uClinux-dist-20030909.tar.gz
ftp://166.111.68.183/pub/embed/uclinux/soft/
或到ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist下载
uClinux-dist-20030909.tar.gz


假设把它下载到/usr/src/目录下,然后依次执行下面的命令:


tar zxvf uClinux-dist-20030909.tar.gz
cd uClinux-dist/


在图形方式下可用命令make xconfig

在命令行方式下用命令make menuconfig


vendor/product中选择GDB/ARMulator
kernel版本选择2.4
然后save and exit


运行下面这两条命:
make dep
make


此时在/usr/src/uClinux-dist/linux-2.4.x目录下会生成可执行文件linux
在/usr/src/uClinux-dist/images/会生成romfs.img等文件


在uClinux-dist目录下建立仿真AT91的skyeye配置文件skyeye.conf,内容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map="M", type="RW", addr="0x00000000", size="0x00004000"
mem_bank: map="M", type="RW", addr="0x01000000", size="0x00400000"
mem_bank: map="M", type="R", addr="0x01400000", size="0x00400000", file="images/romfs".img
mem_bank: map="M", type="RW", addr="0x02000000", size="0x00400000"
mem_bank: map="M", type="RW", addr="0x02400000", size="0x00008000"
mem_bank: map="M", type="RW", addr="0x04000000", size="0x00400000"
mem_bank: map="I", type="RW", addr="0xf0000000", size="0x10000000"



这个时候就可以用skyeye来调试运行kernel了,在/usr/src/uClinux-dist执行如下命令:


skyeye linux-2.4.x/linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....


注意:
要在skyeye.conf所在目录下执行skyeye linux-2.4.x/linux


9、加入网络功能
a.用root用户进行操作。
b.你要看你的/lib/modules/'uname -r'/kernel/drivers/net/目录里有没有tun.o
如果没有的话你就需要编译你的linux内核来获得tun.o了。
c.(1)运行tun设备模块:


#insmod /lib/modules/'uname -r'/kernel/drivers/net/tun.o


如果你没有该设备,那你就要用下面的命令来创建它:


#mkdir /dev/net
#mknod /dev/net/tun c 10 200


(2)运行vnet(虚拟集线器)设备模块(这一步不是必需的):
获取vnet的源码,然后创建设备:


#mknod /dev/net/vnet c 10 201
#chmod 666 /dev/net/vnet


创建vnet.o
#make vnet.o


插入模块vnet.o
#insmod vnet.o


进入test目录,用test来测度vnet.o
#cd test
#make
#./testvnet1


d.配置skyeye.conf文件


cpu: arm7tdmi
mach: at91
mem_bank: map="M", type="RW", addr="0x00000000", size="0x00004000"
mem_bank: map="M", type="RW", addr="0x01000000", size="0x00400000"
mem_bank: map="M", type="R", addr="0x01400000", size="0x00400000", file="images/romfs".img
mem_bank: map="M", type="RW", addr="0x02000000", size="0x00400000"
mem_bank: map="M", type="RW", addr="0x02400000", size="0x00008000"
mem_bank: map="M", type="RW", addr="0x04000000", size="0x00400000"
mem_bank: map="I", type="RW", addr="0xf0000000", size="0x10000000"
# format: state="on/off" mac="xx:xx:xx:xx:xx:xx" ethmod="tuntap/vnet" hostip="dd".dd.dd.dd
net: state="on", mac="0:4:3:2:1:f", ethmod="tun", hostip="10".0.0.1


下面将对上面的一些参数作下说明:
state=on/off意思是仿真的NIC(网络接口板)是有线的还是无线的;
mac=仿真适配器的MAC地址;
ethmod=tuntap/vnet在主机环境里使用的虚拟设备;
hostip=意思是主机环境与keyeye交互用的IP
格式: state="on/off" mac="xx:xx:xx:xx:xx:xx" ethmod="tuntap/vnet" hostip="dd".dd.dd.dd


For example:
#set nic info state="on/off" mac="xx:xx:xx:xx:xx:xx" ethmod="tuntap/vnet" hostip="dd".dd.dd.dd
net: state="on", mac="0:4:3:2:1:f", ethmod="tun", hostip="10".0.0.1

net: state="on", mac="0:4:3:2:1:f", ethmod="vnet", hostip="10".0.0.1


注意:
如果你想在同一时刻运行两个或更多的skyeye,那么请为每一个skyeye使用不同的skyeye.conf


e.运行skyeye linux-2.4.x/linux


10、安装完成SkyEye后,下一步将做什么?


  1. 对于嵌入式操作系统的初学者和入门者和入门的学生而言,他们可以先看一些有关操作系统和嵌入式操作系统方面的教材和书籍,如与uC/OS、
    Minix、uClinux、Linux相关的书籍等。然后可以在Skyeye上开发一些简单的应用程序例子(如进程间通信、进程优先级、死锁情况、网络
    应用等),对某些操作系统功能(如进程调度、内存管理、网络子系统、文件子系统等)进行简单的修改和扩展,并通过Skyeye进行运行和调试,看看会发生
    什么情况。
  2. 对于有一定经验的软件工程师而言,在SkyEye上完成一定的应用系统原型开发是值得一做的事情。比如移植或开发一个文件子系统或
    网络子系统到一个特定的操作系统中,相信比在一个真实的开发板上开发要容易一些。在Skyeye上进行一些操作系统的移植和开发(如移植RTLinux、
    RTAI等其它操作系统到Skyeye上)也是很有挑战性的工作。
  3. 对于硬件工程师而言,对Skyeye进行扩充,设计新的硬件仿真(如USB、IDE硬盘等)使得Skyeye的硬件仿真功能更加强大,支持更多功能的软件,是很有意义的事情。

参考:
SkyEye项目站点里的一篇中文文档;
陈渝《SkyEye Project FAQ》;
skyeye-0.7.0中的README文档。


后记:
为了让大家能快速上手,进行实际的开发工作,我赶凑了一篇文档,很粗糙。但我坚信随着更多的有经验的人的加入;随着我们自己水平的提
高,一定会出现更多、更好的文章来。就让我们快点行动起来吧!最后,我再次建议大家看一下《嵌入式Linux技术与应用》这本书。网络部分没有完全解决,
现在只是主机与skyeye间的网卡行了,而uClinux内的网卡没成,我觉得是不是要重新编译uClinux的内核,请大家指教。


这个文档不算完整,但还是贴上来了,大家一起讨论吧。我觉得SkyEye仿真环境很好,这个贴子就算是个引子吧,大家可以先从这个地方入手。


摘自http://www.dzkf.cn/html/qianrushixitong/2007/0710/2359.html






系统分类:


嵌入式


用户分类:

LINUX

标签:

skyeye

来源:

转贴



发表评论
阅读全文(374) | 回复(0)









0




关于投票





在VMware workstation5.5.2中安装UBUNTU 7.10




安装VM,在创建虚拟机的位置时,选择E盘导致程序无响应,不知是否是BUG,直接键入路径可以通过。配置虚拟机可使用的内存为256M,默认的176M运行速度稍慢。


塞入UBUNTU
7.10光盘,我在XP下使用daemon虚拟的7.10的镜像文件。开启虚拟机,从光盘引导,进入桌面后运行install即可开始安装。安装至95%
左右时,安装程序尝试进行网络连接,且进度条一直不动,此时在VM中把网卡禁掉可以继续往下走(可能是安装程序在从国外的源检查更新,本人在教育网)。


安装完成后首先更改source.list,将自己连接速度较快的源加入list。运行sudo apt-get upgrade
更新源列表。(把速度快的源放在list中靠前的位置,为了保证完整性可以把官方源加上,我在更新时最后有一个服务器连接不上被我ctrl-c结束掉
了)。运行sudo apt-get dist-upgrade更新已安装的程序。


两条比较实用的命令:sudo apt-get install nautilus-open-terminal将终端添加到右键菜单;sudo apt-get install nautilus-gksu以管理员身份打开文件夹。


安装中文支持和输入法。


安装GCC/MAKE等编译工具:sudo apt-get install
build-essential。(未执行该步骤而先试图安装VM-TOOLS,结果在安装时提示没有适合该内核的版本,需重新编译,编译中vmhgfs
和vmxnet对编译失败,此时查看网络连接发现找不到网卡。通过usr/bin/vmware-unintall-tool卸载后重启,可以找到网络。
执行安装编译工具命令后,仍无法编译上述两个模块,且网卡仍找不到,重启后可以找到,不知会对以后的操作有怎样影响)







系统分类:


自由话题


用户分类:



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /4 下一条