Hello world 应用程序
本节以 Hello world 工程来介绍 SylixOS 应用程序工程的创建、编译、部署和调试。
创建 SylixOS Base 工程
打开 RealEvo-IDE,在菜单栏中选择 File > New > SylixOS Base ,打开 SylixOS Base 对话框。
在 SylixOS Base 对话框中,自定义 Project name 并且 Location 保持默认,单击 Next 进入 Base 类型选择页面。
在 Base 类型选择页面中,选择 SylixOS Standard base 工程,单击 Next 进入工程设置对话框。
此对话框中可以选择编译工具链类型、编译代码的调试级别以及 CPU Type 等。这部分配置与实际硬件息息相关,由于本节以 RealEvo-Simulator 中的“zcu102”虚拟板卡进行演示,所以按下图配置工程,单击 Next 进入库选择对话框。
SylixOS Base 默认包含 libsylixos 和 libcextern(其他库文件的说明见下表)。单击 Finish,完成 SylixOS Base 工程的创建。
大部分库是可选的,可根据实际需求进行选择,各库的说明如下:
库名 | 说明 | 是否必选 |
---|---|---|
libsylixos | SylixOS 内核源码库 | 必选 |
libcextern | SylixOS 的 c 库 | 必选 |
libVxWorks | VxWorks 兼容库 | 非必选 |
libreadline | 命令行编辑器支持库 | 非必选 |
liblua | lua 脚本库 | 非必选 |
libsqlite3 | SQLite 数据库 | 非必选 |
pciutils | PCIe 工具集 | 非必选 |
libzmodem | Zmodem 协议工具,用于串口文件传输 | 非必选 |
libexpat | xml 解析库 | 非必选 |
libluaplugin | lua 插件库,为 lua 脚本提供大量基础库 | 非必选 |
libsunrpc | SUN RPC 库,为网络文件系统(NFS)提供支持 | 非必选 |
unfsd | NFS 服务器程序 | 非必选 |
libsalsa | ALSA 声卡库 | 非必选 |
libpcap | 网络包抓取依赖库 | 非必选 |
openssl | 开源 SSL 加密实现库 | 非必选 |
libcurl | 多协议文件传输库 | 非必选 |
libffi | 可移植的外部函数接口库 | 非必选 |
libwayland | Wayland 是一个用于合成程序与客户端通信的协议 | 非必选 |
libgtest | 谷歌测试框架,包括 GoogleTest 和 GoogleMock | 非必选 |
tcpdump | 一个强大的命令行包分析器 | 非必选 |
xtrace | 内核监控器 | 非必选 |
zlib | 通用数据压缩库 | 非必选 |
libarchive | zip、unzip 工具压缩、解压缩库 | 非必选 |
openssh | 开源 ssh 协议客户端、服务端加密传输库 | 非必选 |
编译 SylixOS Base 工程
创建完 SylixOS Base 工程后需要对其进行编译。RealEvo-IDE 提供 2 种编译方式,分别介绍如下:
方式一:选择新建的 SylixOS Base 工程,单击 RealEvo-IDE 工具栏的一键编译按钮,进行工程编译。
方式二:选择新建的 SylixOS Base 工程,单击右键选择 Build Project ,进行工程编译。
说明:
SylixOS Base 工程编译完成后会生成基础库和驱动模块文件,编译生成的文件需要部署到目标板卡上,部署方法请参考部署应用。“zcu102”虚拟板卡上已经部署了 SylixOS Base 工程,所以无需部署 SylixOS Base 工程。
创建 SylixOS App 工程
打开 RealEvo-IDE,在菜单栏中选择 File > New > SylixOS App,打开 SylixOS App 对话框。
在 SylixOS App 对话框中,自定义 Project name 并且 Location 保持默认,单击 Next 进入工程设置对话框。
在工程设置对话框中,点击 Workspace 进入 Project base 工程选择对话框。
在 Project base 工程选择对话框中选择上文创建的 Project base 工程。单击 OK,回到工程设置对话框。
单击 Finish,完成 SylixOS App 工程的创建。
编译 SylixOS App 工程
修改完 SylixOS App 工程后需要对其进行编译。编译成功后生成的 helloworld 可执行文件保存在 helloworld 工程的 Debug 文件夹中。
Hello world 程序总是作为第一个程序出现在各种编程语言书籍中,作为一个经典的例子。下面我们将以 Hello world 工程来介绍 SylixOS 应用程序的编写和运行方法。
部署 SylixOS App 工程
helloworld 工程的部署和运行大致分为以下三个步骤:
步骤 1:部署设置
右击 helloworld 工程,选择 Properties 打开工程属性页。
在工程属性页中选择 SylixOS Project > Device Setting,可查看和更改部署配置。单击 New Device,添加新设备。
在添加设备的对话框中,设置 Device IP 为 10.4.120.37,单击 Finish 。
上图中各配置项解析如下:
配置项 说明 Deivce Name 设备名称,即设备在本 Workspace 的唯一 ID,不可重复,可以默认为 IP,也可以自定义 Device IP 设备 IP 地址,可以使用“ifconfig”命令查看网络信息 Telnet Port 设备 telnet 协议端口 FTP Port 设备 FTP 协议端口 GDB Port 调试应用程序时,gdbserver 端口 Use SSH Connection 使用 SSH 连接 User Name 登录用户名 Password 登录密码 设置完成后,在 Device Name 字段中出现新添加的设备,单击 Apply and Close 关闭对话框并保存设置。
步骤 2:上传应用程序
SylixOS 支持 FTP 服务器,所以可以用 FTP 客户端上传文件到 SylixOS 目标系统中。RealEvo-IDE 自带 FTP 客户端工具,上传方法如下:
右击 helloworld 工程,选择 SylixOS > Upload 上传文件或按 Atl + D 上传文件。
在 RealEvo-IDE 底部的 Upload 中可以查看上传进度。
说明:
如果文件上传失败,则会显示“Upload file failed!”字样,这种情况通常是由于网络或其他原因造成的,例如 IP 地址不正确、用户名密码错误、防火墙的拦截等。
步骤 3:运行应用程序
SylixOS Shell 下运行程序的方法与 Linux 系统相同,具体步骤如下:
使用 cd 命令切换目录到 “/apps/helloworld/”。
[root@sylixos:/root]# cd /apps/helloworld/ [root@sylixos:/apps/helloworld]#
使用 ls 命令查看当前目录中的文件以确认包含文件 helloworld。
[root@sylixos:/apps/helloworld]# ls helloworld
输入“./helloworld”执行程序文件,查看运行结果。
[root@sylixos:/apps/helloworld]# ./helloworld Hello World!
RealEvo-IDE 启动运行
选择 helloworld 工程点击鼠标右键选择 Run As > SylixOS Remote Application将自动运行 SylixOS 应用程序。
调试 Hello World 应用程序
在程序开发的过程中,难免会因为一些程序编写上的问题而造成程序不正常运行,这个时候我们可以通过检查代码规范或者分析代码逻辑来查找问题,通常这种方法,在代码量很少的时候,能够很快地定位问题。但是当代码量达到上万行甚至更多的时候,情况将变得很糟糕,针对这种情况使用交叉调试技术,将使复杂问题简单化,进而能够迅速地定位问题所在。下面以 helloworld 工程为例来介绍如何通过 RealEvo-IDE 调试 SylixOS 应用程序。
一键推送调试
一键推送调试功能,需要在 RealEvo-IDE 中做如下配置:
- 选中需要调试的工程,这里选择 helloworld 工程,选择菜单 Run > Debug Configurations 打开调试器界面。
- 选择 SylixOS Remote Application ,点击 New launch configuration 按钮新建一个调试器对象并在 Name 编辑框填写调试器对象名字。
注意:
可以通过在编译成功的应用程序上点击鼠标右键选择 Debug As > SylixOS Remote Application 快速启动调试。
单击下图中的 Debug 进行配置。
Debug 按钮进入调试界面如下图 Debug 运行界面所示,下面是 RealEvo-IDE 一些调试命令:
- 开始调试(全速运行)Run > Resume(F8)。
- 单步进入函数内部 Run > Step Into(F5)。
- 单步跳过 Run > Step Over(F6)。
- 从函数中退出 Run > Step Return(F7)。
- 停止调试 Run > Terminate(Ctrl+F2)。
- 设置断点 Run > Toggle Breakpoint(Ctrl+Shift+B)。
手动启动调试
手动启动调试的方法,需要在 SylixOS Shell 中手动启动 GDB 服务器,具体方法如下:
使用 debug 命令启动需要调试的应用程序(如 helloworld),如下图 手动启动 debug 所示。
选中需要调试的工程(如helloworld工程),选择菜单 Run > Debug Configurations 打开调试器界面。选择 SylixOS Remote Application,新建一个调试器对象,点击 Select other... 按钮,在弹出框中使能 Use configuration specific settings,在下方列表中选择 SylixOS Manual Remote App Debugging Launcher,点击 OK 返回到 Debug Configurations 对话框,如下图 手动调试配置所示(箭头指示操作顺序)。
打开 Debugger > Connection 标签页,Type 下拉框选择TCP,Host name or IP address 编辑框中输入 SylixOS 设备 IP 地址,在 Port number 编辑框输入端口号(此端口号需要与 debug 命令启动时的端口号一致),点击 Apply 应用修改,点击 Debug 开始调试,如下图 设置调试配置所示。
Attach 调试
当程序正在运行时(程序可能已运行了很久)出现了严重错误(程序并没有因为这个错误而停止),这个时候由于程序不能停止,我们就需要一种特殊方法来发现程序运行中存在的问题。Attach 调试方法是一种能够对正在运行的程序进行调试的方法,该调试方法正好满足了上述情况,SylixOS 支持 Attach 调试方法。下面介绍如何使用 Attach 的方法来调试 SylixOS 应用程序:
修改 helloworld 工程代码,如以下程序所示。
手动启动应用程序如下图 helloworld 程序所示,使用 ps 命令查看进程的 ID。
#include <unistd.h> #include <stdio.h> int main (int argc, char *argv[]) { while (1) { printf("Hello SylixOS!\n"); sleep(1); } return (0); }
注意:
程序代码增加了无限循环,目的是让程序连续运行,sleep 是一个睡眠函数,将使程序延时一秒再运行,这使得 SylixOS 其他线程得到执行的机会。选中 helloworld 工程,选择菜单 Run > Debug Configurations 打开调试器界面。选择 SylixOS Remote Application,新建一个调试器对象,名字默认,选择 Select other... 按钮,在弹出框中使能 Use configuration specific setting,在下方列表中选择 SylixOS Attach Remote App Debugging Lancher,点击 OK 返回到 Debug Configurations 对话框,如下图 Attach 调试所示(箭头指示操作顺序)。
设置 Target process ID,此选项填写为之前所查看的进程 ID,最后点击 Apply 完成设置。
Non-stop 调试模式
在多线程调试时,经常需要调试某一个特定线程。Non-stop 模式可以使调试器在遇到断点时只停止设置断点的线程,其他线程继续运行。在 SylixOS 中,“调式 Hello World 应用程序”中介绍的三种调试方式都支持 Non-stop 模式。设置方法如下:选择 Run > Debug Configurations 对话框,打开 Debugger > Main 属性页,使能 Non-stop mode 即可打开 Non-stop 模式,如下图 Non-stop 模式所示。