zoukankan      html  css  js  c++  java
  • SkyEye的使用

    转载:http://blog.csdn.net/htttw/article/details/7226754

    对于希望学习ARM汇编的同学而言, 购买ARM开发板进行板上实测无疑是一个有效的方法,不过购买ARM开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦。这里介绍一个ARM模拟器——SkyEye,通过SkyEye我们可以直接在一台PC上完成ARM汇编程序的开发和调试了,摆脱了ARM开发板的限制,真是不错!



    下面介绍如何使用:


    1.
    http://sourceforge.net/projects/skyeye下载SkyEye的最新版,我的是skyeye-1.3.4_rc1.tar.gz,同时为了后面的实验,我们还要下载testsuite,这是skyeye的测试文件,我的版本是skyeye-testsuite-1.3.4,里面有ArmLinux



    2.
    tar zxvf skyeye-1.3.4_rc1.tar.gz
    cd skyeye

    根据INSTALL文件里说的:
    ./configure
    make lib
    make
    sudo make install

    sudo make install_lib

     

    注意,在make时可能会缺各种文件,apt-get install就可以了,我所遇到的两个问题是:

    python-dev和llvm没有安装,很简单:

    sudo apt-get install python-dev

    sudo apt-get install llvm

    (这是llvm的官方下载网址:http://llvm.org/releases/download.html)

    就可以了

     

    这样SkyEye就算安装好了



    3.

    默认SkyEye是安装在/opt/下的,因此为了方便,我们在环境变量里把它的路径加入:
    vi ~/.bashrc
    输入:
    #SkyEye 1.3.4
    export PATH=/opt/skyeye/bin:$PATH

    之后注销再登录或直接source .bashrc就可以使环境变量生效了



    4.
    SkyEye安装好后会在/opt/skyeye/testsuite下有一个arm_hello的测试程序,按如下方式运行:
    cd /opt/skyeye/testsuite/arm_hello
    skyeye -e arm_hello

    #注意:skyeye要运行一个程序时必须要在这个程序的目录里,因为skyeye要读取这个程序的skyeye.conf配置文件,所以第一步我们要切换到/opt/skyeye/testsuite/arm_hello目录下
    这时我们会进入skyeye命令模式,输入start让arm_hello程序开始运行,会弹出一个connecting to Ubuntu:xxx的字样的窗口




    5.
    skyeye命令行输入:run开始运行,这时窗口会不停的输出“helloworld”,说明arm_hello已经成功运行了!






    6.
    skyeye命令行输入:stop停止运行;输入:quit退出skyeye;输入:help查看帮助






    下面介绍如何在SkyEye上启动Linux,就和在真实的ARM开发板上一样:
    1.
    解压testsuite测试文件:
    tar zxvf skyeye-testsuite-1.3.4_rc1.tar.gz

    其中的linux目录就是我们要移植到板子上的amrlinux,依次进入:s3c2410-->s3c2410x-2.6.36,有三个文件,vmlinux是Linux内核镜像,skyeye.conf是配置文件,initrd.img是临时根文件系统。我们在/opt/skyeye/testsuite下新建一个目录,然后copy过来:

    sudo mkdir /opt/skyeye/testsuite/armlinux

    cd linux/s3c2410/s3c2410x-2.6.36

    sudo copy * /opt/skyeye/testsuite/armlinux



    2.

    cd /opt/skyeye/testsuite/armlinux

    skyeye -e vmlinux

    进入skyeye命令模式;

    输入start打开串口窗口:

    我在执行这一步时出错:failed to setup_module (name:net, type:cs8900a),我把skyeye.conf里的net那一行注释掉了,就行了

    如果窗口没有打开,则修改:uart:mod=stdio为uart:mod=term,然后再试试

     

     

    3.

    skyeye命令行:run启动Linux,

    屏幕随即会输出串口信息,不过速度很慢!

     

     

    附几张图:


     

     


     


     


    SkyEye的使用(一)中我们简单介绍了如何使用SkyEye,并且成功运行了既有的arm_hello程序,不过这个是针对arm7的,现在我们要用SkyEye模拟s3c2410(arm920T)。

     

    1.

    首先在/opt/skyeye/testsuite下建立myhello目录:

    mkdir /opt/skyeye/testsuite/myhello

     

    2.

    cd /opt/skyeye/testsuite/myhello

    vi myhello.c

    输入:

    [cpp] view plaincopy
     
    1. <span style="font-size:18px;">#define INTERVAL 100000  
    2.   
    3. void myhello(void)  
    4. {     
    5.   long * addr = (long *)0x50000020;  
    6.   int timeout = 0;  
    7.   
    8.   while(1)  
    9.   {  
    10.     timeout = 0;  
    11.     while(++timeout <= INTERVAL);  
    12.   
    13.     *addr = 'a';  
    14.   }  
    15. }</span>  

    地址0x50000020就是UART的通道0(UTXH0)的发送缓冲,把数据写入这个地址就会自动发送出去,当然在模拟器中,发送的目标地址就是我们的屏幕啦。

     

    3.

    myhello.c写好了之后,我们还要准备一段s3c2410的启动代码,这段代码在s3c2410一上电之后就开始执行,在这段启动代码中,回跳转到我们写的myhello.c函数:

    vi start.S

    输入:

    [cpp] view plaincopy
     
    1. <span style="font-size:18px;">.text  
    2.     .align 4  
    3.     .global _start  
    4.   
    5. _start:  
    6.     ldr sp, =1024*4  
    7.     bl  myhello  
    8.   
    9. halt:  
    10.     b halt</span>  

    上面这段很简单,就是声明了一个_start标记,这个标记在下面会用到,作为程序的入口地址。汇编和C链接的唯一必须的一步就是设置堆栈,这里我们把sp指向4k顶部,然后跳转到我们的c函数myhello

     

     

    4.

    现在我们要写一个连接脚本,连接顺序就是先start.S后myhello.c:

    vi myhello.lds

    输入:

    [cpp] view plaincopy
     
    1. <span style="font-size:18px;">OUTPUT_ARCH(arm)  
    2. ENTRY(_start)  
    3. SECTIONS  
    4. {  
    5.   . = 0x00000000;  
    6.   .text :   
    7.   {  
    8.     start.o  
    9.     myhello.o  
    10.     *(.rodata)  
    11.   }  
    12.   
    13.   . = ALIGN(8192);  
    14.   
    15.   .data : {*(.data)}  
    16.   
    17.   .bss : {*(.bss)}  
    18. }</span>  

    表示输出arm格式,第二句表示入口点是_start标记,就是第三步的那个_start标记,然后在0x00000000处先插入start.o,然后插入myhello.o

     

     

    5.

    然后我们要写Makefile:

    vi Makefile

    输入:

    [cpp] view plaincopy
     
    1. <span style="font-size:18px;">CC=arm-linux-gcc  
    2. LD=arm-linux-ld  
    3. CFLAGS= -c -g -march=armv6 -mtune=arm920t   
    4. LDFLAGS= -N -p -X -Thello.lds  
    5.   
    6. myhello: start.o myhello.o  
    7.     $(LD) $(LDFLAGS)  start.o myhello.o -o myhello  
    8.     arm-linux-objdump -xS myhello > myhello.s  
    9.     arm-linux-readelf -a myhello > myhello.r  
    10.     arm-linux-nm myhello > myhello.n  
    11.        
    12. start.o: start.S  
    13.     $(CC) $(CFLAGS) start.S    
    14.       
    15. myhello.o: myhello.c  
    16.     $(CC) $(CFLAGS) myhello.c  
    17.   
    18. clean:  
    19.     rm -rf *.o myhello *.r *.n *.s</span>  



    arm-linux-objdump -xS myhello > myhello.s
    arm-linux-readelf -a myhello > myhello.r
    arm-linux-nm myhello > myhello.n

     

    6.

    最后我们还需要一个skyeye配置文件:

    vi skyeye.conf

    输入:

    [cpp] view plaincopy
     
    1. <span style="font-size:18px;">#skyeye config file  
    2. arch:arm  
    3. cpu: arm920t  
    4. mach: s3c2410x  
    5.   
    6. # boot  
    7. mem_bank: map=M, type=RW, addr=0x00000000, size=0x04000000, boot=yes  
    8.   
    9. # physical memory  
    10. mem_bank: map=M, type=RW, addr=0x30000000, size=0x02000000  
    11.   
    12. # all peripherals I/O mapping area  
    13. mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000  
    14.   
    15. uart:mod=term  
    16. #log: logon=0, logfile=./sk1.log, start=0, end=200000</span>  



     

    7,

    编译:

    cd /opt/skyeye/testsuite/myhello

    make

     

    8.

    好了,所有的文件已经准备好了,下面我们来测试:

    cd /opt/skyeye/testsuite/myhello

    skyeye -e myhello

    在skyeye命令模式下输入:

    start

    run

    我们会发现连续输出了字符“a”


    对于希望学习ARM汇编的同学而言, 购买ARM开发板进行板上实测无疑是一个有效的方法,不过购买ARM开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦。如果有一个ARM的模拟器就好了,抱着这样的想法在网上找了一下,发现了Skyeye,还是我们中国人开发的。通过Skyeye,可以直接在一台PC上完成ARM汇编的开发调试工作了,摆脱了ARM开发板的限制,真是不错!

    不过,开始介绍Skyeye安装之前还是给各位同学一个建议,如果经费不是特别紧张,还是建议买一个开发板的。在开发板上运行一段程序给你带来的成功感会远远大于你模拟器给你带来的成功感。通过开发板可以激励你继续学习ARM汇编,而通过模拟器可以为你节省一些时间。

    Skyeye是一个开源项目,可以在网上下载然后编译,建议使用Linux环境进行编译安装,我使用的还是Ubuntu10.0.4,具体安装过程如下:

    1. 下载Skyeye源码包

    Skyeye最新发布的是1.3.3版本,下载地址如下:

    http://sourceforge.net/projects/skyeye/files/skyeye/skyeye-1.3.3_rc1/

    下载后是一个gz文件,名为skyeye-1.3.3_rel.tar.gz,总共才16M左右,很快可以下载完

    2. 上传Skyeye包到Ubuntu 上并解压

    使用你觉得最方便的方法将下载的skyeye-1.3.3_rel.tar.gz文件上传到Ubuntu上,并通过tar命令解压

    tar xzvf skyeye-1.3.3_rel.tar.gz

    解压后出现一个skyeye目录,就是Skyeye的源码包了。

    3. 编译安装Skyeye

    进入skyeye目录,依次执行如下命令:

    ./configure
    make lib

    make install_lib  (注释:此前漏掉了这句,漏掉这句后面会出错的,特此修正2012/03/10。)
    make

    make install

    在执行make命令的时候有可能出现缺少某些文件的错误,根据错误的信息更新一下Ubuntu就好了。

    比如,我执行make的时候报

    Fatal error: X11/xpm.h: No such file or directory

    Compilation terminated

    是说xpm.h文件找不到,通过一下命令更新Ubuntu后再次执行make就没有问题了。

    sudo apt-get install libxpm-dev

    4. 测试Skyeye

    安装了Skyeye后执行文件出现在/opt/skyeye/bin目录中,注意1.3.3的Skyeye可执行命令不是skyeye,而是skyeye_main.py,执行后进入Skyeye命令行状态表示安装成功。

    5. 运行测试代码

    为了快速开始代码测试工作,可以从Skyeye自带的arm_hello 入手。

    进入/opt/skyeye/testsuite/arm_hello目录,执行:

    /opt/skyeye/bin/skyeye_main.py -e arm_hello

    会进入Skyeye命令行状态,执行以下命令

    start

    会弹出一个窗口,里面显示“Connecting to Ubuntu:xxxx”。

    然后继续在Skyeye命令行界面执行以下命令:

    run

    可以发现弹出的窗口中开始出现“helloworld”字样。

    6. 阅读修改arm_hello

    测试成功后可以阅读一下arm_hello的代码,而且可以以arm_hello作为起点开发测试自己的代码。

    当然前提是你的toolchain已经设置好。

    需要关注的有三个文件Makefile , start.S hello.c

    Makefile中需要修改编译工具和链接工具  ,让make命令可以正常执行

    start.S是一段ARM汇编,不断调用hello.c中的hello方法

    hello.c是打印函数的实现,将“helloworld”字符串输出到指定地址中。

    开始吧,测试你自己的ARM汇编代码!!

  • 相关阅读:
    python pip install 报错(SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))')排查
    JMeter中验证参数空格时,要勾选编码
    共阴数码管静态显示
    蜂鸣器与继电器的基本控制
    Linux常用命令(粤嵌)
    LED指示灯的基本控制
    单片机设计与开发——概述
    交叉编译器的安装方法
    正则表达式校验金额最多两位小数的实数
    thinkphp自定义分类样式
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3528850.html
Copyright © 2011-2022 走看看