- Windows 10 + env 环境
- RT-Studio IDE
Note: 第0章的内容是配置 env 环境,如果使用 linux/WSL 的 RT-Thread 开发环境,可以参考RT-Thread Qemu环境设置
0. 配置 RT-Thread Env 环境
0.1 安装 mingw 交叉编译链
- 从 Standalone SDK 的 README 下载 windows + mingw 用的交叉编译链完成解压,获取 AARCH32 和 AARCH64 的交叉编译链
0.2 配置 Env 环境变量
- 将 mingw 交叉编译链的路径配置成 Windows 环境变量
-
- 添加环境变量 AARCH32_CROSS_PATH 指向 32 位交叉编译链的 bin 目录
-
- 添加环境变量 AARCH64_CROSS_PATH 指向 64 位交叉编译链的 bin 目录
-
- 将上述 AARCH32_CROSS_PATH 和 AARCH64_CROSS_PATH 目录添加到环境变量 PATH 中
- 将上述 AARCH32_CROSS_PATH 和 AARCH64_CROSS_PATH 目录添加到环境变量 PATH 中
-
1. 导出 Phytium BSP 库
- RT-Thread 中复用 Standalone SDK 作为 BSP 库
- 从 Phytium Standalone SDK 导出 BSP 给 RT-Thread 使用,导出过程由 SDK tools 目录下的脚本 export_rtt_bsp.py 完成
- BSP 的导出支持两种方式,一是可以将库上代码(指定 Git URL) 导出,二是可以将本地代码导出
1.1 将 Git URL 导出为 BSP 库
- 运行导出脚本,其中,
- Git 远程仓库为 https://gitlab.phytium.com.cn/zhugengyu/phytium-standalone-sdk.git
- Git 远程分支为 rtt_1025
- 输出目录为 /mnt/d/proj/rt-thread-e2000/rt-thread/bsp/phytium/libraries/standalone
./export_rtt_bsp.py -i=https://gitlab.phytium.com.cn/zhugengyu/phytium-standalone-sdk.git -b=rtt_1025 -o=/mnt/d/proj/rt-thread-e2000/rt-thread/bsp/phytium/libraries/standalone
- 导出的版本信息记录在 gitinfo 文件中
1.2 将本地 SDK 导出为 BSP 库
-
本地 SDK 库必须有 .git 文件记录信息才能支持导出,通过 download zip 压缩包方式获取的 SDK不能导出
-
删除 untrack 文件和目录,本地 SDK 库中会有编译生成文件,导出之前要先将 git 仓库中这些 untrack 文件和目录删除
git clean -xfd
- 导出前要确保本地仓库的修改已经 commit,否则会导出失败
git status .
- 运行导出脚本,当前目录为 SDK 的tools子目录,其中 ,
- Git 本地仓库为 …/
- 输出目录为 /mnt/d/proj/rt-thread-e2000/rt-thread/bsp/phytium/libraries/standalone
./export_rtt_bsp.py -i=../ -o=/mnt/d/proj/rt-thread-e2000/rt-thread/bsp/phytium/libraries/standalone
- 导出过程会覆盖之前的 BSP 包库
1.3 定制导出 BSP 库
- 通过修改脚本 export_rtt_bsp.py 可以将 Standalone SDK 中的文件加入进或者移除出 BSP 导出库,控制导出 BSP 库的原理是 git 中的 sparse-checkout 功能,具体的方法是将需要保留的文件或者目录路径写在 ‘.git/info/sparse-checkout’ 文件中,不需要保留的文件取反 !也写入。具体的方法说明如下,
- 脚本提供了两个函数控制文件的取舍
# add file or folder you need
def append_sparse_path(path):
os.system("echo \"{}\" >> {}".format(path, sparse_ck))
# remove file or folder you do not need
def remove_sparse_path(path):
os.system("echo \"!{}\" >> {}".format(path, sparse_ck))
- 指定需要的文件路径,如下所示,将 SDK 根目录的两个个文件保留
# overall
append_sparse_path(r'/README.md')
append_sparse_path(r'/LICENSE')
- 指定不需要的文件路径,如下所示,将 board/common 目录保留,但将目录下的 fsmp.c 文件删除
append_sparse_path(r'board/common/*')
remove_sparse_path(r'board/*/fparameters.c')
remove_sparse_path(r'board/common/fsmp.c')
2. 使用 RT-Thread 的 Phytium BSP
- Phytium BSP 包括四个部分
-
- AARCH32/AARCH64 ,存放两种CPU模式的配置和相关代码
-
- Board,支持 E2000/FT2000-4/D2000等开发板
-
- Libraries,导出 Standalone SDK 给 Phytium BSP 使用,将 SDK 驱动适配到 RT-Thread 的驱动框架
-
- Applications, 存放 RT-Thread 应用代码
-
2.1 配置 RT-Thread 内核 和 Phytium BSP
- 进入 aarch32 / aarch64目录,运行
menuconfig
,其中-
- RT-Thread Kernel 中选择内核配置
-
- Hardware Drviers 中选择硬件驱动
-
- Standalone Setting 中选择 Standalone 配置
-
-
有几个 RT-Thread 的内核配置项需要注意
-
- RT_USING_SMP 使能多核启动
-
- RT_CPUS_NR 开发板上的核心数目,按照实际情况设置
-
- RT_TICK_PER_SECOND 内核的Tick数,越大任务调度越频繁
-
- IDLE_THREAD_STACK_SIZE IDLE 线程的栈大小,对于 AARCH64,要设置为 2048 以上,否在 IDLE 线程有堆栈溢出的可能,对于 AARCH32,设置为 256 或者 512 应该是足够的
-
- SYSTEM_THREAD_STACK_SIZE 开启多核后,SYSTEM 线程的栈大小,可以和 IDLE 线程的栈设成一样大的
-
-
在 Hardware Drviers 和 Standalone Setting 中进一步配置 BSP
-
完成配置或点
Save
保存配置,点Exit
退出
2.2 编译 Phytium BSP
- 进入 aarch32 / aarch64目录,清理之前的编译中间文件
scons -c
- 编译 BSP,编译如果出现问题,先观察编译链路径 EXEC_PATH, 代码路径 RTT_ROOT, BSP_ROOT等是否正常
scons -j8
- 一键编译并拷贝镜像(32位/64位)
scons && cp rtthread_a32.bin D:\tftboot\rtthread_a32.bin && ls D:\tftboot\rtthread_a32.bin
scons && cp rtthread_a64.bin D:\tftboot\rtthread_a64.bin && ls D:\tftboot\rtthread_a64.bin
- 生成镜像的反汇编文件(32位/64位)
arm-none-eabi-objdump -S rtthread.elf > rtthread.dis
aarch64-none-elf-objdump -S rtthread_a64.elf > rtthread_a64.dis
2.2.1 编译 AARCH32
2.2.2 编译 AARCH64
2.3 在 Phytium BSP 新增目录
- 新增目录和外部之间可以能需要 bridge 来联系在一起
- 新增目录内部的源文件需要 componet 进行管理
- 使用 rt-thread 提供的 wizard.py 脚本创建,在 env 环境下运行
python ../../../tools/wizard.py --bridge
python ../../../tools/wizard.py --component drivers
2.4 启动 RT-Thread 镜像
-
将编译的镜像加载到开发板,完成多核启动
-
aarch32 镜像启动
-
aarch64 镜像启动
2.4 使用 RT-Thread packages
- RT-Thread 以 packages 的形式提供了大量的第三方库和测试代码
- 在 menuconfig 中选中需要的 packages
- 如下图,选择了文件系统的测试用例,
- 保存配置后,env 环境会自动拉取 package 到 ./packages 目录下
- 然后 scons 开始编译就可以将 packages 编入了
3. 在 RT-Studio 中使用 BSP 工程
- 下载 RT-Studio 完成安装
3.1 Env 环境导出 BSP 给 RT-Studio 使用
- 在 Env 环境下可以导出 BSP 给 IDE 使用
scons -c
python ./export_project.py
- 导出工程到 BSP 目录下后,BSP 会编译不过,需要先把导出工程删除然后编译
3.2 在 RT-Studio 中导入BSP工程
3.3 更新 BSP 的 Scons 配置
- 编译 BSP 前,需要先同步一下 Standalone SDK 的 scons 配置,先选中 phytium-standalone-sdk 然后同步 scons 配置至项目
3.5 指定 BSP 工程的交叉编译链
-
按照下图,指定 BSP 工程的交叉编译链,AARCH32 工程选择 AARCH32_CROSS_PATH 作为交叉编译链路径,AARCH64 工程选择 AARCH64_CROSS_PATH
-
添加构建前步骤,编译前会打印交叉编译链的版本信息
- 对于 AARCH64 , 选择不同的编译链,由于 RT-Studio 中没有带 arm 的 aarch64 编译链的选项,这里选择 linaro 的编译链,将目录指向 AARCH64_CROSS_PATH,编译选项中 thumb 指令集相关的选项也要移除
3.6 更新 BSP 的汇编文件包含路径
- 导入工程时,汇编文件的包含路径没有自动加入,需要手动添加
3.4 编译 BSP 生成镜像文件
- 点击构建/重新构建开始编译
3.5 使用 RT-Studio 自带串口工具
4. 相关问题记录
-
- 默认主核编号为0,导致某些情况, 如Smp 模式下,所有中断路由至0核
-
- Armv8 中aarch32/aarch64 interrupt 处理存在差异
-
- 在 WSL 下进行开发和使用 env 环境进行开发存在差异,有些命令不同,目前两种方式都验证过可以使用