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
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
/ __ / | _ _ |
| | | | __ ___ _ __ | ( | | ) || |
| | | | '_ / _ '_ ___ | _
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,当前如果需要内核设备驱动支持,还需要在 内核部分编写设备驱动等。
全球家电的主导者是谁?中国家电称霸全球市场的那一天什么时候到来?
全球首个无内燃机驱动设备的码头,真正无污染零排放的绿色环保“魔鬼码头”
ADI:解读中国制造“二次创新”
Xilinx FPGA的电源设计和实现方案
抢抓未来产业机遇,昆山市与亮风台签约工业元宇宙重点项目
RT-Thread Smart qemu-virt64-riscv用户态userapps的编译与运行
分析Intel的傲腾存储技术,或将改变PC理论架构
莱迪思半导体不断加强适用于低功耗、小尺寸FPGA的设计工具套件
使用Wio Terminal与气体传感器收集咖啡气味数据
平板电视研发企业厦华电子发布2021年报
交流促进技术革新,鼎阳科技携产品及解决方案亮相EDTEST2019
优胜劣汰下,中国芯片产业即将崛起
几种测量大尺寸设备的精密仪器
不算完? 魅族大年三十要搞事情了
DHL趋势报告:人工智能驱动的计算机视觉技术正对行业产生重要影响
中国有自己的手机芯片吗
L298N模块介绍
ZMDI推出用于锂离子电池的充电器ZSPM4551
硬件接口协议技术:JTAG内部状态机——TAP控制器
歼15引擎起火!遭鸟群撞击起火连人带机安全着陆,歼15撞机到降落全过程解析