Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购)。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。
SkyEye是一个开源软件(opensource software)项目,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式计算机系统(目前支持基于ARM7tdmi的AT91开发板);可在SkyEye上运行uclinux以及uC/OS-II等多种嵌入式操作系统,并对它们进行源码级的分析和测试。
使用cygwin和skyeye在win10 上搭建arm仿真开发环境,模拟s3c2410x。
两个软件的下载链接已在开头给出,提取码:uheu。
依次选择:
install from internal --> All Users --> Direct Connection --> User URL选择 mirrors.168.cn --> 下一步 --> 选择要安装的软件包
–> 找到devel,安装make和gcc4两组软件包,具体下载过程参考该链接。
下载不完全,在cygwin环境运行make时可能会报错segmentation fault!
skyeye.exe已经在网盘链接中给出,直接将该软件放置到/usr/bin目录下。如果采取源码编译生成skyeye的方法,我试了几次,总是会在./configure这一步报错
在/home/yourname 目录下创建一个test文件夹
先创建skyeye的配置文件skyeye.conf:
cpu:arm920t
mach : s3c2410x
mem_bank: map = M, type = RW, addr = 0x00000000, size =0x00800000, file=./helloworld.bin
#all peripherals I/O mapping area
mem_bank: map = I, type = RW, addr = 0x48000000, size =0x20000000
该配置文件的解读:
cpu: 指定CPU的芯片系列
mach: 指定芯片的具体信号
mem_bank:指定芯片内存空间特性
type: 指定内存空间的读写属性
file: 指定预先要被加载到这段内存空间的映像文件
boot=yes:指定默认从此处启动
mem_bank必须写成独立的一行
测试程序会指定程序运行地址在RAM的0x0处,因此第一个bank给程序使用
测试程序会访问串口的FIFO寄存器,该寄存器是外设端口,因此第二个bank的map设为I,地址要保证0x50000020这个位置是作为外设寄存器被映射出来的。
串口向终端输出hello world 测试配置环境是否正常
创建helloworld.c
#define UFCON0 ((volatile unsigned int *)(0x50000020))
void helloworld(void){
const char *p="helloworld\n";
while(*p){
*UFCON0=*p++;
};
while(1);
}
编译 链接
arm-elf-gcc -O2 -c helloworld.c
arm-elf-ld -e helloworld -Ttext 0x0 helloworld.o -o helloworld
arm-elf-objcopy -O binary helloworld helloworld.bin
ld的-Ttext就是前面说的指定运行地址在内存0地址
objcopy将ELF格式文件中的二进制机器码抽离出来,生成纯二进制文件helloworld.bin,纯粹的可执行机器码镜像。
必须使用该命令运行:
/cygdrive/c/cygwin64/usr/bin/skyeye.exe
skyeye去读取skyeye.conf模拟出硬件环境,终端中显示:
skyeye默认地将串口映射到命令行中,方便虚拟硬件的模拟。
……
Your elf file is little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x806ad40
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM ./helloworld.bin
helloworld