# RT-Smart 用户态应用开发SDK

中文 | [English](README.md)

## 如何构建用户态应用

### 下载代码

下载smart 用户态应用代码：

```
git clone https://github.com/RT-Thread/userapps.git
```

源码目录说明：

```
.
├── apps                  ---- app体验示例
├── configs               ---- 不同平台app的通用配置
├── linker_scripts        ---- 编译app使用的链接脚本
├── prebuilt              ---- 预编译好的内核镜像
├── rtconfig.h            ---- app使用的公共配置文件
├── sdk                   ---- 开发app使用的sdk
├── smart-env.bat         ---- 配置Win上环境变量的脚本
├── smart-env.sh          ---- 配置Linux上环境变量的脚本
└── tools                 ---- 开发app使用的脚本工具
     ├── get_toolchain.py ---- 下载工具链的脚本
     └── gnu_gcc          ---- 下载下来的工具链存放的路径
```

### 配置工具链

在userapps\tools目录下运行get_toolchain.py的脚本，会下载对应的工具链并展开到userapps\tools\gun_gcc目录。后面的工具链名称可以是 arm | aarch64 | riscv64。

本文以RISC-V平台为例，输入下面的命令：

```
python get_toolchain.py riscv64
```

在userapps目录下,运行 smart-env.bat | smart-env.sh 配置工具链路径，目前支持的参数可以是 arm | aarch64 | riscv64

```
smart-env.bat riscv64
```

可使用set命令检查RTT_EXEC_PATH是否设置成功

![img](figures/set.png)

### 编译用户态应用

在rtthread-smart\userapps目录下使用scons编译，编译顺利的话，将在root文件夹中得到一系列可执行elf文件。

![img](figures/build_app.png)

## 运行用户态应用

在本仓库的 prebuilt 目录下存放有预构建好的针对 QEMU RISC-V 平台的内核镜像 qemu-virt64-riscv\rtthread.bin，可以直接运行体验。

### 更新QEMU

由于 Env 自带的 QEMU 版本过低，因此需要更新 QEMU（Env更新QEMU后可删除本步骤）

1. 下载安装 QEMU（推荐qemu-w32-setup-20220831.exe ）：https://qemu.weilnetz.de/w32/
2. 将 Env 里的 QEMU 替换为新版本。

### 制作QEMU SD卡

#### FAT
在 tools\fatdisk 目录下有一个打包 FAT 格式文件的工具 fatdisk.exe，我们可以利用这个工具将我们要存储到QEMU SD卡里的文件打包成 sd.bin 文件。

#### EXT4
在 tools\make_ext4fs 目录下有一个打包 EXT4 格式文件的工具 make_ext4fs(仅限linux（ubuntu）)，使用命令 `./make_ext4fs -l 8G rootfs.img /home/xqyjl/git/github/RT-Thread/userapps/root` 即可制作ext4镜像

1. 

![img](figures/build_sd1.png)

2. 将新生成的 sd.bin（如果是ext4，则是 rootfs.img） 放入userapps\prebuilt\qemu-virt64-riscv目录。

### 运行QEMU

在userapps\prebuilt\qemu-virt64-riscv目录下打开Env，执行qemu-norgraphic.bat运行QEMU。

![img](figures/qemu_run.png)

Smart运行起来后输入 ls 可以看到我们存储到 QEMU SD 卡里的文件和文件夹了。

![img](figures/qemu_run2.png)

在最后执行了hello示例，输出"hello world!"。

执行ctrl c可退出QEMU。

## 构建内核镜像

当需要更新内核镜像文件时，查看本节内容。

下载rt-thread源码（如有则跳过），之后切换到rt-smart分支并从远端同步更新。

```
git clone https://github.com/RT-Thread/rt-thread.git

git checkout rt-smart
# update kernel's rt-smart branch to the latest version
git pull origin rt-smart
```

基于rt-thread仓库rt-smart分支的 qemu-virt64-riscv BSP构建内核镜像。

![img](figures/build_kernel1.png)

![img](figures/build_kernel2.png)

将生成的内核镜像rtthread.bin更新到userapps\prebuilt\qemu-virt64-riscv目录即可。

## QA

### scons时找不到工具链

编译时出现如下信息：

```
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
CC apps\webclient\packages\webclient-v2.1.2\src\webclient.o
Error in calling command:riscv64-unknown-linux-musl-gcc
Exception: No such file or directory

Please check Toolchains PATH setting.

scons: *** [apps\webclient\packages\webclient-v2.1.2\src\webclient.o] Error 2
scons: building terminated because of errors.
```

请检查工具链路径是否设置正确，按照文中步骤进行设置。

### scons时出现zlib1.dll丢失的弹窗

重新下载[zlib1.dll文件](https://www.dlldownloader.com/zlib1-dll/)并分别放在C:\Windows\System32与C:\Windows\SysWOW64文件夹中。
