前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何移植RTT微内核到树莓派3B

如何移植RTT微内核到树莓派3B

作者头像
Rice加饭
发布2022-05-10 08:44:02
6860
发布2022-05-10 08:44:02
举报
文章被收录于专栏:Rice嵌入式

作者是第一次接触微内核,目前也没有深入去了解。很高兴参与RTT在树莓派上搭建的微内核的体验版。这篇文章描述如何移植,以及体验。该工程我目前在ubuntu16.04和ubuntu18.04上编译运行都没问题。

RTT构建的混合内核的看法

一般的在 ARM Cortex-A 等处理器中,代码都是会被加载到 DRAM 中执行,而不是直接在 Flash 上执行,所以系统的启动时间将大部分的受加载时间的影响。

而在一些情况下,如果系统启动时间可以足够短时,设备低功耗也将易于实现(例如主控处理器在不使用的情况下直接进行掉电,当需要的时候再迅速启动进行工作)。

同时,RT-Thread在面向资源丰富类型的处理器时也需要一个更完善、完整的 POSIX 平台,能够更好的兼容 Linux 等 UNIX 操作系统的代码。

基于这些原因的情况下,所以RT-Thread引入了类微内核方式的架构,而考虑到微内核IPC性能的缘故,最终考虑采用混合内核的架构,这个新的架构被命名成 RT-Thread Smart 。因为类微内核架构的引入,也带来了更多的优点:

  • 整体系统更为安全,应用与内核、与服务之间可以有内存的安全隔离;
  • 应用与内核分离来进行开发、调试,在开发、维护的角度上更方便,更容易;

在支持的硬件平台上,RT-Thread Smart被设计成主要支持 ARM Cortex-A 处理器,同时兼顾 ARMCortex-M 、 RISC-V 等处理器架构。对于可以 XIP 执行的硬件平台(例如 ARM Cortex-M 系列),主要看中其独立开发性,并具备一定的安全隔离功能(通过 MPU 内存保护单元)。

RT-Thread Smart的框架

RT-Thread Smart 框架图:

在整体系统中,运行状态被分离成内核态和用戶态,内核中只包含基础性的服务

  • 进程管理(及多线程调度);
  • 文件系统接口( DFS );
  • BSD socket 接口( SAL/socket );
  • 设备驱动框架接口;
  • 可选的设备驱动(如 UART , GPIO , IIC 等);

如下图:

而在用戶态中,也包括了一些具体的实现,例如文件系统的实现,网络协议栈的实现等:

  • 具体的文件系统实现,例如 FAT 文件系统 elmFATKit ;
  • 具体的 TCP/IP 网络协议栈实现,例如 lwIP 轻型网络协议栈 lwIPKit ;
  • 图形用戶界面( GUI )实现 - PersimKit ;
  • 音频流媒体播放器服务 - AudioKit ;
  • 以及一些用戶态驱动: USB 、 LCD 等驱动;

RT-Thread Smart的工程

目前RTT还没将内核源码开源,不过据RTT的老大说,RT-Thread Smart的内核源码后续将开源。目前的内核是官方编译好的镜像。目前内测版本,还没开源,如果大家想尝试,敬请期待。作者会同步更新最新的版本。其工程目录如下:

代码语言:javascript
复制
rice@rice:~/rtt/rtthread-microkernel-v2$ tree -L 2
.
├── apps                //应用程序
│   ├── hello
│   ├── JsKit
│   ├── ping
│   ├── pong
│   └── thread
├── build
│   ├── hello
│   ├── JsKit
│   ├── ping
│   ├── pong
│   └── thread
├── cconfig.h
├── docs
│   └── rt-thread微内核 树莓派开发环境搭建.pdf
├── kernel            //树莓派微内核镜像
│   ├── kernel7.img
│   └── qemu
├── root
│   └── bin
├── rtconfig.h
├── SConstruct
├── sdk
│   ├── crt
│   ├── libc
│   └── SConscript
├── tools
│   └── env-cli
└── Uconfig

22 directories, 7 files
rice@rice:~/rtt/rtthread-microkernel-v2$ 

默认的工程中提供几个应用程序例子:

目录

说明

hello

hello world例子

ping

ping客户端程序

pong

