久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Fedora SkyEye如何安裝交叉編譯器

185次閱讀
沒有評論

共計 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字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 子洲县| 米林县| 鸡泽县| 建阳市| 临澧县| 承德县| 内丘县| 大港区| 威信县| 道孚县| 绥滨县| 中阳县| 华坪县| 富蕴县| 樟树市| 乌什县| 连江县| 阿合奇县| 缙云县| 万宁市| 屯门区| 唐河县| 陇川县| 威宁| 吉木乃县| 丁青县| 临湘市| 德阳市| 会东县| 凤凰县| 乌海市| 台南县| 恩施市| 牡丹江市| 兴和县| 景泰县| 本溪市| 岳阳县| 四子王旗| 南漳县| 阿拉善盟|