前言
之前的学习用的都是单核的cortexM内核 感觉多少有点"落后"与现代的CPU格格不如了,还是得了解点现代一点的CPU(带个MMU 带个缓存 多核) + 现代一点的操作系统的知识,但是Linux的体系太大啃起来又容易放弃,哎正好就发现RTT去年发布的RTT-SMART了,那就基于进行进一步的学习吧.
RTT-SMART环境配置
环境: WSL2(Ubuntu18.04) + VSCODE + Qemu
实现cortexA9的双核运行程序的编译和模拟运行
内核环境搭建
-
克隆最新的rtt的代码
c
git clone https://github.com/RT-Thread/rt-thread.git
-
下载交叉编译工具musl
具体的不同的架构使用的工具链不同 参考https://github.com/RT-Thread/smart-build/issues/19下的说明即可
下载完成后 解压然后 一定要记得解压的路径 文件最终在哪里
最好把gcc-musl加入到环境变量当中,具体可以问问AI怎么做
-
工具的下载
很多 报错了就问AI看看是少哪个 大概需要pip install的有: python3 / qemu / scons(最好也加入环境变量) / gdb-multiarch(后续调试配置用) / libncurses5-dev / libncursesw5-dev
这里我用的Ubuntu18 默认是python2 所以还要安装python3(scons工具要用)
-
修改配置文件
- 修改env_arm.sh 并执行
c#!/bin/bash # arm musl gcc export RTT_CC=gcc /*修改为对应的你的musl所在的文件夹*/ export RTT_EXEC_PATH=/root/gitProject/arm-linux-musleabi_for_x86_64-pc-linux-gnu/bin export RTT_CC_PREFIX=arm-linux-musleabi- export PATH=$PATH:$RTT_EXEC_PATH-
修改bsp/qemu-vexpress-a9 下的一些配置
menuconfig打开配置文件,千万不要手动修改rt_config.h!! 因为配置某个参数的时候需要关联定义其它的宏,要让menuconfig配置完之后自己生成

打开之后 Enable SMP并 设置一下CPU数量
c// qemu.sh if [ ! -f "sd.bin" ]; then dd if=/dev/zero of=sd.bin bs=1024 count=65536 fi qemu-system-arm --version qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -serial stdio -sd sd.bin // qemu-dbg.sh if [ ! -f "sd.bin" ]; then dd if=/dev/zero of=sd.bin bs=1024 count=65536 fi qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin -S -s
-
配置vscode下工作区 方便后续调试和跳转查看源码
这是要配合 C/C++插件
-
c_cpp_properties.json
这个主要是为了方便检索代码用c{ "configurations": [ { "name": "Win32", /*第一个是工作区 剩下的就按照自身代码路径去改就行*/ "includePath": ["${workspaceFolder}/**", "/root/gitProject/rt-thread/include", "/root/gitProject/rt-thread/components", "/root/gitProject/rt-thread/bsp/qemu-vexpress-a9", "/root/gitProject/arm-linux-musleabi_for_x86_64-pc-linux-gnu/include"], "defines": ["_DEBUG", "UNICODE", "_UNICODE"], "windowsSdkVersion": "10.0.17763.0", "compilerPath": "/usr/bin/gdb-multiarch", /*修改成自己bin目录下的g++.exe,这里的路径和电脑里复制的文件目录有一点不一样,这里是两个反斜杠\\*/ "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "${default}" } ], "version": 4 } -
launch.json
c{ "version": "0.2.0", "configurations": [ { "name": "Debug @ Windows", "type": "cppdbg", "request": "launch", "program": "${workspaceRoot}\\rtthread.elf", "args": [], "stopAtEntry": true, "cwd": "${workspaceRoot}", "environment": [], "externalConsole": true, "miDebuggerServerAddress": "localhost:1234", "serverLaunchTimeout": 2000, "targetArchitecture": "ARM", "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb-multiarch", "customLaunchSetupCommands": [], "launchCompleteCommand": "exec-run", }, ] }我个人工作区结构如下
- qemu-vexpress-a9: 代码的编写 调试
- /rt-thread/src: rt-thread的源码
- /rt-thread/include: rt-thread的头文件
- /rt-thread/libcpu/arm/cortex-a: Cortex-A内核关键文件 有MMU的配置/启动文件等
- /rt-thread/componets/lwp: 轻量化进程的实现
- /rt-thread/componets/mm: 对MMU相关硬件的操作代码

-
-
编译与调试
scons -j8就可以编译生成内核

执行./qemu.sh 就可以观察代码的运行效果
执行./qemu-dbg.sh后 按下F5就可以进行调试

用户态环境搭建
参考 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/quick-start/qemu-linux/quickstart即可 不过本人比较懒就没测试了