pong服务器程序,需要ping开启后才能运行

thread

创建线程例子

JsKit

js开发工具

RT-Thread Smart的工程

  • RT-Thread Smart工程:下载地址(待开源
  • 交叉编译链:下载地址(https://launchpad.net/gcc-arm-embedded/+download)
  • 树莓派镜像:下载地址(链接: https://pan.baidu.com/s/1IqFiGdZXmLzWgqHTL3B8Vw 提取码: i6wi )或者从官网下载。
  • scons工具:
代码语言:javascript
复制
$ sudo apt-get install scons
  • pip工具:
代码语言:javascript
复制
$ sudo apt-get install python-pip

工程编译

编译env-cli环境(进入RT-Thread Smart的内核源码):

代码语言:javascript
复制
rice@rice:~/rtt/rtthread-microkernel-v2$ cd tool/env-cli
rice@rice:~/rtt/rtthread-microkernel-v2/tool/env-cli$ make
rice@rice:~/rtt/rtthread-microkernel-v2/tool/env-cli$ cd ../
rice@rice:~/rtt/rtthread-microkernel-v2/tool$ sudo pip install -e env-cli
.....
Successfully installed env-cli
rice@rice:~/rtt/rtthread-microkernel-v2/tool$

修改交叉编译链的GCC路径:

将上面的下载的交叉编译链解压,然后copy到opt目录:

代码语言:javascript
复制
rice@rice:~/rtt$ tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
rice@rice:~/rtt$ rice@rice:~/rtt/rtthread-microkernel-vmv gcc-arm-none-eabi-5_4-2016q3-20160926-linux gcc-arm-none-eabi
rice@rice:~/rtt$ sudo cp gcc-arm-none-eabi /opt

修改工程目录下的.config。

代码语言:javascript
复制
#
# Automatically generated file; DO NOT EDIT.
# Configuration
#
CONFIG_CORTEX_A=y
# CONFIG_CORTEX_M is not set
CONFIG_ARCH="Cortex-A"
CONFIG_GNU_GCC=y
# CONFIG_GNU_GCC_MUSL is not set
# CONFIG_GNU_GCC_NEWLIB is not set
CONFIG_Toolchain="gcc"
CONFIG_EXEC_PATH="/opt/gcc-arm-none-eabi/bin"  #交叉编译链的路径
# CONFIG_CUSTOM_PREFIX is not set
CONFIG_PREFIX="arm-none-eabi-"
CONFIG_TARGET_FILE=""

应用程序编译(目前内核还没开源,所以不用编译,内核镜像已包含在工程目录下,直接使用):

代码语言:javascript
复制
rice@rice:~/rtt/rtthread-microkernel-v2$ env-cli

烧录树莓派镜像

插入sd盘,如果是虚拟机,需要将sd挂载虚拟机上。然后执行命令:

代码语言:javascript
复制
rice@rice:~/rtt$ sudo dd if=2019-09-26-raspbian-buster-full.img of=/dev/sda bs=4M

替换RT-Thread Smart内核镜像

树莓派镜像烧录成功之后,将树莓派sd卡中的kernel7.img微内核版本的kernel录中的kernel7.img替换即可。RT-Thread Smart内核目录(rtthread-microkernel-v2/kernel/kernel7.img),然后将sd插到树莓派上。

连接串口

树莓派gpio14和gpio15作为串口信号线,连接如下:

串口参数:

  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 奇偶校验:无
  • 流控:无

然后插上电源,启动。

显示出RTT的logo就说明成功了。

应用例子示范

上面我们提到,RT-Thread Smart工程中提供了几个例子。直接拿例子来演示。重新将sd插到电脑。然后将hello例子拷贝到sd卡(hello world可执行文件(hello.elf)路径:rtthread-microkernel-v2/root/bin)然后重新将sd卡插到树莓派上。

验证:

个人体验:

听熊老大说目前还在开发,接下来会开源,我还是蛮期待的。初体验的感觉还出错,启动速度挺快的,提供的例程,让我们简单入门。挺不错的,一个好的地方,就是配置的东西从目前来看比较少,不知道后续编译内核的配置复杂不?期待中。后续会根据RT-Thread Smart的版本。多写一些相关文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档