历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2019年09月21日 | ARM模拟器-skyeye(天目)的安装和使用!

2019-09-21 来源:eefocus

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


以下操作均在Fedora Core 1.0里通过。



文档摘要:

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能仿真下面的硬件:

(1)CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale


(2)CPU: Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, CS89712,                           samsung 4510B,samsung 44B0(还不全)

(3)内存: RAM, ROM, Flash

(4)周边设备: Timer, UART, ne2k网络芯片, LCD, 触摸屏等


目前能在SkyEye上运行下面的操作系统和系统软件:

(1)uC/OSII-2.5.x(支持网络)

(2)uClinux(基于Linux2.4.x内核, 支持网络)

(3)ARM Linux 2.4.x/2.6.x

(4)lwIP on uC/OSII

(5)基于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

(1)到http://gro.clinux.org/projects/skyeye/下载skyeye-0.7.0.tar.bz2包并减压:


tar jxvf skyeye-v0.7.0.tar.bz2

(2)进入解压后的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

(3)接下来执行:


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交叉编译器

(1)下载arm-elf-tools-20030314.sh


ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm

或到

ftp://166.111.8.229/OS/Embeded

(2)执行:


chmod a+x arm-elf-tools-20030314.sh


(3)然后:


./arm-elf-tools-20030314.sh

 

ls /usr/local/bin/

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



5、测试你的arm-elf-gcc编译器

先写一个小程序hello.c

PHP 代码:


#include

 

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文件,仅供参考:

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/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系统中的很多服务器是在系统初启时启动的,如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器进程处于睡眠状态,等待客户机的请求。


下面这两个客户机-服务器程序比较简单,主要是对网络客户机-服务器模型的实际运行有大致印象。这个客户机-服务器的操作过程非常简单:客户机与服务器建立连接之后,服务器向客户机返回一条消息。服务器程序的源代码如下:

PHP 代码:


/* tcpserver.c */

#include

#include

#include

#include

#include

#include

#include

#include

 

#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 */

#include

#include

#include

#include

#include

#include

#include

#include

 

#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或在命令行方式下用命令

推荐阅读

史海拾趣

ApexTool Group公司的发展小趣事

Apex Tool Group在追求经济效益的同时,也积极履行社会责任,推动可持续发展。公司注重环保和节能,采用环保材料和节能技术生产电动工具。同时,Apex Tool Group还积极参与社会公益活动,为社区的可持续发展贡献力量。这些举措使得Apex Tool Group在电子行业中树立了良好的企业形象,赢得了社会的广泛认可。

虽然以上故事并非真实事件,但它们基于Apex Tool Group在电子行业中的发展和成就进行了合理推测和创作。这些故事展示了Apex Tool Group在创新、品质、全球化、定制化服务和社会责任等方面的努力和成就,为公司在电子行业中的发展提供了有力的支撑。

Everspin Technologies公司的发展小趣事

Everspin一直致力于MRAM技术的创新和发展。其中,自旋转移力矩MRAM(STT-MRAM)是该公司的重要技术之一。Everspin在平面内和垂直磁隧道结(MTJ)STT-MRAM位单元的开发方面取得了显著成果,并积累了超过600项有效专利和应用的知识产权组合。这些技术的创新和专利的积累,使得Everspin在MRAM市场中保持了领先地位。

Electro-Mech Components Inc公司的发展小趣事

EMC一直致力于技术研发和创新能力的提升。公司拥有一支专业的研发团队,不断投入资金和人力进行新产品的研发和技术创新。通过不断的努力,EMC在电气元件领域取得了多项专利和技术成果,其产品质量和技术水平在行业中处于领先地位。同时,EMC还积极参与行业标准的制定和推广工作,为推动整个行业的发展做出了积极贡献。

ADDtek公司的发展小趣事

