t113开发板双核异构risc-v处理器的使用-基于tina5平台
-
全志T113-i是一款双核Cortex-A7国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Preempt Linux系统。
而其中的RISC-V属于超高能效副核心,标配内存管理单元,可运行RTOS或裸机程序。T113的主核运行Linux(Openwrt或者Preempt Linux)进行人机界面的交互和应用流程,而RISC-V则是后台
英雄,可进行大数据数据采集,或者相关编码器的控制等,降低主核被中断的次数,大大提供了主核的运行效率。那么到底这个双核异构怎么用呢?今天盈鹏飞嵌入式就与你分享。以盈鹏飞嵌入式SBC-T113主板为例(以T113-i为主控的主板),我们先介绍下主板特性:
产品特性
-
采用Allwinner公司Cortex-A7双核T113-i处理器,运行最高速度为1.2GHZ;
-
列表内置64-bit XuanTie C906 RISC-V协处理器;
-
列表支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);
-
列表支持双通道LVDS/MIPI-DSI,分辨率最高1920x1080;
-
列表支持512-1G Bytes DDR3 SDRAM;
-
列表支持SPI NAND存储和启动(默认:256MB;可选128MB)或者EMMC启动(默认:4GB,最大32GB);
-
列表支持四路USB2.0 HOST;
-
列表支持六路RS232通信;
-
列表支持双路CAN BUS通信(隔离);
-
列表支持双路以太网,一路10/100M;一路10/100/1000M;
-
列表稳定的操作系统的支持,可预装Ubuntu20.04/LINUX 5.4 Preempt/Tina5.0;
-
列表标准3.5寸主板, 尺寸为:146*102MM;
SBC-T113产品功能图:
1、RTOS系统概述
1.1、概述
全志Tina Linux SDK中包含了RTOS系统,该系统是基于FreeRTOS内核的软件开发包,包含了系统开发用到的内核源码、驱动、工具、组件与应用程序包。通过Makefile脚本和Kconfig配置文件,使得用户可以通过menuconfig进行个性化裁减,编译出一个可以直接烧写到机器上运行的RTOS系统软件。
1.2、系统框图
RTOS 系统框图如图所示,仅从软件的角度来看,从下至上分为内核层、组件层、应用层三个层次。各层次主要内容如下:
-
Kernel:内核层包括 FreeRTOS核心系统、文件系统、网络系统、BSP驱动等。
-
Component:组件层包括控制台、多媒体、功耗管理、OTA、音频系统、显示系统、图像采集等。
-
APP:应用层包括各种应用 demo。
-
-
2、RTOS SDK目录结构
rtos ├──board #包含各SoC板级配置目录 │└──mr527_e906 #mr527_e906板级配置目录 │└──t113_s3p_c906 #t113_s3p_c906板级配置目录 │└──t113_s4_c906 #t113_s4_c906板级配置目录 │└──t113_s4p_c906 #t113_s4p_c906板级配置目录 │└──XXX #XXX平台板级配置目录 ├──envsetup.sh #SDK环境初始化脚本 ├──lichee │├──dsp #DSP FreeRTOS系统 │├──rtos #C906/E906FreeRTOS系统 │├──rtos components#FreeRTOS公共组件 │└──rtos hal #BSP驱动 └──tools #打包相关工具脚本目录
所使用RTOS SDK目录结构如上所示,主要包括如下几个关键目录:
board:板级配置目录,用于存放芯片方案的配置文件,主要包括系统配置文件sys_config.fex等。
lichee/dsp:存放DSPFreeRTOS系统、组件、应用。
lichee/rtos:存放E906FreeRTOS系统、组件、应用。
lichee/rtos components:公共组件目录,lichee/dsp与lichee/rtos都可以使用该组件。
lichee/rtos hal:BSP驱动目录,用于存放各种驱动代码。对lichee/dsp与lichee/rtos通用。
tools:工具目录,用于存放编译打包相关的脚本、工具等。
下面对lichee/rtos、lichee/rtos hal目录进行详细说明。lichee/dsp目录与lichee/rtos目录类似,此处不做介绍。2.1、lichee/rtos目录
├──arch #处理器架构相关 ├──build #编译临时文件输出目录 ├──components #组件 ├──drivers#驱动 ├──include#头文件 ├──kernel#FreeRTOS内核#方案工程 ├──projects ├──scripts └──tools#工具链
lichee/rtos目录主要包括arch(架构相关)、components(组件)、drivers(驱动)、include(头文件)、kernel(内核)、projects(工程)、toos(工具链)等目录,下面对常用重要目录分别进行介绍。
2.1.1、arch目录
arch目录主要放置跟SoC架构相关的内容,每个SoC单独目录管理,主要包括跟risc v架构相关的ARCH初始化、中断处理、异常处理、内存映射相关功能的实现。
lichee/rtos/arch/ ├──common └──risc v ├──arch.mk ├──c906 ├──common ├──e906 ├──includes ├──Kconfig ├──Makefile ├──sun55iw3p1 └──sun8iw20p1
2.1.2、components目录
components 目录包含 allwinner 和第三方的组件。
lichee/rtos/components/ ├──aw │├──blkpart │├──bluetooth │├──csi │├──devfs │├──healthd │├──...... │├──watchpoint │└──wireless_video ├──common >../../rtos components └──thirdparty ├──common ├──console ├──cplusplus ├──elmfat ├──finsh_cli ├──...... └──vfs
2.1.3、drivers目录
drivers目录包含所需的外设驱动,主要包括各外设控制器驱动的具体实现(hal软连接)以及OSAL层接口(osal)。
lichee/rtos/drivers/ ├──drv ├─ CPUfreq #POSIX头文件 ├──leds ├── uart ├──..... ├── wireless ├─hal ->.../../rtos-hal/ └──osal
2.1.4、include 目录
include 目录统一管理各模块提供的数据结构定义及函数声明。
lichee/rtos/include/ ├── arch # 架构相关头文件 ├── FreeRTOS_POSIX # POSIX头文件 ├── ...... └── vsprintf.h
2.1.5、kernel目录
kernel目录主要包含FreeRTOS的kernel源码,全志实现的系统功能相关代码。
lichee/rtos/kernel/ ├──FreeRTOS orig │└──Source └──Posix
2.1.6 projects 目录
projects目录下的每一个子目录代表一个project,实现main入口,选择不同的project编译出来的bin具有不同功能,每个project有独立的FreeRTOSConfig配置。例如t113-s4,其对应于t113_s4_c906子目录,这个子目录下面根据应用的不同建立不同的应用配置,如下有evb1_auto应用和evb1_auto_fastboot_video应用。
rtos/lichee/rtos/projects/t113_s4_c906/ ├── evb1_auto │ ├── defconfig │ ├── defconfig_org │ ├── freertos.lds.S │ ├── Kconfig │ ├── Makefile │ └── src │ ├── alsa_config.c │ ├── assert.c │ ├── card_default.c │ ├── FreeRTOSConfig.h │ ├── hooks.c │ └── main.c ├── evb1_auto_fastboot_video │ ├── defconfig │ ├── freertos.lds.S │ ├── Kconfig │ ├── Makefile │ └── src │ ├── alsa_config.c │ ├── assert.c │ ├── card_default.c │ ├── FreeRTOSConfig.h │ ├── hooks.c │ └── main.c └── Makefile
2.1.7、tools目录
这个目录主要包含一些预编译好的交叉编译工具链。
xxx@xxx:lichee/rtos/tools$ ls -al total 663248 drwxrwxr-x 3 ping ping 4096 Oct 21 14:28 . drwxrwxr-x 13 ping ping 4096 Oct 21 16:02 .. -rw-rw-r-- 1 ping ping 103333888 Jan 8 2024 gcc-arm-melis-eabi-8-2019-q3-update-linux.tar.bz2 -rw-rw-r-- 1 ping ping 106566166 Jan 8 2024 gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -rwxrwxr-x 1 ping ping 137020992 Jan 8 2024 gcc-arm-none-eabi-8-2019-q3-update-win32.zip drwxr-xr-x 9 ping ping 4096 Oct 21 14:29 riscv64-elf-x86_64-20201104 -rwxrwxr-x 1 ping ping 164604965 Jan 8 2024 riscv64-elf-x86_64-20201104.tar.gz -rwxrwxr-x 1 ping ping 167614189 Jan 8 2024 Xuantie-900-gcc-elf-newlib-mingw-V2.6.1-20220906.tar.gz xxx@xxx:lichee/rtos/tools$
目前risc v基于GCC8.4.0的交叉编译器。
xxx@xxx:lichee/rtos/tools$./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc -v Using built-in specs. COLLECT_GCC=./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc COLLECT_LTO_WRAPPER=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/../libexec/gcc/riscv64-unknown-elf/8.4.0/lto-wrapper Target: riscv64-unknown-elf Configured with: /ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/build/../source/riscv/riscv-gcc/configure --target=riscv64-unknown-elf --with-mpc=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-mpfr=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-gmp=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --prefix=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --enable-libgcctf --with-newlib --with-sysroot=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../source/riscv/riscv-gcc --with-pkgversion='T-HEAD RISCV Tools V1.10.2 B20201104' --enable-multilib --with-abi=lp64d --with-arch=rv64gcxthead 'CFLAGS_FOR_TARGET=-Os -mcmodel=medany' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medany' CC=gcc CXX=g++ Thread model: single gcc version 8.4.0 (T-HEAD RISCV Tools V1.10.2 B20201104)
2.2、lichee/rtos hal目录
lichee/rtos hal目录为BSP驱动目录,用于存放各种驱动代码。lichee/rtos/drivers目录下的rtos hal子目录软链接到该目录,下面对该目录进行介绍。
lichee/rtos hal ├──hal #BSP驱动代码 ├──include #驱动相关头文件 └──tools
lichee/rtos hal目录主要包括hal(BSP驱动代码)、include(驱动相关头文件)等目录,下面分别对其进行介绍。
2.2.1、hal目录
hal目录主要包含各外设驱动代码以及驱动测试代码,source子目录为驱动代码,test子目录为驱动测试代码
lichee/rtos hal/hal ├──Makefile ├──source │├──ccmu │├──gpio │├──...... │├──uart │└──watchdog └──test ├──ccmu ├──gpio ├──...... ├──uart └──watchdog
2.2.2、include目录
include目录主要包含驱动相关头文件以及系统相关接口头文件。
lichee/rtos hal/include ├──hal │├──aw alsa lib │├──aw_common.h │├──...... │├──sunxi_hal_usb.h │├──sunxi_hal_watchdog.h │└──video └──osal ├──hal_atomic.h ├──hal_cache.h ├──...... ├──hal_waitqueue.h └──hal_workqueue.h
-
3、RTOS编译开发说明
3.1、RTOS SDK与TinaLinux开发环境
RTOS SDK相关代码已集成到Tina Linux开发环境,Tina Linux开发环境下的rtos子目录即为RTOS开发环境。
├──brandy ├──bsp ├──build ├──buildroot ├──build.sh >build/top_build.sh ├──device ├──kernel ├──openwrt ├──out ├──platform ├──prebuilt ├──rtos #RTOS环境 ├──tee_kit ├──test └──tools
3.2、RTOS编译
Tina集成了RTOS的编译、打包功能,而且适用于openwrt、buildroot等文件系统。这里以T113 S4平台作为例子进行阐述。
3.2.1、关联RTOS方案
TinaLinux的SDK中,SDK根目录下有device目录,该目录存放的是不同处理器平台及主板的配置,以SBC-T113S4_NAND为例,它是以T113_S4为主控制器的,其配置文件就存放在device/config/chips/t113_s4/configs/sbc_t113s4_nand目录下,那么该主板如何关联RTOS方案呢?
xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/device/config/chips/t113_s4/configs/sbc_t113s4_nand$ tree -l . ├── bin │ ├── amp_dsp0.bin │ └── amp_rv0.bin ├── BoardConfig.mk //关联RTOS项目的关键 ├── board.dts -> linux-5.4/board.dts ├── bsp │ ├── env.cfg │ └── sys_partition.fex ├── buildroot │ ├── BoardConfig.mk │ ├── BoardConfig_nor.mk │ ├── bootlogo.bmp │ ├── env_nor.cfg │ ├── swupdate │ │ ├── env_ab.cfg │ │ ├── sw-description-ab │ │ ├── sw-description-ab-rdiff │ │ ├── sw-description-recovery │ │ ├── sw-description-recovery-sign │ │ ├── sw-subimgs-ab.cfg │ │ ├── sw-subimgs-ab-rdiff.cfg │ │ ├── sw-subimgs-recovery.cfg │ │ ├── sw-subimgs-recovery-secure.cfg │ │ ├── sw-subimgs-recovery-sign.cfg │ │ ├── sys_partition_ab.fex │ │ └── sys_partition_recovery.fex │ ├── sys_partition.fex │ └── sys_partition_nor.fex ├── linux-5.4 │ ├── board_backup.dts │ ├── board.dts │ ├── board_lvds1024x600.dts │ ├── board_lvds1024x768.dts │ ├── board_old.dts │ ├── board_spi4bit_drv30.dts │ ├── board_spi4bit.dts │ ├── board_spi_sbc-t113s_v1p0.dts │ ├── board_tft1024x600.dts │ ├── board_uart3.dts │ ├── board_xr829_sbc-t113s_v1p1.dts │ ├── config-5.4 │ ├── config-5.4-recovery │ ├── config_uart3-5.4 │ ├── env.cfg │ ├── env_uart3.cfg │ └── sys_partition.fex ├── openwrt │ ├── bootlogo.bmp │ ├── sys_partition.fex │ └── sys_partition_nor.fex ├── sys_config.fex ├── sys_config_old.fex ├── sys_config_uart3.fex ├── uboot-board_backup.dts ├── uboot-board.dts ├── uboot-board-lvds-lcd1024x600.dts ├── uboot-board_spi0_1wire.dts ├── uboot-board_spi_sbc-t113s_v1p0.dts ├── uboot-board_spi_sbc-t113s_v1p1.dts └── uboot-board-tft-lcd1024x600.dts
在这些配置文件中有一个文件BoardConfig.mk,它就是关联RTOS应用的关键,这个文件的内容如下:
配置RTOS方案名的关键字段LICHEE_RTOS_PROJECT_NAME:=xxxxx。以我司SBC-T113S主板为例,在BoardConfig.mk中配置的是t113_s4_c906_evb1_auto的RTOS方案。开发者可以通过修改LICHEE_RTOS_PROJECT_NAME字段,更改构建RTOS方案。
先进入Tina的rtos目录,rtos目录的内容如下:├──board ├──envsetup.sh >tools/scripts/source_envsetup.sh ├──lichee ├──out └──tools
执行如下指令进行RTOS的环境配置
source envsetup.sh #配置环境变量
我们看到可以选择的RTOS方案,即是LICHEE_RTOS_PROJECT_NAME字段可以配置的RTOS方案。
last=t113_s4_c906_evb1_auto You're building on Linux Lunch menu... pick a combo: 1. t113_i_c906_evb1_auto 2. t113_s3p_c906_evb1_auto 3. t113_s3p_c906_evb1_auto_fastboot 4. t113_s3p_c906_evb1_auto_fastboot_video 5. t113_s3p_c906_evb1_auto_non_os 6. t113_s3p_c906_example_demo 7. t113_s4_c906_evb1_auto 8. t113_s4_c906_evb1_auto_fastboot_video 9. t113_s4p_c906_evb1_auto Which would you like? [Default t113_s4_c906_evb1_auto]:
从以上RTOS的方案中,可以看到有支持t113-i处理器的,也有支持t113_s4处理器的,当前默认是t113_s4_c906_evb1_auto,这个是基于t113_s4处理器的方案。另外,这个方案是可以添加的,如果主板是基于T113I的,可以把t113_i_c906_evb1_auto作为蓝本增加自己方案,如果主板是基于T113-S4的,可以把t113_i_c906_evb1_auto作为蓝本增加自己方案。如何添加方案请看本手册的第六章节。
3.2.2、单独编译RTOS方案
执行lunch_rtos进行编译方案选择后,可以通过mrtos_menuconfig进行方案的配置,配置完成后即可通过m或者mrtos指令进行RTOS的编译。
xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ lunch_rtos last=t113_s4_c906_evb1_auto You're building on Linux Lunch menu... pick a combo: 1. t113_i_c906_evb1_auto 2. t113_s3p_c906_evb1_auto 3. t113_s3p_c906_evb1_auto_fastboot 4. t113_s3p_c906_evb1_auto_fastboot_video 5. t113_s3p_c906_evb1_auto_non_os 6. t113_s3p_c906_example_demo 7. t113_s4_c906_evb1_auto 8. t113_s4_c906_evb1_auto_fastboot_video 9. t113_s4p_c906_evb1_auto Which would you like? [Default t113_s4_c906_evb1_auto]: 7 select=7... t113_s4_c906/evb1_auto '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/.config' ============================================ RTOS_BUILD_TOP=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos RTOS_TARGET_ARCH=riscv RTOS_TARGET_CHIP=sun8iw20p1 RTOS_TARGET_DEVICE=t113_s4_c906 RTOS_PROJECT_NAME=t113_s4_c906_evb1_auto ============================================ Run mrtos_menuconfig to config rtos Run m or mrtos to build rtos
以上提示我们通过mrtos_menuconfig可以进行应用的配置,执行结果如下:
从配置情况看,和Linux的内核配置比较接近,也是可以配置各种驱动外设,见下图:
T113系列拥有双核Cortex-A7核心,也拥有RV64-C906核心,这两个核心使用的外设是共通的,因此选择C906选择外设的时候,要避开Cortex-A7已经使用的外设。例如:Cortex-A7核心已经把PE2/PE3这两个GPIO作为UART来使用,C906就不能再使用PE2/PE3。
另外,这里要明确的一点是:每个RTOS应用也是有对应的配置文件的,对于t113_s4_c906_evb1_auto这个项目的配置文件在如下目录:TinaSDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig
配置完成后即可执行m或者mrtos执行进行编译,指令执行结果如下:
xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ mrtos build rtos ... ===There isn't tina environment.=== Note: will use shell command origin rather than the functon. Dark Builder Version (1.6.0 - BiCEP2 (Gravitational Waves)) *[CC] [SCRIPT] build/t113_s4_c906_evb1_auto/img/sys_config.fex [CONF] [Tina-RT-Builder] .dbuild/..//include/generated/t113_s4_c906_evb1_aut o/autoconf.h [LDS] [Linker] projects/t113_s4_c906/evb1_auto/freertos.lds CC build/t113_s4_c906_evb1_auto/arch/common/version.o LD build/t113_s4_c906_evb1_auto/arch/common/obj-in.o LD build/t113_s4_c906_evb1_auto/arch/obj-in.o [LD] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.elf if [ -n /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/bu ild/t113_s4_c906_evb1_auto/img/ ]; then mkdir -p /home/ping/workspace/t113_tina 5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img; fi Memory region Used Size Region Size %age Used RAM: 214096 B 6 MB 3.40% *[SYMS] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.syms *[IMAGE] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.bin text data bss dec hex filename 134576 69048 10472 214096 34450 build/t113_s4_c906_evb1_auto/img/rt_syst em.elf copying /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/bu ild/t113_s4_c906_evb1_auto/img/rt_system.bin to /home/ping/workspace/t113_tina5. 0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/freertos.fex #### make completed successfully '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t11 3_s4_c906_evb1_auto/img/rt_system.bin' -> '/home/ping/workspace/t113_tina5.0/t11 3_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/rtos_riscv_sun8iw20p1.fex' ping@embedall:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$
从以上信息我们得到一些信息,编译出来的固件名字是freertos.fex/rtos_riscv_sun8iw20p1.fex,其实两个固件是一样的。固件是编译出来,但是这个固件如何打包到Tina生成的根文件系统中呢?请看下一章。
3.2.3、在Tina下编译RTOS方案
在TinaSDK根目录中,先选择好整体平台方案,见如下说明:
- buildroot方案
1、首先使用如下命令选择整体平台方案
./build.sh config
2、然后RTOS相关操作命令如下
./build.sh rtos #单独编译RTOS方案 ./build.sh rtos menuconfig #修改RTOS配置文件 ./build.sh rtos clean #清除RTOS编译中间文件
注意:执行./build.sh不会编译RTOS
- openwrt方案
1、首先使用如下命令选择整体平台方案
source build/envsetup.sh #生效环境变量 lunch #选择openwrt方案
2、执行make会先编译RTOS,再编译Tina
- 快捷命令
在Tina根目录下,执行了source build/envsetup.sh配置环境后,可使用RTOS快捷命令进行RTOS的配置和编译等。
3.3、RTOS固件打包
我们以编译openwrt方案为例,在的编译openwrt的过程中,会首先编译RTOS,然后将生成的镜像文件自动拷贝到对应平台方案中,并且rt_system.elf重名为amp_rv0.bin,见如下信息:
xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1$ make -j32 ===There is tina environment.=== Note: make is the shell functon in envsetup.sh. == action: openwrt_build, action_args: -j32 == ========ACTION List: build_rtos ;======== options : INFO: build rtos ... Setup env done! Run lunch_rtos to select project last=t113_s4_c906_evb1_auto select=t113_s4_c906_evb1_auto... t113_s4_c906/evb1_auto '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/.config' ============================================ RTOS_BUILD_TOP=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos RTOS_TARGET_ARCH=riscv RTOS_TARGET_CHIP=sun8iw20p1 RTOS_TARGET_DEVICE=t113_s4_c906 RTOS_PROJECT_NAME=t113_s4_c906_evb1_auto ============================================ Run mrtos_menuconfig to config rtos Run m or mrtos to build rtos build rtos ... Dark Builder Version (1.6.0 - BiCEP2 (Gravitational Waves)) *[CC] [SCRIPT] build/t113_s4_c906_evb1_auto/img/sys_config.fex [CONF] [Tina-RT-Builder] .dbuild/..//include/generated/t113_s4_c906_evb1_auto/autoconf.h [LDS] [Linker] projects/t113_s4_c906/evb1_auto/freertos.lds CC build/t113_s4_c906_evb1_auto/arch/common/version.o LD build/t113_s4_c906_evb1_auto/arch/common/obj-in.o LD build/t113_s4_c906_evb1_auto/arch/obj-in.o [LD] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.elf if [ -n /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/ ]; then mkdir -p /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img; fi Memory region Used Size Region Size %age Used RAM: 214096 B 6 MB 3.40% *[IMAGE] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.bin *[SYMS] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.syms text data bss dec hex filename 134576 69048 10472 214096 34450 build/t113_s4_c906_evb1_auto/img/rt_system.elf copying /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin to /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/freertos.fex #### make completed successfully '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/rtos_riscv_sun8iw20p1.fex' '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.elf' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/device/config/chips/t113_s4/configs/sbc_t113s4_nand/bin/amp_rv0.bin'
然后在Tina环境中打包,确保RTOS编译固件amp_rv0.bin打包到根文件系统中。
说明:
1)buildroot需要执行./build.sh&&./build.sh pack命令
2)openwrt需要执行make&&pack命令
打包完成后,生产的固件位于tina5.0/out/t113_s4_linux_sbc_t113s4_uart0.img,可以使用PhoenixSuit工具烧录到主板上。3.4、RISC-V核启动
进入主核Linux控制台后,执行如下命令即可完成RV核异构通信框架的初始化:
echo start>/sys/class/remoteproc/remoteproc1/state
注:T113-S4处理器包括了DSP HIFI核心,也包括了RISC-V核心,因此它应该具备remoteproc0/remoteproc1两个节点(这两个节点在内核的DTS中是可配置的,可以删除任何一个节点)。如果两个节点都在,那么remoteproc0节点是DSP核心,remoteproc1节点是RISC-V核心。
3.5、RTOS镜像文件更新
更新RTOS镜像文件的方法有以下两种:
1、Tina Linux环境下,按照RTOS编译、RTOS固件打包步骤重新编译固件,并烧录进开发板,之后再启动RV核。
2、通过adb push将新生成的镜像文件amp_rv0.bin推到/lib/firmware目录下,在Linux控制台依执行如下命令:echo stop>/sys/class/remoteproc/remoteproc1/state #关闭RV。 echo amp_rv0.bin>/sys/class/remoteproc/remoteproc1/firmware echo start>/sys/class/remoteproc/remoteproc1/state #启动RV
-
4、异构双核通信简介
本章节以SBC-T113S4主板为例,SBC-T113S4采用的处理器是T113-S4,该处理器集成了双核Cortex-A7,同时集成了RISC-V核C906,异构双核系统通讯在硬件上使用的是 MSGBOX,在软件层面上使用的是 AMP 与 RPMsg 通讯协议。其中 Cortex-A7 上基于 Linux 标准的 RPMsg 驱动框架,C906基于 OpenAMP 异构通信框架。
4.1、AMP与RPMsg简要介绍
T113-S4所带有的 A7 主核心与 C906 辅助核心是完全不同的两个核心,为了最大限度的发挥他们的性能,协同完成某一任务,所以在不同的核心上面运行的系统也各不相同。这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了 AMP 系统 (Asymmetric Multiprocessing System, 异构多处理系统)。
由于两个核心存在的目的是协同的处理,因此在异构多处理系统中往往会形成 Master - Remote 结构。主核心启动后启动从核心。当两个核心上的系统都启动完成后,他们之间就通过 IPC(Inter Processor Communication)方式进行通信,而 RPMsg 就是 IPC 中的一种。
在AMP系统中,两个核心通过共享内存的方式进行通信。两个核心通过 AMP 中断来传递讯息。内存的管理由主核负责。AMP 系统在每个通信方向上都有两个缓冲区,分别是 USED 和 AVAIL,这个缓冲区可以按照 RPMsg 中消息的格式分成一块一块链接形成一个环。
当主核需要和从核进行通信的时候可以分为四步:
(1)主核先从USED中取得一块内存(Allocate)
(2)将消息按照消息协议填充
(3)将该内存链接到 AVAIL 缓冲区中(Send)
(4)触发中断,通知辅助核有消息处理反之,从核需要和主核通信的时候也类似:
(1)从核先从AVAIL中取得一块内存(Allocate)
(2)将消息按照消息协议填充
(3)将该内存链接到 USED 缓冲区中(Send)
(4)触发中断,通知主核有消息处理。4.2、RPMsg协议
既然 RPMsg 是一种信息交换的协议,与TCP/IP类似,RPMsg 协议也有分层,主要分为三层,分别是传输层、MAC层和物理层。
其中 MAC层 的 VirtIO 是一种I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。 提供了一套上层应用与各 Hypervisor 虚拟化设备之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。
RPMsg 总线上的消息都具有以下结构,包含消息头和数据两个固定的部分,该消息格式的定义位于drivers/rpmsg/virtio_rpmsg_bus.c中,具体定义如下:struct rpmsg_hdr { u32 src; u32 dst; u32 reserved; u16 len; u16 flags; u8 data[]; } __packed;
4.4、RPBuf通信
由于RPMsg不适合大数据通信,全志公司提供了大数据传输的办法-RPBuf。
RPBuf 全志基于 RPMsg 开发的一套通信机制,其实现原理是使用 RPMsg 传输数据的地址,而不是数据的本身,避免了数据的多次拷贝以及每次传输不能大于 496 字节的限制。
rpbuf 中使用名字和长度来唯一标识一个 buffer,故不能创建相同名字的 buffer。
rpbuf 中的 buffer 有 3 个状态:- remote_dummy_buffers:该 buffer 远端已创建,本地未创建
- local_dummy_buffers:该 buffer 本地已创建,远端未创建
- buffers:远端、本地已创建,此时 buffer 才可用 后续章节将介绍如何定制系统并进行RPBuf通信。
4.5、SBC-T113S主板的TinaLinux与Freertos通信
SBC-T113主板运行的是Tina Linux,提供 AMP 与 RPMsg 对接 C906
- Linux remoteproc 管理控制 C906
- RPMsg 与 C906 通讯
4.5.1、C906-FreeRTOS系统
T113-S4的辅助核心 C906 上运行的是FreeRTOS操作系统。其独立于 A7 主核心中的 Linux 系统,可以独立运行。在FreeRTOS中,提供 OpenAMP 软件框架来与 A7 Linux 系统进行通信。
-
提供了处理器的生命周期管理(LCM,Life Cycle Management),与 Linux 的remoteproc 兼容
-
提供了处理器间的消息传输机制,与 Linux 的 RPMsg 兼容
4.5.2、异构系统启动流程
首先,由芯片内部的 BROM 寻找启动介质,在 SBC-T113主板上便是 eMMC 储存器(也有从NAND启动的版本)。找到启动介质后会运行其中的 BOOT0 代码。BOOT0 会在 A7 主核心中运行Linux 系统,也会在C906核心中运行RTOS系统。启动的两个系统是独立运行的。
-
5、TinaLinux异构双核通信的具体实现:
本章节以SBC-T113S4主板的TinaLinux为例,介绍异构双核通信的实现。该方法也同样适用于T113i平台。
本章节主要涉及到Tina Linux内核的配置、Tina Linux文件系统(openwrt)的配置、Freertos的配置。其中Tina Linux内核的配置包括设备树的配置及相关内核驱动及协议的配置;Tina Linux文件系统(openwrt)的配置包括异构双核通信测试程序和小核C906终端的配置;Freertos的配置包括通信协议的配置。5.1、TinaLinux的配置
5.1.1、Tina内核设备树配置在Tina根目录下,进入设备树目录(根据不同的处理器,进入不同的处理器目录),如下演示的是以SBC-T113S主板为例,该主板的主处理器是T113-S4,其配置文件都放在device/config/chips/t113_s4/configs/sbc_t113s4_nand/的目录下,内核的设备树则放在device/config/chips/t113_s4/configs/sbc_t113s4_nand/linux-5.4目录:
xxx@xxx:~/workspaces/t113_tina5.0$ cd device/config/chips/t113_s4/configs/sbc_t113s4_nand/
编辑设备树
xxx@xxx:~/workspaces/t113_tina5.0/device/config/chips t113_s4/configs/sbc_t113s4_nand/linux-5.4 $ vi board.dts
在设备树文件中找到C906相关的设备树节点,设备树默认设置为:
reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; /* c906 */ c906_ddr: c906_ddr@42300000 { reg = <0x0 0x42300000 0x0 0x00600000>; no-map; }; /* * The name should be "vdev%dbuffer". * Its size should be not less than * RPMSG_BUF_SIZE * (num of buffers in a vring) * 2 * = 512 * (num of buffers in a vring) * 2 */ rv_vdev0buffer: vdev0buffer@42900000 { compatible = "shared-dma-pool"; reg = <0x0 0x42900000 0x0 0x40000>; no-map; }; /* * The name should be "vdev%dvring%d". * The size of each should be not less than * PAGE_ALIGN(vring_size(num, align)) * = PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num) * * (Please refer to the vring layout in include/uapi/linux/virtio_ring.h) */ rv_vdev0vring0: vdev0vring0@42940000 { reg = <0x0 0x42940000 0x0 0x2000>; no-map; }; rv_vdev0vring1: vdev0vring1@42942000 { reg = <0x0 0x42942000 0x0 0x2000>; no-map; }; /* dsp0 */ dsp0ddr: dsp0ddr@42000000 { reg = <0x0 0x42000000 0x0 0x00100000>; no-map; }; dsp0_rpbuf_reserved: dsp0_rpbuf@42244000 { compatible = "shared-dma-pool"; no-map; reg = <0x0 0x42244000 0x0 0x8000>; }; /* * The name should be "vdev%dbuffer". * Its size should be not less than * RPMSG_BUF_SIZE * (num of buffers in a vring) * 2 * = 512 * (num of buffers in a vring) * 2 */ vdev0buffer: vdev0buffer@42200000 { compatible = "shared-dma-pool"; reg = <0x0 0x42200000 0x0 0x40000>; no-map; }; /* * The name should be "vdev%dvring%d". * The size of each should be not less than * PAGE_ALIGN(vring_size(num, align)) * = PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num) * * (Please refer to the vring layout in include/uapi/linux/virtio_ring.h) */ vdev0vring0: vdev0vring0@42240000 { reg = <0x0 0x42240000 0x0 0x2000>; no-map; }; vdev0vring1: vdev0vring1@42242000 { reg = <0x0 0x42242000 0x0 0x2000>; no-map; }; /* * dsp ram addr */ dsp0dram: dsp0dram@400000 { reg = <0x0 0x400000 0x0 0x10000>; no-map; }; dsp0iram0: dsp0iram0@420000 { reg = <0x0 0x420000 0x0 0x8000>; no-map; }; dsp0iram1: dsp0iram1@440000 { reg = <0x0 0x440000 0x0 0x8000>; no-map; }; }; mailbox_heartbeat: mailbox_heartbeat@0 { compatible = "mailbox-heartbeat"; rproc-np = <&c906_rproc>; mboxes = <&msgbox 6>, <&msgbox 7>; mbox-names = "tx", "rx"; status = "okay"; }; dsp0_rproc: dsp_rproc@0 { compatible = "allwinner,hifi4-rproc", "simple-bus"; clock-frequency = <600000000>; clocks = <&ccu CLK_PLL_PERIPH0_2X>, <&ccu CLK_DSP>, <&ccu CLK_BUS_DSP_CFG>, <&r_ccu CLK_R_AHB>; clock-names = "pll", "mod", "cfg", "ahbs"; resets = <&ccu RST_BUS_DSP>, <&ccu RST_BUS_DSP_CFG>, <&ccu RST_BUS_DSP_DBG>, <&ccu RST_BUS_MSGBOX1>; reset-names = "mod-rst", "cfg-rst", "dbg-rst", "msg-rst"; reg = <0x0 0x03000008 0x0 0x04>, <0x0 0x01700000 0x0 0x40>; reg-names = "sram-for-cpux", "hifi4-cfg"; mboxes = <&msgbox 0>; mbox-names = "arm-kick"; memory-region = <&dsp0ddr>, <&vdev0buffer>, <&vdev0vring0>, <&vdev0vring1>, <&dsp0dram>, <&dsp0iram0>, <&dsp0iram1>; memory-mappings = /* < DA len PA > */ /* local SRAM via external bus */ < 0x28000 0x20000 0x28000 >, /* local SRAM via internal bus */ < 0x400000 0x10000 0x400000 >, < 0x420000 0x8000 0x420000 >, < 0x440000 0x8000 0x440000 >, /* DDR front 256MB */ < 0x10000000 0x10000000 0x40000000 >, /* local SRAM via internal bus */ < 0x20028000 0x10000 0x400000 >, < 0x20038000 0x8000 0x420000 >, < 0x20040000 0x8000 0x440000 >, /* DDR front 256MB */ < 0x30000000 0x10000000 0x40000000 >, /* DDR front 1GB */ < 0x40000000 0x40000000 0x40000000 >, /* DDR front 1GB */ < 0x80000000 0x40000000 0x40000000 >, /* DDR front 1GB */ < 0xC0000000 0x40000000 0x40000000 >; id = <0>; status = "okay"; }; rpbuf_controller0: rpbuf_controller@0 { compatible = "allwinner,rpbuf-controller"; remoteproc = <&dsp0_rproc>; ctrl_id = <0>; /* index of /dev/rpbuf_ctrl */ //iommus = <&mmu_aw 5 1>; memory-region = <&dsp0_rpbuf_reserved>; status = "okay"; }; rpbuf_sample: rpbuf_sample@0 { compatible = "allwinner,rpbuf-sample"; rpbuf = <&rpbuf_controller0>; status = "okay"; }; c906_rproc: c906_rproc@0 { compatible = "allwinner,c906-rproc"; clock-frequency = <800000000>; clocks = <&ccu CLK_PLL_PERIPH0_800M>, <&ccu CLK_RISCV>, <&ccu CLK_BUS_RISCV_CFG>, <&ccu CLK_RISCV_RST>, <&ccu CLK_BUS_RISCV>; clock-names = "pll", "mod", "cfg", "riscv-rst", "riscv-gate"; resets = <&ccu RST_BUS_RISCV_CFG>, <&ccu RST_BUS_MSGBOX2>; reset-names = "cfg-rst", "msg-rst"; memory-region = <&c906_ddr>, <&rv_vdev0buffer>, <&rv_vdev0vring0>, <&rv_vdev0vring1>; reg = <0x0 0x06010000 0x0 0x1000>; reg-names = "c906-cfg"; mboxes = <&msgbox 4>; mbox-names = "arm-kick"; memory-mappings = /* DA len PA */ /* DDR for c906 */ < 0x40000000 0x10000000 0x40000000 >; firmware-name = "amp_rv0.bin"; status = "okay"; };
SBC-T113S主板暂时使用uart3打印C906小核的打印信息(可以分配其他串口作为C906的终端,只要大核和小核的分配不冲突即可),为防止Tina内核抢占uart3,所以务必禁用uart3节点。
&uart3 { pinctrl-names = "default", "sleep"; pinctrl-0 = <&uart3_pins_a>; pinctrl-1 = <&uart3_pins_b>; status = "disabled"; };
5.1.2、Tina内核配置
在Tina根目录下,执行make kernel_menuconfig,例如:
xxx@xxx:~/workspaces/t113_tina5.0$ make kernel_menuconfig
- 使能硬件支持
进入内核配置界面后,进入Device Drivers 目录,选中Mailbox Hardware Support:
选中后进入Mailbox Hardware Support选项中,选中Allwinner Mailbox support:
- 使能RPMsg驱动
进入如下目录中
→ Device Drivers
→ Rpmsg drivers
选中如下配置
<> allwinnertech rpmsg hearbeat driver
<> allwinner rpmsg tty driver
<> sunxi rpmsg ctrl driver
<> Virtio RPMSG bus driver
选中完成后如下图所示:
- 使能RPBuf驱动
进入如下目录中
→ Device Drivers
→ Rpbuf drivers
-- Rpbuf device interface
<> Rpmsg-based Rpbuf service driver
<> Allwinner Rpbuf controller driver
<> Allwinner Rpbuf sample driver
注:
1)Allwinner Rpbuf sample driver只是内核层的一个demo程序,可以不选。
2)如果异构双核不进行大数据传输,RPBuf驱动可以不选。
选中完成后如下图所示:
- 使能共享内存驱动
进入如下目录中
→ Device Drivers
→ Remoteproc drivers
选中如下配置
<> SUNXI remote processor support --->
<>Allwinner remoteproc support
<>Allwinner remoteproc hifi4 boot //控制hifi4 dsp小核
<>Allwinner remoteproc c906 boot ////控制c906小核
如下图所示:修改完成后,保存内核配置并退出。
5.1.3、Tina文件系统配置(Openwrt)
配置中增加了amp_shell,这个是C906的控制台。另外也增加了rpbuf和rpmsg的演示程序,便于后续测试验证。
5.1.4、编译Tina新固件
在Tina根目录下,输入mkernel指令编译刚刚选中的内核驱动,编译完成后,输入pack,打包生成新镜像(此时RTOS的固件并没有进行更新),例如:
xxx@xxx:~/workspaces/t113_tina5.0$ mkernel ... xxx@xxx:~/workspaces/t113_tina5.0$ pack ...
如果需要将RTOS更新一并打包到固件,只要执行make –j32(32表示计算机处理器的线程数,根据具体计算机而定),编译结束后执行pack指令将生成的t113_s4_linux_sbc_t113s4_xxx.img(以SBC-T113S4主板为例)文件拷贝到Windows主机端,此时Tina的固件里面已经包含了新配置的RTOS。
5.2、C906 FreeRTOS内核配置及应用
麻雀虽小,一应俱全!FreeRTOS是一个实时的微型操作系统,它和大多数操作系统都一样,都具备内核和文件系统两个部分,内核重点是任务调度和文件系统管理等,文件系统则集成部分现成的指令和相关应用库并方便启动应用(APP)。另外,FreeRTOS还可以配置终端,刚刚说的指令,就是在终端里面执行的。有了调试终端给FreeRTOS应用调试带来了很大的方便。以下将如何配置FreeRTOS终端、如何配置FreeRTOS驱动组件、如何配置FreeRTOS异构通信演示程序等进行说明。
5.2.1、修改C906链接脚本
C906的FreeRTOS是有运行地址的,该运行地址在Tina内核的DTS中有明确,在RTOS对应的项目中也必须一致。以t113_s4_c906_evb1_auto项目为例,这里说的项目该项目涉及的相关代码核配置信息在SDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto中,该目录中有如下文件:
xxx@xxx:~/workspace/t113_tina5.0/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto$ tree -l . ├── defconfig ├── defconfig_org ├── freertos.lds.S ├── Kconfig ├── Makefile └── src ├── alsa_config.c ├── assert.c ├── card_default.c ├── FreeRTOSConfig.h ├── hooks.c └── main.c
找到freertos.lds.S文件,该文件保存有C906小核的链接信息。
修改freertos.lds.S,找到MEMORY节点,确认起始地址为0x42300000,长度为0x00600000。此参数需要和Tina设备树中的C906内存参数一致,查看kernel.lds 中MEMORY节点参数为:/* Linker script to configure memory regions. */ MEMORY { RAM (rwx) : ORIGIN = CONFIG_ARCH_START_ADDRESS, LENGTH = CONFIG_ARCH_MEM_LENGTH }
CONFIG_ARCH_START_ADDRESS和CONFIG_ARCH_MEM_LENGTH这两个参数在defconfig(和freertos.lds.S同一目录)中,查看defconfig内容如下:
# # Architecture Options # # CONFIG_ARCH_ARM is not set CONFIG_ARCH_RISCV=y CONFIG_ARCH_START_ADDRESS=0x42300000 CONFIG_ARCH_MEM_LENGTH=0x600000 CONFIG_LITTLE_ENDIAN=y CONFIG_BITS_PER_LONG=64 # CONFIG_CACHE_ALIGN_CHECK is not set CONFIG_TOOLCHAIN_FLOAT_HARD=y CONFIG_PANIC_CLI=y CONFIG_PANIC_CLI_PWD=y CONFIG_IMG_VERSION_MESSAGE=y
确认和Tina Linux内核的dts配置一致。
Tina Linux内核的dts的配置如下:/* c906 */ c906_ddr: c906_ddr@42300000 { reg = <0x0 0x42300000 0x0 0x00600000>; no-map; };
5.2.2、RTOS终端使用uart3
在RTOS定制中,修改引脚分配也是通过修改sys_config.fex来完成的,以t113_s4_c906_evb1_auto项目为例,该文件在在SDK所在目录/rtos/board/t113_s4_c906/evb1_auto/configs目录下。
通过查询数据手册,查看引脚复用功能,假如我们使用PE8和PE9作为uart3作为终端串口:修改uart3节点作为终端串口:
[uart_para] uart_debug_port = 3 uart_debug_tx = port:PE08<5><1><default><default> uart_debug_rx = port:PE09<5><1><default><default>
5.3、修改RTOS相关组件的配置并编译
进入SDK所在目录/rtos/,执行source envsetup.sh,单独开起RTOS的编译环境。
然后按照3.2.2章节进入RTOS方案的选择和配置,执行配置指令mrtos_menuconfig,
进入后选中如下配置:→ Drivers Options → soc related device drviers → UART Decives [*] support uart3 device [3] cli uart port number
进入如下目录,选中[*] enable sysconfig,启用读取解析 sys_config.fex 功能
→ Drivers Options → soc related device drivers → Common Option [*] enable sysconfig
分别进入如下界面,选择对应的rpmsg/rpbuf/messagebox驱动,这些驱动与Tina Linux中的驱动对应。
进入如下界面,选中Freertos终端相关配置
[] Multi Console Support
[] Uart Multi Console Support
Uart Multi Console As Main Console
[] Rpmsg Multi Console Support
[] Rpmsg Multi Console Enable Cache Cmd注:Rpmsg Multi Console Support这个配置是和Tina Linux中的amp_shell控制台对应。
本次演示主要为了演示异构双核通信,配置基本完成。如果用户有其他应用需求,用户可以根据自己的需求进行配置。保存配置退出后,接下来进行编译。
ping@embedall:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ m build rtos ... ===There isn't tina environment.=== Note: will use shell command origin rather than the functon. Dark Builder Version (1.6.0 - BiCEP2 (Gravitational Waves)) *[CC] [SCRIPT] build/t113_s4_c906_evb1_auto/img/sys_config.fex [LDS] [Linker] projects/t113_s4_c906/evb1_auto/freertos.lds CC build/t113_s4_c906_evb1_auto/arch/common/common.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/common/exception.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/common/clocksource.o AS build/t113_s4_c906_evb1_auto/arch/common/sys_config.o CC build/t113_s4_c906_evb1_auto/arch/common/version.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/sun8iw20p1/sun8i.o AS build/t113_s4_c906_evb1_auto/arch/risc-v/c906/head_s.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/plic.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/cache.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/spinlock.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/clic.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/platform/platform_sun8iw20.o CC build/t113_s4_c906_evb1_auto/arch/risc-v/c906/interrupt.o CC build/t113_s4_c906_evb1_auto/components/thirdparty/console/FreeRTOS_CLI.o CC build/t113_s4_c906_evb1_auto/components/common/thirdparty/md5/md5.o …… LD build/t113_s4_c906_evb1_auto/components/common/thirdparty/openamp/open-amp/obj-in.o LD build/t113_s4_c906_evb1_auto/components/common/thirdparty/openamp/obj-in.o LD build/t113_s4_c906_evb1_auto/components/common/thirdparty/obj-in.o LD build/t113_s4_c906_evb1_auto/components/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/ccmu/sunxi-ng/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/ccmu/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/twi/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/obj-in.o LD build/t113_s4_c906_evb1_auto/drivers/obj-in.o LD build/t113_s4_c906_evb1_auto/kernel/FreeRTOS-orig/obj-in.o LD build/t113_s4_c906_evb1_auto/kernel/obj-in.o [LD] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.elf if [ -n /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/ ]; then mkdir -p /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img; fi Memory region Used Size Region Size %age Used RAM: 214096 B 6 MB 3.40% *[IMAGE] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.bin *[SYMS] [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.syms text data bss dec hex filename 134576 69048 10472 214096 34450 build/t113_s4_c906_evb1_auto/img/rt_system.elf copying /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin to /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/freertos.fex #### make completed successfully '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/rtos_riscv_sun8iw20p1.f
编译完成后会在SDK目录下的/rtos/board/t113_s4_c906/evb1_auto/bin目录生成rtos_riscv_sun8iw20p1.fex和freertos.fex,这两个文件是一样的。
5.4、核对所选FreeRTOS组件
配置FreeRTOS组件是为了完成FreeRTOS APP的开发。本次的APP要完成的是异构通信,我们查看t113_s4_c906_evb1_auto项目代码了解其运行过程。
t113_s4_c906_evb1_auto项目的相关代码核配置信息在SDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto中,该目录中有如下文件:xxx@xxx:~/workspace/t113_tina5.0/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto$ tree -l . ├── defconfig ├── defconfig_org ├── freertos.lds.S ├── Kconfig ├── Makefile └── src ├── alsa_config.c ├── assert.c ├── card_default.c ├── FreeRTOSConfig.h ├── hooks.c └── main.c
重点查看main.c文件,该文件内容如下:
#include <stdio.h> #include <stdint.h> #include <string.h> #include <unistd.h> #include "interrupt.h" #include <portmacro.h> #include "FreeRTOS.h" #include "task.h" #include <openamp/sunxi_helper/openamp.h> #include <console.h> #ifdef CONFIG_DRIVERS_MSGBOX #include <hal_msgbox.h> #endif #ifdef CONFIG_COMPONENTS_AW_DEVFS #include <devfs.h> #endif #ifdef CONFIG_COMPONENTS_OPENAMP #include <openamp/sunxi_helper/rpmsg_master.h> extern int openamp_init(void); extern int rpbuf_init(void); void openamp_init_thread(void *param) { (void)param; openamp_init(); #ifdef CONFIG_RPMSG_CLIENT rpmsg_ctrldev_create(); #endif #ifdef CONFIG_RPMSG_HEARBEAT extern int rpmsg_heart_init(void); rpmsg_heart_init(); #endif #ifdef CONFIG_MULTI_CONSOLE extern int multiple_console_init(void); multiple_console_init(); #endif #ifdef CONFIG_COMPONENTS_RPBUF extern int rpbuf_init(void); rpbuf_init(); #endif hal_thread_stop(NULL); } #endif void cpu0_app_entry(void *param) { (void)param; #ifdef CONFIG_COMPONENTS_AW_DEVFS devfs_mount("/dev"); #endif #if defined CONFIG_COMPONENTS_OPENAMP void *thread; thread = hal_thread_create(openamp_init_thread, NULL, "amp_init", 8 * 1024, HAL_THREAD_PRIORITY_SYS); if (thread != NULL) hal_thread_start(thread); #endif #ifdef CONFIG_COMPONENT_CLI vCommandConsoleStart(0x1000, HAL_THREAD_PRIORITY_CLI, NULL); #endif vTaskDelete(NULL); }
该程序的入口函数是cpu0_app_entry,该程序通过函数hal_thread_create建立了openamp_init_thread线程。该线程通过openamp_init函数进行了openamp框架的初始化,同时如果选择了rpmsg通信,也进行了rpmsg通信的初始化等。可判定所选的FreeRTOS相关组件可以满足要求。
5.5、主板内使能C906
启动主板,打开串口终端进入主板控制台,将freertos.fex拷贝到/lib/firmware目录下。假设使用ADB功能将文件拷贝到主板的root/目录下root@TinaLinux:~# cd /root/ root@TinaLinux:~# ls freertos.fex
将root目录下的freertos.fex拷贝到/lib/firmware目录下
root@TinaLinux:~# cp freertos.fex /lib/firmware/ root@TinaLinux:~# ls /lib/firmware/ boot_xr829.bin fw_xr829.bin freertos.fex sdd_xr829.bin etf_xr829.bin fw_xr829_bt.bin regulatory.db
拷贝完成后,可以在/lib/firmware目录下看到小核固件。接下来把主板的UART3(在RTOS配置中已经把UART3配置成终端串口)与计算机的串口连接起来,并配置计算机串口波特率为115200,通过计算机串口可以查看小核的相关信息。在Tina Linux主板串口终端输入指令:
root@TinaLinux:~# echo freertos.fex > /sys/class/remoteproc/remoteproc1/firmware
这一步是将freertos.fex固件放在硬件节点firmware 。接下来启动C906固件,指令如下:
root@TinaLinux:~#echo start > /sys/class/remoteproc/remoteproc1/state remoteproc remoteproc1: powering up c906_rproc [ 1489.549950] remoteproc remoteproc1: Booting fw image amp_rv0.bin, size 224392 [ 1489.558282] remoteproc remoteproc1: the version: UTS - Thu, 24 Oct 2024 14:39:36 +0800 [ 1489.558282] Compile Time - 14:39:36 [ 1489.571527] remoteproc1#vdev0buffer: assigned reserved memory node vdev0buffer@42900000 [ 1489.581143] virtio_rpmsg_bus virtio0: rpmsg host is online [ 1489.587680] remoteproc1#vdev0buffer: registered virtio0 (type 7) [ 1489.594617] remoteproc remoteproc1: remote processor c906_rproc is now up root@TinaLinux:/# [ 1489.695824] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_ctrl addr 0x400 [ 1489.715788] virtio_rpmsg_bus virtio0: creating channel rpbuf-service addr 0x401 [ 1489.724381] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 0: virtio0 [ 1489.734036] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 1: remoteproc1#vdev0buffer [ 1489.745237] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 2: remoteproc1 [ 1489.755242] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 3: 6010000.c906_rproc [ 1489.766110] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_heartbeat addr 0x402 使能后可以在UART3上查看RV核的信息: cpu0>help Lists all the registered commands [ help-built-in]--------------Lists all the built-in registered commands [ ts]--------------Displays a table showing the state of each FreeRTOS task [ run-time-stats]--------------Displays a table showing how much processing time each FreeRTOS task has used [ echo-3-parameters]--------------echo-3-parameters <param1> <param2> <param3>: Expects three parameters, echos each in turn [ echo-parameters]--------------echo-parameters <...>: Take variable number of parameters, echos each in turn [ rpbuf_demo]--------------rpbuf demo [ rpbuf_test]--------------rpbuf test demo [ console_dump]--------------dum all cli console info [ exit]--------------Console Exit Command [ msgbox_demo]--------------msgbox demo [ help]--------------List all registered commands [ backtrace]--------------Backtrace Command [ md5sum]--------------Calculate md5sum [ rproc_dump_mapping]--------------rproc dump mapping [ eptdev_send]--------------send data used by rpmsg ept test [ eptdev_close]--------------close rpmsg ept client [ rpmsg_list_epts]--------------list endpoints [ rpmsg_list_listen]--------------list listen [ jtag]--------------init jtag gpio [rpmsg_ctrlde_release]--------------release rpmsg ctrldev [ rpmsg_ctrldev_init]--------------init rpmsg ctrldev [ eptdev_reset]--------------reset rpmsg ctrl [ eptdev_clear]--------------clear rpmsg name group [ eptdev_unbind]--------------unbind rpmsg ept listen [ eptdev_bind]--------------bind rpmsg ept name [ rpmsg_test]--------------rpmsg test [ rpmsg_test_send]--------------rpmsg test send [ rpmsg_test_init]--------------init rpmsg test [ rpmsg_test_extend]--------------rpmsg test with another rproc [ hal_msgbox]--------------hal msgbox cpu0> 查看RV核目前的任务: cpu0>ts Task State Priority Stack # ************************************************ Name State Pri HWM Idx StkCur StkBot CLI X 18 3742 5 0x42363e30 0 x4235c510 IDLE R 0 980 2 0x42348250 0 x423463b0 Tmr Svc B 31 1978 3 0x4234c220 0 x423483c0 ctrldev B 6 4026 8 0x4237d460 0 x42375690 cpu-vring-ipi B 31 8128 7 0x42374780 0 x42364950
-
6、双核通信验证
6.1、C906小核创建通讯节点
在C906小核串口终端建立两个通讯节点用于监听数据,输入eptdev_bind test 2
cpu0 >eptdev_bind test 2
查看监听节点,输入rpmsg_list_listen
cpu0 >rpmsg_list_listen name listen alive test 2 0 console 100 0
6.2、大核创建通讯节点
在Tina Linux下也创建两个通讯监听节点,输入以下两个命令
echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/open echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/open
输入后,如下所示:
root@TinaLinux:/sys/class/rpmsg# echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rp roc@0/open [ 946.762321] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_client addr 0x403 root@TinaLinux:/sys/class/rpmsg# echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rp roc@0/open [ 951.246499] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_client addr 0x404 root@TinaLinux:/sys/class/rpmsg#
在大核TIna Linux中也创建了两个监听节点,输入ls /dev/rpmsg*查看节点信息
root@TinaLinux:~# ls /dev/rpmsg* /dev/rpmsg0 /dev/rpmsg1 /dev/rpmsg_ctrl-c906_rproc@0
创建完成后,可以在C906小核终端中查看自动输出的信息
cpu0 >ctrldev: Rx 44 Bytes client: Rx 8 Bytes rpmsg0: binding send 0x13131411 to rpmsg0 create rpmsg0 client success ctrldev: Rx 44 Bytes client: Rx 8 Bytes rpmsg1: binding send 0x13131411 to rpmsg1 create rpmsg1 client success
6.3、大核传输至C906小核
在Tina Linux下输入
echo "hello Embfly SBC-T113S Board" > /dev/rpmsg0 echo "hello Tina Linux" > /dev/rpmsg1
将Linux Message 0信息通过创建的监听节点传输到C906小核,例如:
root@TinaLinux:~# echo "hello Embfly SBC-T113S Board" > /dev/rpmsg0 root@TinaLinux:~# echo "hello Tina Linux" > /dev/rpmsg1
输入后,打开C906串口终端可以发现,大核传输过来的信息。
rpmsg0: Rx 22 Bytes Data:hello Embfly SBC-T113S Board rpmsg1: Rx 17 Bytes Data:hello Tina Linux
6.4、C906小核传输至大核
在小核端需要使用命令 eptdev_send 用法 eptdev_send <id><data>,这里的id号从0开始,我们设置有两个通信节点,所以id号分别为0和1。
在小核的串口终端输入以下命令:eptdev_send 0 "hello C906" eptdev_send 1 "hello C906"
例如:
cpu0 >eptdev_send 0 "hello C906" will send hello C906 to rpmsg0 cpu0 >eptdev_send 1 "hello C906" will send hello C906 to rpmsg1
输入完成后,小核会将信息分别传入rpmsg0和rpmsg1两个通讯节点。可以在大核Tina Linux端输入
cat /dev/rpmsg0 cat /dev/rpmsg1
可查看从C906小核传输过来的信息。例如:
root@TinaLinux:~# cat /dev/rpmsg0 hello C906 ^C root@TinaLinux:~# cat /dev/rpmsg1 hello C906 ^C
按下Crtl+C结束监听前持续监听该节点。
您可以在小核端多次传输信息到该节点,该节点支持持续接受小核传输的信息,例如:
在C906小核,多次传输信息到监听节点rpmsg0cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0 cpu0 >eptdev_send 0 "hello C906 " will send hello C906 to rpmsg0
在大核端则会一直接收到小核传输过来的信息
root@TinaLinux:~# cat /dev/rpmsg0 hello C906 hello C906 hello C906 hello C906 hello C906 hello C906 hello C906
6.5、关闭相互通讯
要关闭通信,只要在大核Tina Linux端操作节点即可。输入以下命令,echo <id>给到rpmsg的控制关闭节点即可。
echo 0 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close echo 1 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close
例如:
root@TinaLinux:~# echo 0 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close [ 6783.156899] virtio_rpmsg_bus virtio0: destroying channel sunxi,rpmsg_client addr 0x403 root@TinaLinux:~# echo 1 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close root@TinaLinux:~# [ 6784.224740] virtio_rpmsg_bus virtio0: destroying channel sunxi,rpmsg_client addr 0x404
此时C906小核端也会自动关闭通信节点,自动输出以下信息
send 0x13131411 to rpmsg0 rpmsg0: unbinding ctrldev: Rx 44 Bytes send 0x13131411 to rpmsg1 rpmsg1: unbinding
-
7、RTOS新增方案
此处以在t113_s3p_c906 芯片下创建一个example_demo方案为例,帮助客户快速创建定制方案。
第一步:进入rtos/board/t113_s3p_c906目录,创建 example_demo 文件夹(从evb1_auto方案拷贝过来)第二步:进入rtos/lichee/rtos/projects/t113_s3p_c906目录,创建example_demo文件夹(从evb1_auto方案拷贝过来)
第三步:修改rtos/lichee/rtos/projects/Kconfig,新增example_demo配置项(从evb1_auto配置项拷贝过来)
第四步:修改rtos/lichee/rtos/projects/t113_s3p_c906/Makefile,关联了example_demo方案编译
第五步:进入rtos目录,重新配置方案选择,这时候我们发现会多了t113_s3p_c906_example_demo 方案选择,我们重新选择t113_s3p_c906_example_demo 方案
source envsetup.sh lunch_rtos You're building on Linux Lunch menu... pick a combo: 1. t113_i_c906_evb1_auto 2. t113_s3p_c906_evb1_auto 3. t113_s3p_c906_evb1_auto_fastboot 4. t113_s3p_c906_evb1_auto_fastboot_video 5. t113_s3p_c906_evb1_auto_non_os 6. t113_s3p_c906_example_demo 7. t113_s4_c906_evb1_auto 8. t113_s4_c906_evb1_auto_fastboot_video 9. t113_s4p_c906_evb1_auto Which would you like? [Default t113_s3p_c906_example_demo]:
第六步:打开配置defconfig文件,选择正确方案配置项
mrtos_menuconfig
第七步:重新编译
mrtos clean mrtos
-
8、RTOS系统定制开发
此处以在rtos/components/aw目录下创建一个简单的软件包为例,帮助客户了解RTOS环境,为RTOS系统定制开发提供基础。
RTOS环境下的软件包主要由三部分组成,源文件,Makefile,Kconfig,如下:hello_world ├──hello_world.c ├──Kconfig └──Makefile
其中Makefile指定该模块的编译规则,Kconfig则指定该模块的编译配置,从而达到功能可裁剪,镜像文件大小可灵活配置的目的。
示例软件包实现简单的打印字符串“hello,world!”的功能,如下:#include<stdio.h>#include< intcmd_hello_world(void) { printf("hello,world!\n");return0; } FINSH_FUNCTION_EXPORT_CMD(cmd_hello_world,hello_world,helpforhello_world) /*这一行表示将函数cmd_hello_world封装成一个名为hello_world的命令,在RV控制台输入hello_world,即运行cmd_hello_world函数,最后一个参数为帮助信息。此外,头文件需要加上hal_cmd.h.*/
Kconfig的写法如下:
configCOMPONENT_HELLO_WORLD bool"HELLO_WORLDSupport"defaultn defaultn help supporthello_worldcommand.
Kconfile的写法如下:
obj-$(CONFIGCOMPONENTHELLOWORLD)+=hello_world.o
此外,需要在上层目录的Kconfile以及Kconfig中加上该软件包,如下:
上层Makefile obj-$(CONFIGCOMPONENT_HELLO_WORLD)+=helloworld 上层Kconfig sourcecomponents/aw/hello_world/Kconfig
开发完成后,运行mrtos_menuconfig,选中该模块对应的CONFIG后退出,然后mrtos进行编译,这样新增的软件包便可以编译到RTOS镜像文件中了。
将RTOS镜像文件移动到TinaLinux环境下重新编译打包,新生成的固件打包烧录进开发板后,启动RV核,在RV核控制台输入help命令。可以看到有新增的hello_world命令,控制台输入hello_world命令,控制台输出如下:
hello,world!
RTOS下一个简单的软件包便创建成功了。
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号