userapps 的獲取
rt-smart 上,為了實現用戶態與內核態的分離,使用了【系統調用】,這個系統調用可以認為是個 sdk,當前 userapps 提供了 arm 與 riscv 的 sdk(編譯好的二進制)文件與頭文件,所以用戶態的程序開發,只需要開發 app 即可。
userapps 的編譯環境
編譯 userapps 的方法:下載 userapps 后,進入 tools 目錄,然后把 運行平臺的 交叉編譯工具鏈拉取下來,qemu-virt64-riscv 使用的是 riscv64,在 ubuntu 20.04 shell 中運行: $ python3 get_toolchain.py riscv64 即可拉取 riscv64 的 gcc 交叉編譯工具鏈 riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2,并解壓到 userapps/tools/gnu_gcc/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu
設置 riscv64 gcc 交叉編譯鏈的 環境變量:ubuntu 20.04 下,在 userapps 目錄下,直接運行 $ source smart-env.sh riscv64 即可
zhangsz@zhangsz:~/rtt/smart/userapps$ source smart-env.sh riscv64
/home/zhangsz/rtt/smart/userapps
Arch => riscv64
CC => gcc
PREFIX => riscv64-unknown-linux-musl-
EXEC_PATH => /home/zhangsz/rtt/smart/userapps/tools/gnu_gcc/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin
可以運行 $ riscv64-unknown-linux-musl-gcc -v 驗證 riscv64 gcc 交叉編譯工具鏈生效
userapps 的編譯
編譯 userapps,可以在 userapps 目錄直接使用 scons 進行編譯,也可以進入 userapps/apps/xxx 目錄下,單獨編譯某個 app。
如單獨編譯 userapps/apps/hello 的方法,進入 userapps/apps/hello,運行 scons 編譯,生成 hello.elf 文件,這個 elf 就是用戶態的可執行文件,可以放進 rt-smart 文件系統中,運行執行。
zhangsz@zhangsz: /rtt/smart/userapps/apps/hello$ scons /rtt/smart/userapps$ cd root/bin/
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/hello
CC build/hello/main.o
LINK hello.elf
scons: done building targets.
在 userapps 目錄下,默認是全部編譯,生成的產物在 userapps/root/bin
zhangsz@zhangsz:
zhangsz@zhangsz: /rtt/smart/userapps/root/bin$ ls /rtt/smart/userapps/root/bin$
hello.elf ping.elf pong.elf umailbox.elf vi.elf webclient.elf webserver.elf
zhangsz@zhangsz:
可以把 userapps 的編譯產物 userapps/root/bin 目錄下的所有 elf 文件等,全部 拷貝到 qemu-virt64-riscv 的 sd.bin 鏡像文件中
sd.bin 鏡像文件
ubuntu 20.04 下,有各種文件系統鏡像文件的制作工具,如 fat、ext4 等文件系統類型
如當前 RT-Thread 支持 elm 文件系統,也就是 fat 文件系統,制作方法如下:
進入 qemu-virt64-riscv 的內核目錄,注意 userapps 和 qemu-virt64-riscv 是獨立的
$ dd if=/dev/zero of=sd.bin bs=1024 count=65536 /* 64MB 大小,可以根據需要更改大小 */
$ mkfs.fat sd.bin /* 格式化為 fat 文件類型 */
$ mkdir sdcard /* 鏡像文件 sd.bin mount 掛載目錄,掛載后可往鏡像文件里面拷貝或刪除文件 */
$ sudo mount sd.bin sdcard/ /* 掛載到 sdcard 目錄下,這樣就可以拷貝文件了 */
$ sudo cp -r /home/zhangsz/rtt/smart/userapps/root/bin sdcard/ /* userapps 產物拷貝到 鏡像文件 */
$ ls sdcard/ /* 文件拷貝進去了 */
bin
$ sudo umount sdcard /* 取消鏡像文件 sd.bin 的掛載, userapps 的產物已經在里面了 */
運行 qemu
qemu-virt64-riscv 下 運行 $ ./qemu-nographic.sh 即可
zhangsz@zhangsz:~/rtt/smart/rtt_qemu_aarch64/qemu-virt64-riscv$ ./qemu-nographic.sh
OpenSBI v1.2
/ __ / | _ _ |
| | | | __ ___ _ __ | ( | | ) || |
| | | | '_ / _ '_ ___ | _ < | |
| | | | | ) | __/ | | | ** ) | | ) || |
_** /| . / _ | | | | /|____/ |
| |
|_|
Platform Name : riscv-virtio,qemu
Platform Features : medeleg
Platform HART Count : 1
Platform IPI Device : aclint-mswi
Platform Timer Device : aclint-mtimer @ 10000000Hz
Platform Console Device : uart8250
Platform HSM Device : ---
Platform PMU Device : ---
Platform Reboot Device : sifive_test
Platform Shutdown Device : sifive_test
Firmware Base : 0x80000000
Firmware Size : 212 KB
Runtime SBI Version : 1.0
Domain0 Name : root
Domain0 Boot HART : 0
Domain0 HARTs : 0*
Domain0 Region00 : 0x0000000002000000-0x000000000200ffff (I)
Domain0 Region01 : 0x0000000080000000-0x000000008003ffff ()
Domain0 Region02 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address : 0x0000000080200000
Domain0 Next Arg1 : 0x000000008fe00000
Domain0 Next Mode : S-mode
Domain0 SysReset : yes
Boot HART ID : 0
Boot HART Domain : root
Boot HART Priv Version : v1.12
Boot HART Base ISA : rv64imafdch
Boot HART ISA Extensions : time,sstc
Boot HART PMP Count : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count : 16
Boot HART MIDELEG : 0x0000000000001666
Boot HART MEDELEG : 0x0000000000f0b509
heap: [0x802e7078 - 0x842e7078]
| /
RT - Thread Smart Operating System
/ | 5.0.0 build Mar 19 2023 20:34:47
2006 - 2022 Copyright by RT-Thread team
lwIP-2.0.3 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/utest] utest is initialize success.
[I/utest] total utest testcase num: (0)
file system initialization done!
Hello RISC-V
msh />
msh />ls
Directory /:
bin
msh />cd bi
msh />cd bin/
msh /bin>ls
Directory /bin:
hello.elf 341224
ping.elf 347336
pong.elf 342152
umailbox.elf 357440
vi.elf 517448
webclient.elf 393016
webserver.elf 489320
msh /bin>./h
msh /bin>./hello.elf
msh /bin>hello world!
可以進入 /bin 目錄下,運行 elf 用戶態的程序了
進程間通信例程
當前用戶態程序 ping.elf pong.elf,可以用于驗證 線程通信
首先后臺方式運行 pong.elf,運行命令: ./pong.elf &,注意后面的 & 代表后臺線程,這樣 shell 不會被占用,否則無法再運行其他的 elf 文件
msh /bin>./pong.elf &
msh /bin>
Pong: wait on the IPC channel: 3
接下來運行 ping.elf,看下效果 ./ping.elf
用戶態的線程可以正常的運行
小結
rt-smart 的內核態與用戶態分離,與 嵌入式Linux開發方法相似, rt-smart 在不斷的完善,后期會適配到更多的平臺上
除了運行 RT-Thread userapps 下的app,用戶可以根據需要,設計自己的 app,當前如果需要內核設備驅動支持,還需要在 內核部分編寫設備驅動等。
-
驅動器
+關注
關注
51文章
7998瀏覽量
145024 -
嵌入式
+關注
關注
5046文章
18821瀏覽量
298593 -
RT-Thread
+關注
關注
31文章
1239瀏覽量
39438 -
Ubuntu系統
+關注
關注
0文章
85瀏覽量
3860 -
gcc編譯器
+關注
關注
0文章
78瀏覽量
3297
發布評論請先 登錄
相關推薦
評論