[RK3568] AMP架构

Rockchip 平台异构多系统 AMP(非对称多核架构)的开发软件包,支持 Linux(Kernel-4.19)、 Baremetal(HAL)、RTOS(RT-Thread) 组合AMP构建形式。


Baremetal(HAL)

Baremetal表示裸机操作系统,HAL是裸机操作系统的一种。

裸机嵌入式系统利用不依赖于操作系统的软件架构,通常,裸机架构事件驱动的,严重依赖状态机,或者使用非常简单的写作任务调度。开发人员需要非常了解底层处理器,因为没有操作系统可以抽象出底层细节。
通常会在资源受限的设备(例如8位,16位和一些32位为控制器)上找到逻辑软件设计。但是资源可用性不是逻辑系统的限制条件。您可以设计一个逻辑架构并为任何嵌入式处理器实现它。不幸的是,处理器越复杂,实现就越复杂。
对于功能有线、使用资源受限的微控制器,具有严格的事实要求以及对可扩展性的最低要求的产品,建议使用逻辑架构实现。

Standalone(Hal)

HAL:Hardware Abstraction Layer,硬件抽象层。

硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。

硬件抽象层大概分为以下几点HAL:
  *上层软件
  *虚拟驱动,设置管理模块
  *内部通信SERVER
  *内部以太网
  *内部通信CLIENT
  *用户接入口
  硬件抽象层接口的定义和代码的设计具有一下特点:
  *硬件抽象层具有与硬件的密切相关性
  *硬件抽象层具有与操作系统无关性
  *接口定义的功能应包含硬件或系统所需硬件支持的所有功能
  *接口定义简单明了,太多接口函数会增加软件模拟的复杂性
  *具有可测性的接口设计有利于系统的软硬件测试和集成
硬件抽象层对用户设备接口的功能模拟主要由虚拟驱动模块完成,包括数据包的收发及协议报文的预处理等工作,为上层协议软件提供标准的API函数, 而对用户设备的接口管理则由上层网络管理软件通地设备管理模块对其进行管理配置及监控,内部通信模块运行于内部队以太网络,协调各模块之间的功能接口,保证从处理单元与主处理单元之间实时可靠的数据传输.

RK的 Standalone 系统是一个简单的、 low-level 的软件层。内部实现基于 Hal ,提供对基本处理器特性 ( Cache、 Interrupts Exceptions) 的访问,以及对基础外设 ( 如标准输入和输出、 UART CAN GMAC I2C ) 的驱动支持。

RTOS(RT-Thread)

RT-ThreadRTOS是一款来自中国的开源实时操作系统,由RT-Thread工作室的专业开发人员开发、维护。

起初RT-Thread是一个实时的内核(全抢占优先级调度,调度器时间复杂度O(1)),但在发展过程中,RT-Thread实时操作系统得到了来自全国嵌入式开发工程师的鼎力支持,为RT-Thread添砖加瓦,现在它不仅仅是一款高效、稳定的实时核心,也是一套面向嵌入式系统的软件平台,覆盖了全抢占的实时操作系统内核,小巧而与底层具体实现无关的文件系统,轻型的TCP/IP协议栈以及轻型的多窗口多线程图形用户界面。

基于RTOS的嵌入式系统通常具有比裸机架构更复杂的时序要求。RTOS抽象出一些低级细节,例如任务调度,同时还为开发人员提供任务同步(信号量和标志)、数据保护(互斥量)和通信(队列)的工具。

RTOS会 给设计增加额外的复杂性,主要是在使用抢占式任务调度时,如果设计者不小心,就有可能导致线程饥饿,创建优先级倒置甚至是多。

RT-Thread 概述

RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统, 基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。 事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、 任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务), 给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的, RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 系统完全开源,3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。 从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。

RT-Thread 架构

近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛, 嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。 物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础, 包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、 通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。

RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是, 它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。

[RK3568] AMP架构_第1张图片

它具体包括以下部分:

内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现, 例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等; libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。

组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、 网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。

RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件, 由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台, 这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择, 这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要, 因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内, 打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:

物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。

脚本语言相关的软件包:目前支持 JerryScript、MicroPython。

多媒体相关的软件包:Openmv、mupdf。

工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。

系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。

外设库与驱动类软件包:RealTek RTL8710BN SDK。

 qemu介绍

qemu是一个开源的模拟硬件的工具,能够模拟多种硬件(ARM A9、stm32xx…等等),开发的时候使用qemu能够避免很多硬件上的问题;

QEMU is a generic and open source machine emulator and virtualizer.

QEMU is a generic and open source machine emulator and virtualizer.

QEMU can be used in several different ways. The most common is for System Emulation, where it provides a virtual model of an entire machine (CPU, memory and emulated devices) to run a guest OS. In this mode the CPU may be fully emulated, or it may work with a hypervisor such as KVM, Xen, Hax or Hypervisor.Framework to allow the guest to run directly on the host CPU.

The second supported way to use QEMU is User Mode Emulation, where QEMU can launch processes compiled for one CPU on another CPU. In this mode the CPU is always emulated.

QEME官方文档

搭建rt-thread和qemu开发环境

简单概括就是几个步骤:

  1. 拉rt-thread的源码
  2. 安装好qemu
  3. 配置rt-thread所需环境,例如Scons等
  4. 最后编译,运行

 开发举例

rt-thread新建2个线程,一个线程优先级高,运行10次后退出,另一个一直运行,优先级低,通过MSH_CMD来触发任务运行

#include 

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

static rt_thread_t tid1 = RT_NULL;

/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;

    while (1)
    {
        /* 线程 1 采用低优先级运行,一直打印计数值 */
        rt_kprintf("thread1 count: %d\n", count ++);
        rt_thread_mdelay(500);
    }
}

ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程 2 入口 */
static void thread2_entry(void *param)
{
    rt_uint32_t count = 0;

    /* 线程 2 拥有较高的优先级,以抢占线程 1 而获得执行 */
    for (count = 0; count < 10 ; count++)
    {
        /* 线程 2 打印计数值 */
        rt_kprintf("thread2 count: %d\n", count);
    }
    rt_kprintf("thread2 exit\n");
    /* 线程 2 运行结束后也将自动被系统脱离 */
}

