Fedora SkyEye如何安装交叉编译器

40次阅读
没有评论

共计 9750 个字符,预计需要花费 25 分钟才能阅读完成。

这篇文章给大家分享的是有关 Fedora SkyEye 如何安装交叉编译器的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。

Fedora SkyEye 是一个可以运行嵌入式操作系统的硬件仿真工具,这样就可以在没有硬件条件下来进行嵌入式系统的开发。以下操作均在 Fedora Core 1.0 里通过。Fedora SkyEye 项目资源列表 http://gro.clinux.org/projects/skyeye/

1、什么是 Fedora SkyEye?

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

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

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

3、安装 Fedora 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

接下来执行:makemake install 安装完成后执行 skyeye 注意:a. 如果你使用的是 Mandrake Linux 发行版, 那么你在编译 Fedora 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.shhttp://www.cnblogs.com/leivo/admin/ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm 或 http://www.cnblogs.com/leivo/admin/ftp://166.111.8.229/OS/Embeded

执行:chmod a+x arm-elf-tools-20030314.sh 然后:./arm-elf-tools-20030314.shls /usr/local/bin/ 你应能看到以 arm-elf 开头的可执行文件,其中 arm-elf-gcc 就是用来编译你目标平台的编译器的,当然还有一些小工具,后面将一一讲来。

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

PHP 代码:#i nclude int main(void)
{int i;
for(i = 0; i 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 文件,仅供参考:PHP 代码:# 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/xxxcp -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 系统中的很多服务器是在系统初启时启动的,如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器进程处于睡眠状态,等待客户机的请求。下面这两个客户机 - 服务器程序比较简单,主要是对网络客户机 - 服务器模型的实际运行有大致印象。这个客户机 - 服务器的操作过程非常简单:客户机与服务器建立连接之后,服务器向客户机返回一条消息。服务器程序的源代码如下:

PHP 代码:
/* tcpserver.c */
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude

#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 文件,如下:

PHP 代码:
# 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

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

PHP 代码:
/* tcpclient.c */
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude
#i nclude

#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);
}

最后,Fedora 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

到 http://www.cnblogs.com/leivo/admin/ftp://166.111.68.183/pub/embed/uclinux/soft/
或到 http://www.cnblogs.com/leivo/admin/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…..

注意:
要在 Fedora 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. 配置 Fedora 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. 运行 Fedora SkyEye linux-2.4.x/linux

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

1、对于嵌入式操作系统的初学者和入门者和入门的学生而言,他们可以先看一些有关操作系统和嵌入式操作系统方面的教材和书籍,如与 uC/OS、Minix、uClinux、Linux 相关的书籍等。然后可以在 Fedora SkyEye 上开发一些简单的应用程序例子 (如进程间通信、进程优先级、死锁情况、网络应用等),对某些操作系统功能(如进程调度、内存管理、网络子系统、文件子系统等) 进行简单的修改和扩展,并通过 Fedora SkyEye 进行运行和调试,看看会发生什么情况。

2、对于有一定经验的软件工程师而言,在 Fedora SkyEye 上完成一定的应用系统原型开发是值得一做的事情。比如移植或开发一个文件子系统或网络子系统到一个特定的操作系统中,相信比在一个真实的开发板上开发要容易一些。在 Fedora SkyEye 上进行一些操作系统的移植和开发 (如移植 RTLinux、RTAI 等其它操作系统到 Skyeye 上) 也是很有挑战性的工作。

3、对于硬件工程师而言,对 Fedora SkyEye 进行扩充,设计新的硬件仿真 (如 USB、IDE 硬盘等) 使得 Skyeye 的硬件仿真功能更加强大,支持更多功能的软件,是很有意义的事情。

感谢各位的阅读!关于“Fedora SkyEye 如何安装交叉编译器”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计9750字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)