0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread Smart qemu-virt64-riscv用户态userapps的编译与运行

冬至子 来源:张世争 作者:张世争 2023-10-08 15:33 次阅读

userapps 的获取

rt-smart 上,为了实现用户态与内核态的分离,使用了【系统调用】,这个系统调用可以认为是个 sdk,当前 userapps 提供了 armriscv 的 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 交叉编译工具链生效

1.jpg

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
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:
/rtt/smart/userapps$ cd root/bin/
zhangsz@zhangsz: /rtt/smart/userapps/root/bin$ ls
hello.elf ping.elf pong.elf umailbox.elf vi.elf webclient.elf webserver.elf
zhangsz@zhangsz:
/rtt/smart/userapps/root/bin$
可以把 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

1.jpg

用户态的线程可以正常的运行

小结

rt-smart 的内核态与用户态分离,与 嵌入式Linux开发方法相似, rt-smart 在不断的完善,后期会适配到更多的平台上

除了运行 RT-Thread userapps 下的app,用户可以根据需要,设计自己的 app,当前如果需要内核设备驱动支持,还需要在 内核部分编写设备驱动等。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7310

    浏览量

    142973
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288509
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38900
  • Ubuntu系统
    +关注

    关注

    0

    文章

    84

    浏览量

    3785
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3233
收藏 人收藏

    评论

    相关推荐

    RT-Thread学习笔记】如何优雅地退出QEMU模拟器?

    RT-Thread学习笔记】如何优雅地退出QEMU模拟器?我想重新编译源码,再次运行新的代码,怎么办呢?如何才能退出这个QEMU命令行控制
    的头像 发表于 07-26 04:06 4785次阅读
    【<b class='flag-5'>RT-Thread</b>学习笔记】如何优雅地退出<b class='flag-5'>QEMU</b>模拟器?

    RT-Thread BSP qemu-virt64-riscv编译环境搭建步骤

    最近需要使用 RT-Thread smart 开发调试一些软件功能,由于软件功能平台无关,使用实际硬件操作,会耗费较多的时间在程序烧写环节。
    的头像 发表于 10-08 15:41 875次阅读
    <b class='flag-5'>RT-Thread</b> BSP <b class='flag-5'>qemu-virt64-riscv</b>的<b class='flag-5'>编译</b>环境搭建步骤

    RT-Thread Smart 入门指南

    rt-smart 软件包是 RT-Thread Smart用户体验软件包,可在 QEMU 模拟的 VExpress-A9 机器中或树莓
    发表于 03-29 06:40

    快速上手RT-Thread Smart入门指南

    qemu 或树莓派 4B 开发板上执行起来,这里主要提及如何在树莓派 4B 上执行的方式。准备编译环境在 Windows 上编译 rt-smart,可以借助
    发表于 04-01 17:38

    如何在RT-Thread Smart下使用gcc交叉编译工具链呢

    前言RT-Thread Smart的BSP rt-smartspd1-allwinner-nezha,也全志D1s的哪吒开发板,基于RISCV64平台,需要CV
    发表于 06-17 11:13

    RT-Thread Smart快速上手入门指南

    、scons、qemu工具等。编译应用程序1# 进入到rt-smart目录 2cd rt-smart 3 4# 设置对应的环境变量,和原RT-Thr
    发表于 09-08 15:40

    RT-Smart用户运行LVGL的操作流程

    开发流程1、RT-Smart 环境搭下载 RT-Smart 用户应用代码进入到 userapps 目录,克隆
    发表于 11-18 11:34

    请教大神qemu模拟cortex-A53运行rt-thread出错怎么解决呢?

    新手小白,参考官网文档运行 RT-Thread qemu-vexpress-a9 BSP 工程的方法自己配置了qemu-virt64-aarch64的工程模拟了cortex-A53的架
    发表于 02-15 10:51

    RT-Thread BSP qemu-virt64-aarch64编译环境搭建步骤

    =》 ${RTT_EXEC_PATH}”  下载gcc交叉编译工具链接后,在rt-thread/bsp/qemu-virt64-aarch64 运行  设置
    发表于 04-04 17:04

    RT-Thread BSP qemu-virt64-aarch64文件系统

      前言   前面大体上搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉编译环境,运行后发现,文件系统没有挂载上,感觉是没有 mkfs。   通过
    发表于 05-16 10:29

    RT-Thread BSP qemu-virt64-riscv编译环境搭建

    smart_env.sh 的执行权限 $ chmod +x smart_env.sh   下载 gcc 交叉编译工具链后, 在 rt-thread/bsp/
    发表于 05-16 10:37

    RT-Thread在arm与riscv上的两点差异

    RT-Thread全球大会上,介绍了RT-Thread在arm与riscv上的两点差异如下:
    的头像 发表于 05-28 10:35 1312次阅读
    <b class='flag-5'>RT-Thread</b>在arm与<b class='flag-5'>riscv</b>上的两点差异

    丝滑的在RT-Smart用户运行LVGL

    开发流程 1、RT-Smart 环境搭建 下载 RT-Smart 用户态应用代码: 1 git clone https: //github.com/RT-Thread/
    的头像 发表于 11-22 20:20 939次阅读

    riscvrt-smart中的板级初始化

    本文章的代码来自于rt-smart中针对qemu-virt-riscv的bsp 仓库地址 https://gitee.com/rtthread/rt-thread/tree/rt-smart
    的头像 发表于 02-09 17:45 675次阅读

    RT-Thread BSP qemu-virt64-aarch64文件系统

    前面大体上搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉编译环境,运行后发现,文件系统没有挂载上,感觉是没有 mkfs。
    的头像 发表于 10-08 16:34 561次阅读
    <b class='flag-5'>RT-Thread</b> BSP <b class='flag-5'>qemu-virt64-aarch64</b>文件系统