2013-11-14
最近在看《一步一步写嵌入式操作系统》,感觉此书甚好,许多地方讲得很清楚、可操作性强,计划边读边实践边写笔记,希望能够逐步熟悉嵌入式操作系统底层的东西,最终剪裁出一套实用的实时嵌入式操作系统,备选的裁剪对象有ucos、RTlinux和uClinux。
SkyEye介绍
“SkyEye是一个指令级模拟器,可以模拟多种嵌入式开发板,可支持多种CPU指令集,在SkyEye上运行的操作系统意识不到它是在一个虚拟的环境中运行,而且开发人员可以通过SkyEye调试操作系统和系统软件。由于SkyEye的目标不是验证硬件逻辑,而是协助开发、调试和学习系统软件,所以在实现上SkyEye与真实的硬件环境相比还是有一定差别的。SkyEye在时钟节拍的时序上不保证与硬件完全相同,对软件透明的一些硬件仿真进行了一定的简化。这样带来的好处是SkyEye的执行效率更高。”详细介绍见[这里](http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/)
SkyEye安装
在Linux下可直接安装,在Windows下要先安装Cygwin。都可以Google到很多资料。
两种方法:
1.sudo apt-get install skyeye,版本是1.2.5
2.自己编译安装。
我的系统是Ubuntu12.10,64位,折腾了好久,从0.9到最新的版本都试过,都没编译安装成功过。
原因有以下几点:
1.GCC等对版本有要求
2.64位的Ubuntu需要兼容32位的包
3.针对不同的Ubuntu版本,一些宏定义和函数需要相应修改。
无奈的我最后只能暂时用从软件源里安装的1.2.5版本。暂时没发现大的问题,不足的地方在于对书中用到的ARM920T支持不好,貌似是地址映射不对,串口打印出来的信息无法在终端上显示。所以我现在用的ARM7TDMI架构的S3C44B0X,对于书里提到的例子,代码里内存地址什么的需要根据芯片手册相应修改。
关于安装,可以Google到大量资料和常见问题的解决方法,不再赘述。
HelloWorld
参考[Skyeye下的Hello world测试](http://www.mculover.com/post/103.html)
1.新建一个helloworld.c文件:[root@localhost root]#vi helloworld.c
2.输入代码: #define UTXH0 ((volatile unsigned int *)(0x01d00020))
//S3C44B0X的串口0发送寄存器地址是UTXH0
void helloworld(void){
const char *p="HelloWorld!
";
while(*p){
*UTXH0=*p++;
}
while(1);
}
3.交叉编译。使用书上推荐的arm-elf-gcc交叉编译器。
4.将源码编译生成.o目标文件:[root@localhost root]#arm-elf-gcc -O -c helloworld.c,新生成helloworld.o文件会出现在当前目录下。
5.将目标文件链接生成可执行文件,这里生成带有很多信息的elf格式:[root@localhost root]#arm-elf-ld -e helloworld -Ttext 0x00000000 helloworld.o -o helloworld,新生成的helloworld文件会出现在当前目录下
6.将elf文件编译为.bin文件:[root@localhost root]#arm-elf-objcopy -O binary helloworld helloworld.bin,新生成的helloworld.bin文件会出现在当前目录下
7.在当前目录下新建一个skyeye.conf文件:[root@localhost root]#vi skyeye.conf
输入:
cpu:arm7tdmi
mach:s3c44b0
#2M Flash ROM
mem_bank:map=M,type=RW,addr=0x00000000,size=0x00200000,file=./helloworld.bin#IO Addr
mem_bank:map=I,type=RW,addr=0x01c00000,size=0x00400000
8.运行。在终端中输入skyeye