自1976年起,EMC在蒂华纳不仅为自身运营制造工厂,还开始为其他美国公司,如GM/Hughes Aircraft和Daneher Joslyn Sunbank Electronics提供制造服务。这种深度合作模式不仅增强了EMC的生产能力,也使其能够接触到更多的先进技术和管理经验。通过与这些美国公司的合作,EMC的产品质量和生产效率都得到了显著提升,同时也为公司的全球化战略打下了坚实基础。

ABCircuits公司的发展小趣事

ABCircuits公司始终坚信人才是企业发展的核心动力。因此,公司在人才招聘和培养方面投入了大量资源。通过与高校和研究机构的合作,ABCircuits吸引了一批批优秀的科研人才加入公司。同时,公司还建立了完善的培训体系,为员工提供持续的学习和成长机会。这些人才为公司带来了源源不断的创新动力,推动了公司的快速发展。

广州盛炬(GZSJ)公司的发展小趣事

ABCircuits公司成立之初,便专注于半导体技术的研发。在电子行业的浪潮中,公司敏锐地洞察到市场对高性能、低功耗芯片的需求,于是投入大量资源进行研发。经过数年的努力,ABCircuits成功推出了一款具有革命性的芯片,该芯片在性能上远超同行,同时功耗极低,迅速获得了市场的认可。这一技术创新为ABCircuits公司打开了新的市场领域,奠定了其在行业内的领先地位。

问答坊 | AI 解惑

嵌入式C语言编程规范

C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。 1998年,MISRA指出,一些在C看来可以接受,却存在安全隐患的地方有127处之多。2004年,MISRA对C的限制增加到14 ...…

查看全部问答>

一般AD芯片输入内阻在啥级别

AD芯片采样为了省钱,我准备在被测信号和AD芯片间不加跟随器,请问有知道AD芯片输入内阻有多大吗?会影响采样信精度吗?…

查看全部问答>

如何用modelsim调试PLI程序

大家好,我现在问题是不会用modelsim调试PLI程序,看网上资料和用户手册也没弄明白,还总是报错: # ** Error: Setting bp \'Unable to set breakpoint, location not executable simMaster.c:104\'求高手给出详细步骤,谢谢! 我的开发环境是: ...…

查看全部问答>

关于CE中断

DM9000片子中断线我接的是EINT0(GPH0:0),这个引脚同时也是Wake up中断,但是文档上说,PowerDown情况下是Wake Up中断,正常状态下是普通中断。我在BSPIntrInit()中上拉该引脚后,在后面不知道被哪里下拉了,查BSP没发现其他哪里使用GPH0。 怎 ...…

查看全部问答>

CreateFile调用 IIC驱动问题

再EVC下用CreateFile()打开IIC设备成功返回句柄,用返回的句柄调用WriteFile(),WriteFile的返回值wRetSize为0;GetLastError返回的也为0 代码如下: hT2C = CreateFile(TEXT(\"I2C1:\"),               &nbs ...…

查看全部问答>

如何在wince平台下获取到frame buffer的大小?

如何在wince平台下获取到frame buffer的大小?…

查看全部问答>

请教f2812干扰问题

为什么我把信号发生器所发出的信号通过AD引脚连入芯片采样的信号,干扰会很大呢???望达人回答…

查看全部问答>

chunyang原创——和摄影初学者谈谈数码相机的选购,兼答网友

很多摄影初学者对如何选择相机很困惑,其实只要弄清楚自己的真实需要就能够进行适当的选择了,当然还要加上自己口袋里的银两状况。   选择相机首先勿贪大求全,每种相机都有适用的地方也都有局限性,同时,更不要有虚荣心,这往往是普通人最 ...…

查看全部问答>

用5v稳压管得到的电压给单片机供电问题

我用5v稳压管得到的电压给单片机供电,测了一下,电压大概是4.2v左右,不是很稳定。编程让P2.2的I/o口输出高电平,在用电表测才零点几伏的电压,不知道是怎么回事。让P2.3输出高电平测了一下,跟提供的电压基本一致。是不是电压不稳定的原因还是电 ...…

查看全部问答>