本文编辑环境
- 本文在windows7(64位)上使用Google Chrome浏览器编辑,为保证截图效果,所有截图均使用PicPick截取,windows7使用Windows 7 Base主题,即关闭了Aero特效。
本文目的
- 本文目的在于帮助SylixOS爱好者获得SylixOS操作系统源代码、搭建开源的SylixOS集成开发环境、编译及调试SylixOS操作系统。
获得源代码
源代码的地址与组成
- SylixOS开发者们使用Git服务器管理源代码,Git服务器的地址为: http://git.sylixos.com/cgit/
- Git服务器上的源代码可以分为如下几类:
examples | 示例工程,包括应用程序工程、内核模块工程、库工程 |
examples-bsp | 示例BSP工程 |
libraries | 开源库工程 |
operating-system | SylixOS操作系统工程、SylixOS Base工程 |
tools-patch | 工具与补丁等 |
virtual-machine | 虚拟机 |
- 为了下载Git服务器上的源代码,你需要一个Git客户端,如果你的PC机操作系统是windows,建议使用Git for windows。
安装Git for windows
- 默认安装即可,安装步骤略。
下载源代码
- 创建一个名为sylixos_workspace的目录(下文约定该目录是D:\sylixos_workspace目录),打开Git Bash
- 输入如下命令进入该目录:
cd /d/sylixos_workspace
- 输入如下命令下载源代码:
git clone http://git.sylixos.com/repo/sylixos-base.git git clone http://git.sylixos.com/repo/bspmini2440.git git clone http://git.sylixos.com/repo/examples.git git clone http://git.sylixos.com/repo/tools.git git clone http://git.sylixos.com/repo/qemu-mini2440.git
- sylixos-base是SylixOS Base工程,里面包含了libsylixos和libcextern子工程,输入如下命令初始化和更新子工程:
cd sylixos-base git submodule init git submodule update
搭建开源集成开发环境
开源集成开发环境的组成
- SylixOS开源集成开发环境由以下组成:
- Eclipse
- Eclipse是著名的跨平台开源集成开发环境(IDE),最初主要用来开发Java语言程序,目前亦可以通过插件使其作为C++、Python、PHP等
其他语言程序的开发工具。
- Eclipse本身只是一个框架平台,但是有众多插件的支持,使得Eclipse拥有极佳的灵活性。许多软件开发商都以Eclipse为框架开发自己的IDE。
- 下图是Eclipse在windows7上运行的界面:
- CDT
- CDT是扩展Eclipse支持C/C++开发的插件。
- GNU Tools for ARM Embedded Processors
- GNU Tools for ARM Embedded Processors是一套GNU的开发ARM处理器程序的工具集。
- Zylin CDT
- Zylin CDT是扩展Eclipse支持嵌入式远程调试的插件。
- SylixOS开源集成开发环境的整体结构框图如下:
安装JRE
- Eclipse使用Java语言开发,运行Eclipse需要JRE(Java Runtime Environment,Java运行环境),所以需要安装JRE。
- 根据你的主机操作系统类型,下载对应的安装包,安装过程略。
安装Eclispe CDT
- 根据你的主机操作系统类型,下载对应的压缩包:
- 由于笔者的主机操作系统是64位的windows7,所以笔者下载的压缩包是eclipse-cpp-luna-SR2-win32-x86_64.zip。
- 下载后把它解压到D:\SylixIDE目录:
- 解压完成后,进入D:\SylixIDE\eclipse目录,将eclipse.exe发送到桌面快捷方式以方便后续使用:
安装GNU Tools for ARM
- 根据你的主机操作系统类型,下载对应的安装包。
- 由于笔者的主机操作系统是64位的windows7,所以笔者下载的安装包是gcc-arm-none-eabi-4_9-2015q1-20150306-win32.exe。
- 把它安装到D:\SylixIDE\arm-none-eabi-gcc目录。
- 注意要在完成界面那里勾选Add path to environment variable:
- 安装完成后建议注销和重新登录操作系统。
安装yagato tools
- 现在还缺少make等工具,需要安装yagato tools。
- 安装D:\sylixos_workspace\tools\yagarto-tools\yagarto-tools-20121018-setup.exe
到D:\SylixIDE\yagarto-tools-20121018目录,
- 注意要在选择组件界面那里勾选Add the make utils to the PATH variable:
- 安装完毕后需要确定系统首先找到的make是yagarto tools的make,方法如下:
- 在windows的控制台输入make -v命令,如果输出的make的版本是3.81,那说明安装成功了,如下图:
- 备注:如果你的系统有多个make,需要确保D:\SylixIDE\yagarto-tools-20121018\bin\make.exe在最前面,
- 如果不是,你可能需要调整你的系统的PATH环境变量。
替换reent.h文件
- 由于SylixOS修改了编译器的reent.h文件,所以使用编译器自带的reent.h文件将不能编译成功。
- 复制D:\sylixos_workspace\tools\arm-none-eabi-patch\4.9\reent.h文件到
D:\SylixIDE\arm-none-eabi-gcc\arm-none-eabi\include\sys目录替换原有的文件。
安装Zylin CDT
- 复制D:\sylixos_workspace\tools\eclipse\zylin目录下的features与plugins两个子文件夹
到D:\SylixIDE\eclipse目录,提示文件夹合并时,请点击“是”按钮。
编译工程
切换SylixOS工作空间
- 打开Eclipse,在Eclipse中,点击File->Switch WorkSpace->Other…菜单,在弹出的对话框的Workspace中选择D:\sylixos_workspace目录,
然后点击OK按钮,Eclipse会切换工作空间到D:\sylixos_workspace目录,如下:
导入SylixOS工程
- Eclipse切换工作空间后,会显示欢迎界面,请关掉欢迎界面,将显示如下的界面:
- 左侧的工程浏览器空空如也,并没有显示我们期待的sylixos-base等工程,在Eclipse中,点击File->Import菜单,
在弹出的对话框中选择General下的Existing Projects into Workspace,如下:
- 点击Next按钮,在弹出的对话框的Select root directory那里选择D:\sylixos_workspace目录,
并且勾选bspmini2440和examples及sylixos-base工程,如下:
- 最后,点击Finish按钮完成工程导入。
- 现在,左侧的工程浏览器应该会显示bspmini2440和examples及sylixos-base工程:
导入风格文件
- SylixOS源码众多,但风格统一,这主要归功于开发者们使用统一的代码风格来书写SylixOS系统,
sylixos_preference.epf是我们配制的Eclipse代码样式文件,导入它来书写代码,我们就可以轻松地书写出符合SylixOS规范的代码,
这将有助于你未来向SylixOS组织提交代码,所以我们强烈建议你也导入该代码样式文件。
- 在Eclipse中,点击File->Import...菜单,在弹出的对话框中选中General下的Perferences:
- 然后点击Next按钮,在From Perferences File那里选择D:/sylixos_workspace/tools/eclipse/sylixos_preference.epf文件,
并且选中Import All,最后点击Finish按钮:
编译SylixOS Base工程
- sylixos-base工程包含了SylixOS操作系统libsylixos和SylixOS进程C库libextern子工程。
- 打开sylixos-base下的config.mk,修改为如下:
- 在左侧的工程浏览器中选择sylixos-base工程,然后点击Project->Build Project菜单
编译sylixos-base工程,编译耗费的时间视你的机器的性能而定,一般需要10分钟。
- 最后libsylixos子工程生成静态库文件libsylixos.a和libdsohandle.a及libvpmpdm.a、动态库文件libvpmpdm.so、内核模块xinput.ko
和xsiipc.ko、符号表文件symbol.c和symbol.h(位于D:\sylixos_workspace\sylixos-base\libsylixos\Debug目录)。
- 最后libextern子工程生成静态库文件libcextern.a和动态库文件libcextern.so(位于D:\sylixos_workspace\sylixos-base\libcextern\Debug目录)。
编译bspmini2440工程
- bspmini2440工程是移植SylixOS操作系统到mini2440开发板的BSP工程。
- 打开bspmini2440下的config.mk,修改为如下:
- 在左侧的工程浏览器中选择bspmini2440工程,然后点击Project->Build Project菜单编译bspmini2440工程,
最后生成ELF文件bspmini2440.elf和二进制文件bspmini2440.bin(位于D:\sylixos_workspace\bspmini2440\Debug目录)。
编译examples工程
- examples工程是示例工程,包括应用程序工程、内核模块工程、库工程。
- 打开examples下的config.mk,修改为如下:
- 在左侧的工程浏览器中选择examples工程,然后点击Project->Build Project菜单编译examples工程。
- examples工程包含了三个子工程:应用程序示例工程hello_world、内核模块示例工程hello_module、库示例工程hello_library。
-
- 应用程序示例工程hello_world会生成应用程序可执行文件hello_world(位于D:\sylixos_workspace\examples\hello_world\Debug目录)。
-
- 内核模块示例工程hello_module会生成内核模块文件hello_module(位于D:\sylixos_workspace\examples\hello_module\Debug目录)。
-
- 库示例工程hello_library会生成静态库文件libhello_library.a和动态库文件libhello_library.so
(位于D:\sylixos_workspace\examples\hello_library\Debug目录)。
运行SylixOS
运行SylixOS操作系统
- 上面我们已经编译出mini2440开发板运行SylixOS操作系统的镜像,为了让没有mini2440开发板的朋友也能尝鲜,我们提供了
Qemu for mini2440虚拟机。
- 该虚拟机位于D:\sylixos_workspace\qemu-mini2440目录,首次使用该虚拟机,需要如下进行如下两个步骤的操作:
-
1. 生成Nand Flash镜像文件
- 执行nandCreator.exe,执行完成后,会在当前目录生成一个名为nand.bin的Nand Flash镜像文件。
-
2. 增加虚拟网卡
- 执行addtap.bat批处理文件,以增加虚拟网卡(可以执行deltapall.bat批处理文件将所有的虚拟网卡删除,
- 如果你有其它虚拟网卡,请不要执行它!)。
-
- 将新增的虚拟网卡的名字重命名为virtual(由上图可以看到新增的虚拟网卡是TAP-win32 Adapter V9),
- 将它的IP设为192.168.7.XX(必须要和SylixOS目标板的IP同一个网段),将子网掩码设为255.255.255.0。
- mini2440_run.bat的内容如下:
start qemu-system-arm.exe -M mini2440 -show-cursor -kernel ../bspmini2440/Debug/bspmini2440.bin -serial telnet:127.0.0.1:1200,server -mtdblock nand.bin -serial file:virtualkbd -net nic -net tap,ifname=virtual,vlan=1 start putty.exe telnet://127.0.0.1:1200/
- 可以看到它首先启动了Qemu虚拟机的可执行程序qemu-system-arm.exe,通过参数指定了module为mini2440开发板,
指定了kernel镜像为../bspmini2440/Debug/bspmini2440.bin,指定了串口为telnet服务器:127.0.0.1:1200,
指定了网卡的接口名为virtual,指定了Nand Flash镜像文件为nand.bin。
- 之后启动了终端软件putty.exe,通过参数让putty连接telnet://127.0.0.1:1200/,即连接到mini2440开发板的串口。
- 执行mini2440_run.bat,稍等数秒SylixOS系统将启动起来并进入到控制台:
- 在控制台下输入命令:
ifconfig
- 可以查看或配置SylixOS目标板的网络接口,输入该命令,我们得知SylixOS目标板的en1网络接口的IP地址为192.168.7.30。
运行SylixOS应用程序
- SylixOS操作系统内建了一个FTP服务器,只要PC机安装FTP客户端就能连接上SylixOS目标板的FTP服务器,就可以很方便地通过
FTP客户端向目标板传输文件,如应用程序可执行文件等。
- 如果你的PC机操作系统是windows,建议安装filezilla FTP客户端,它的官网地址为 https://filezilla-project.org/
- 安装完成后,打开filezilla,务必将传输类型修改为二进制,点击“传输 -> 传输类型 -> 二进制”菜单:
- 然后新建一如下的FTP站点,IP地址为SylixOS目标板的IP地址(如上面的192.168.7.30),端口号为21,用户名和密码均为root:
- 建议重命名该FTP站点的名称为IP地址,即192.168.7.30,以方便区分。
- 点击“连接”按钮即可连接到SylixOS目标板的FTP服务器:
- 将本地磁盘路径切换到 D:\sylixos_workspace\examples\hello_world\Debug\ 目录,
可以看到该目录有我们之前编译应用程序示例工程hello_world生成的应用程序可执行文件hello_world,
将其拖动到右侧的SylixOS目标板文件列表的/apps目录,即可将其传输到SylixOS目标板的/apps目录。
- 应用程序可执行文件hello_world运行时还依赖于进程补丁libvpmpdm.so(位于D:\sylixos_workspace\sylixos-base\libsylixos\Debug目录),
将libvpmpdm.so拖动到右侧的SylixOS目标板文件列表的/lib目录,即可将其传输到SylixOS目标板的/lib目录。
- 在控制台下输入命令 cd /apps 以进入 /apps 目录,再输入命令 ./hello_world 即可执行应用程序hello_world:
[root@sylixos_station:/]# cd /apps/ [root@sylixos_station:/apps]# ./hello_world hello world (base on sylixos)!
插入SylixOS内核模块
- 将本地磁盘路径切换到D:\sylixos_workspace\examples\hello_module\Debug\目录,
可以看到该目录有我们之前编译内核模块示例工程hello_module生成内核模块文件hello_module.ko,
将其拖动到右侧的SylixOS目标板文件列表的/lib/modules目录,即可将其传输到SylixOS目标板的/lib/modules目录。
- 在控制台下输入命令 cd /lib/modules 以进入 /lib/modules 目录,再输入命令 modulereg hello_module.ko 即可插入
内核模块文件hello_module.ko进内核:
[root@sylixos_station:/apps]# cd /lib/modules/ [root@sylixos_station:/lib/modules]# modulereg hello_module.ko hello_module init! module hello_module.ko register ok, handle : 0x30c5da78
- 在控制台下输入命令 modules 即可查看当前内核插入的内核模块:
[root@sylixos_station:/lib/modules]# modules NAME HANDLE TYPE GLB BASE SIZE SYMCNT ------------------------------ -------- ------ --- -------- -------- -------- VPROCESS: kernel pid: 0 TOTAL MEMORY: 8192 + hello_module.ko 30c5da78 KERNEL YES c00d1000 c4 2 total modules : 1
调试SylixOS
增加调试实例
- 关闭上面的Qemu虚拟机程序。
- 双击Zylin Embedded debug(Native),将增加一个名为bspmini2440 Default的实例:
修改调试配置
- 切换到Debugger选项卡,将GDB Debugger修改为
arm-none-eabi-gdb
- 将Stop on startup at修改为
reset
- 切换到Commands选项卡,将Initalize commands修改为如下的内容:
target remote localhost:1234 load
- 最后点击Apply按钮应用修改,点击Debug按钮开始调试。
开始调试
- mini2440_debug.bat的内容如下:
start qemu-system-arm.exe -s -S -M mini2440 -show-cursor -serial telnet:127.0.0.1:1200,server -mtdblock nand.bin -serial file:virtualkbd -net nic -net tap,ifname=virtual start putty.exe telnet://127.0.0.1:1200/
- mini2440_debug.bat和mini2440_run.bat的区别在于mini2440_debug.bat并没有指定kernel镜像文件(依靠上面的 load 命令下载 kernel),但增加 -s -S 选项。
- 执行mini2440_debug.bat批处理文件,如果出现如下的windows安全警报,请点击允许访问按钮。
- 稍等数秒,Eclipse将控制arm-none-eabi-gdb连接到Qemu虚拟机,并将SylixOS的相关节区section加载到mini2440开发板内存的相应位置:
target remote localhost:1234 Remote debugging using localhost:1234 0x00000000 in ?? () load Loading section .text, size 0x32f6fc lma 0x30000000 Loading section .ARM.exidx, size 0x8 lma 0x3032f6fc Loading section .ctors, size 0x8 lma 0x3032f704 Loading section .dtors, size 0x8 lma 0x3032f70c Loading section .data, size 0x282cc lma 0x3032f714 Start address 0x30000000, load size 3504608 Transfer rate: 497 KB/sec, 2028 bytes/write.
- 现在你可以通过图形化的方式调试SylixOS系统了:
调试真机
- 如果您需要使用硬件调试器(如J-Link edu)调试真实的mini2440开发板。
- 先使用JTAG连接线和JTAG转接板连接J-Link到mini2440开发板的JTAG接口,然后打开J-Link GDB Server软件。
- 目标设备Target device选择Samsung公司的S3C2440A芯片,并选择小端Little endian。
- 目标接口Target interface选择JTAG。
- 速度Speed选择自动选择Auto selection,如下图:
- 最后,点击OK按钮,J-Link GDB Server将开始工作:
- 将bspmini2440/S3C2440.gdbinit文件的内容复制到bspmini2440 Default调试实例的Commands选项卡的Initalize commands内,如下图:
- bspmini2440/S3C2440.gdbinit文件的内容如下:
#connect to J-Link GDB Server target remote localhost:2331 #reset target monitor reset #select endian monitor endian little #initialize memory controler monitor long 0x53000000 = 0x00000000 monitor long 0x4a000008 = 0xFFFFFFFF monitor long 0x4a00001c = 0x00007FFF monitor long 0x4c000000 = 0x00FFFFFF monitor long 0x4c000014 = 0x00000005 monitor long 0x4c000004 = 0x0007F021 monitor long 0x48000000 = 0x12111110 monitor long 0x48000004 = 0x00000700 monitor long 0x48000008 = 0x00000700 monitor long 0x4800000c = 0x00000700 monitor long 0x48000010 = 0x00000700 monitor long 0x48000014 = 0x00000700 monitor long 0x48000018 = 0x00000700 monitor long 0x4800001c = 0x00018005 monitor long 0x48000020 = 0x00018005 monitor long 0x48000024 = 0x009804EC monitor long 0x48000028 = 0x000000B2 monitor long 0x4800002c = 0x00000030 monitor long 0x48000030 = 0x00000030 #wait for moment monitor sleep 20 #load the debug image load #set cpu to svc mode(on cpu reset) monitor reg cpsr = 0xd3 #debug in ram monitor reg pc = 0x30000000 #debug begin
- 最后,点击Debug按钮开始调试