/* 线程示例 */
int thread_sample(void)
{
    /* 创建线程 1,名称是 thread1,入口是 thread1_entry*/
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);

    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    /* 初始化线程 2,名称是 thread2,入口是 thread2_entry */
    rt_thread_init(&thread2,
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
    rt_thread_startup(&thread2);

    return 0;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(thread_sample, thread sample);

运行结果

[RK3568] AMP架构_第2张图片

 RK3568支持的AMP形式

[RK3568] AMP架构_第3张图片

我们需要使用Linux + RTOS的形式。和RK的工程师确认,我们不需要关注HAL系统,只需要编译kernel和rt-thread系统即可。

RK给的基础代码库,只是一些repo配置,真正的代码还是需要我们将ssh的公钥发给他们,然后再从远端仓库下载,repo仓库的地址为:

[RK3568] AMP架构_第4张图片

执行repo sync命令下载源码时报验证失败:

[RK3568] AMP架构_第5张图片 开发环境搭建

eclipse软件

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

 Eclipse的插件机制是轻型软件组件化架构。在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语言。 已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby,Python、telnet和数据库开发。插件架构能够支持将任意的扩展加入到 现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。

编译RT-THREAD报错

[RK3568] AMP架构_第6张图片

scons命令安装

SCons是一种开源软件构建工具,即下一代构建工具。

将SCons视为经典的Make使用程序的改进的跨平台替代品,它具有类似于autoconf/automake和ccache之类的编译器缓存的集成功能,简而言之,SCons是一种更容易、更可靠和更快的软件构建方式。

SCons的配置文件是Python,使用真正的编程语言来解决构建问题。

 执行如下命令安装 sudo apt-get install scons

[RK3568] AMP架构_第7张图片

python版本报错

[RK3568] AMP架构_第8张图片 通过命令sudo ln -s python2.7 python将python连接到2.7的版本后,报如下错误:

[RK3568] AMP架构_第9张图片

python和scons的版本对应关系。

编译内核

VCCIO2和3选择1.8V,其他都选择3.3V

VCCIO是什么东西?

Kernel-rt和Kernel的区别

Linux内核因开源、免费、功能完善等特性,一直以来在工业领域有非常广泛的应用。但由于Linux内核本身并不是一个实时操作系统,而是一个分时操作系统,因此在很多工业应用场景中并不能满足实时性要求。

Linux-RT则基于普通Linux内核打上了RT PREEMPT补丁,使用Linux内核成为硬实时操作系统。PREEMPT_RT补丁的关键是最小化不可抢占的内核代码量,同时最小化必须更改的代码量,以便提供这种附加的可抢占性。PREEMPT_RT补丁利用Linux内核的SMP功能来添加这种额外的抢占性,而不需要完整的内核重写。

Linux-RT既让普通Linux内核获得了的实时性,又能和普通Linux具有相同的开发生态系统,包括相同工具链、文件系统和安装方法,以及相同的POSIX API等。这让客户的应用程序只需将有实时性要求的任务设置为实时线程,无实现性要求的任务不需要任何改动,客户可用最小的开发工作量,就能使产品满足实时性要求。

Linux-RT满足了客户在产品开发中“既要又要”的刚需——既想让产品满足实时性要求,又想开发简单尽量沿用已有的开发功能,从而实现产品快速上市的期望,因此Linux-RT在工业应用中十分盛行。目前,TI、NXP、Xilinx、全志、瑞芯微等国内外知名工业处理器原厂,已经在其主流工业处理器中适配或正在适配Linux-RT实时操作系统,例如TI AM62x、AM335x等,全志T3、A40i、T113-i等。

RT-linux特点

在Linux 操作系统中,调度算法(基于最大吞吐量准则)、设备驱动、不可中断的系统调用、中断屏蔽以及虚拟内存的使用等因素,都会导致系统在时间上的不可预测性,决定了Linux操作系统不能处理硬实时任务。

RTLinux为避免这些问题,在Linux内核与硬件之间增加了一个虚拟层(通常称作虚拟机),构筑了一个小的、时间上可预测的、与Linux内核分开的实时内核,使得在其中运行的实时进程满足硬实时性。并且RTLinux和Linux构成一个完备的整体,能够完成既包括实时部分又包括非实时部分的复杂任务。

Linux-RT内核增加PREEMPT_RT补丁后,增加了系统响应的确定性和实时性,但是代价是CPU性能降低。

版本编译

版本编译的脚本设置:device/rockchip/rk3568目录:

# Target arch
export RK_ARCH=arm64
# Spl ini defconfig
export RK_SPL_INI_CONFIG=RK3568MINIALL.ini
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=rk3568
# Uboot image format type: fit(flattened image tree)
export RK_UBOOT_FORMAT_TYPE=fit
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=rockchip_linux_defconfig
# Kernel dts
export RK_KERNEL_DTS=rk3568-evb1-ddr4-v10-linux-amp
# boot image type
export RK_BOOT_IMG=boot.img
# kernel image path
export RK_KERNEL_IMG=kernel/arch/arm64/boot/zImage
# kernel image format type: fit(flattened image tree)
export RK_KERNEL_FIT_ITS=boot.its
# parameter for GPT table
export RK_PARAMETER=parameter-rk3568-amp.txt
# target chip
export RK_CHIP=rk3568
# Set rootfs system, include yocto, debian, buildroot, rtthread, hal
export RK_ROOTFS_SYSTEM=buildroot
# Set rootfs type, including ext2 ext4 squashfs
export RK_ROOTFS_TYPE=ext2
# Define package-file
export RK_PACKAGE_FILE=rk356x-package-file
 

你可能感兴趣的:(网络,linux,运维)