导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    T113开发板双核异构risc-v处理器的使用-基于tina5平台

    T Series
    7
    14
    3062
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • H
      hahage168 LV 3 最后由 xiaowenge 编辑

      全志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产品功能图:

      SBC-T113.png

      1、RTOS系统概述

      1.1、概述

      全志Tina Linux SDK中包含了RTOS系统,该系统是基于FreeRTOS内核的软件开发包,包含了系统开发用到的内核源码、驱动、工具、组件与应用程序包。通过Makefile脚本和Kconfig配置文件,使得用户可以通过menuconfig进行个性化裁减,编译出一个可以直接烧写到机器上运行的RTOS系统软件。

      1.2、系统框图

      e28014db-faf1-40b1-8aee-4c82580cf06e-image.png

      RTOS 系统框图如图所示,仅从软件的角度来看,从下至上分为内核层、组件层、应用层三个层次。各层次主要内容如下:

      • Kernel:内核层包括 FreeRTOS核心系统、文件系统、网络系统、BSP驱动等。

      • Component:组件层包括控制台、多媒体、功耗管理、OTA、音频系统、显示系统、图像采集等。

      • APP:应用层包括各种应用 demo。

      1 条回复 最后回复 回复 引用 分享 1
      • H
        hahage168 LV 3 最后由 编辑

        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
        
        
        1 条回复 最后回复 回复 引用 分享 1
        • H
          hahage168 LV 3 最后由 编辑

          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应用的关键,这个文件的内容如下:

          a7612410-1de1-45b4-aa50-de4f5ded5cc2-image.png

          配置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可以进行应用的配置,执行结果如下:

          b6e0e6d4-a8f7-4b86-85fc-9e49dc078c0e-image.png

          从配置情况看,和Linux的内核配置比较接近,也是可以配置各种驱动外设,见下图:

          c84cfc5d-79b7-4699-89a1-1bc1e79d3863-image.png

          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的配置和编译等。

          20b3f0e3-505c-4e2a-b368-f7b0e9e0b542-image.png

          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
          
          
          1 条回复 最后回复 回复 引用 分享 0
          • H
            hahage168 LV 3 最后由 编辑

            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 中断来传递讯息。内存的管理由主核负责。

            cfd10cb6-c6d4-49a5-b2a3-06f4b4409223-image.png

            AMP 系统在每个通信方向上都有两个缓冲区,分别是 USED 和 AVAIL,这个缓冲区可以按照 RPMsg 中消息的格式分成一块一块链接形成一个环。

            d78996c4-f094-4d33-9741-d0ae8a54dd95-image.png

            当主核需要和从核进行通信的时候可以分为四步:
            (1)主核先从USED中取得一块内存(Allocate)
            (2)将消息按照消息协议填充
            (3)将该内存链接到 AVAIL 缓冲区中(Send)
            (4)触发中断,通知辅助核有消息处理

            3eb8ec1f-b7d7-44fb-8641-d553360d6c25-image.png

            反之,从核需要和主核通信的时候也类似:
            (1)从核先从AVAIL中取得一块内存(Allocate)
            (2)将消息按照消息协议填充
            (3)将该内存链接到 USED 缓冲区中(Send)
            (4)触发中断,通知主核有消息处理。

            6ef49569-310c-4568-99be-628bd703d3a3-image.png

            4.2、RPMsg协议

            既然 RPMsg 是一种信息交换的协议,与TCP/IP类似,RPMsg 协议也有分层,主要分为三层,分别是传输层、MAC层和物理层。

            c374526e-80c6-46fb-a981-36db50408a82-image.png

            其中 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 个状态:

            1. remote_dummy_buffers:该 buffer 远端已创建,本地未创建
            2. local_dummy_buffers:该 buffer 本地已创建,远端未创建
            3. buffers:远端、本地已创建,此时 buffer 才可用 后续章节将介绍如何定制系统并进行RPBuf通信。

            4.5、SBC-T113S主板的TinaLinux与Freertos通信

            SBC-T113主板运行的是Tina Linux,提供 AMP 与 RPMsg 对接 C906

            1. Linux remoteproc 管理控制 C906
            2. 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系统。启动的两个系统是独立运行的。

            29df8a39-322f-4f63-b7a3-35ba7d5ddb91-image.png

            1 条回复 最后回复 回复 引用 分享 1
            • H
              hahage168 LV 3 最后由 编辑

              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:

              9140a6ef-b546-41b4-968d-4766c0248be4-image.png

              选中后进入Mailbox Hardware Support选项中,选中Allwinner Mailbox support:

              459fda62-69d7-4b3f-999c-92af0dddccc8-image.png

              • 使能RPMsg驱动
                进入如下目录中
                → Device Drivers
                → Rpmsg drivers
                选中如下配置
                <> allwinnertech rpmsg hearbeat driver
                <
                > allwinner rpmsg tty driver
                <> sunxi rpmsg ctrl driver
                <
                > Virtio RPMSG bus driver
                选中完成后如下图所示:

              5fe56d87-3005-4552-aa3b-5398d3390679-image.png

              • 使能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驱动可以不选。
                选中完成后如下图所示:

              8810021b-226a-4785-b61f-4fc582b3cef5-image.png

              • 使能共享内存驱动

              进入如下目录中
              → Device Drivers
              → Remoteproc drivers
              选中如下配置
              <> SUNXI remote processor support --->
              <
              >Allwinner remoteproc support
              <>Allwinner remoteproc hifi4 boot //控制hifi4 dsp小核
              <
              >Allwinner remoteproc c906 boot ////控制c906小核
              如下图所示:

              07da5097-ed02-4f1e-a62f-b09002e00414-image.png

              修改完成后,保存内核配置并退出。

              5.1.3、Tina文件系统配置(Openwrt)

              配置中增加了amp_shell,这个是C906的控制台。另外也增加了rpbuf和rpmsg的演示程序,便于后续测试验证。

              8a7bfefd-5684-48dc-8f8b-bd56a7c69c54-image.png

              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作为终端串口:

              51d97141-803f-4c54-8324-2a9a0fa12fb8-image.png

              修改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
              
              

              3eae4129-7af5-49ac-801b-03b6b807a05a-image.png

              进入如下目录,选中[*] enable sysconfig,启用读取解析 sys_config.fex 功能

              → Drivers Options
              	→ soc related device drivers
              		→ Common Option
              		[*] enable sysconfig
              
              

              c75c4609-f137-4a3e-a944-1be021dccca6-image.png

              分别进入如下界面,选择对应的rpmsg/rpbuf/messagebox驱动,这些驱动与Tina Linux中的驱动对应。

              22f32ad2-0dd7-4991-99ac-c48d8f1d31e9-image.png

              720ad873-a333-457f-be05-b4754dba8a71-image.png

              c593e5d8-7f5e-4409-8fad-253e08086cc9-image.png

              c6cb74ef-097e-48c1-9968-bdc9f25fb65b-image.png

              进入如下界面,选中Freertos终端相关配置
              [] Multi Console Support
              [
              ] Uart Multi Console Support

              Uart Multi Console As Main Console

              [] Rpmsg Multi Console Support
              [
              ] Rpmsg Multi Console Enable Cache Cmd

              0285106f-cb98-47ab-9887-f331d1814fe5-image.png

              注: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
              
              
              1 条回复 最后回复 回复 引用 分享 0
              • H
                hahage168 LV 3 最后由 编辑

                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小核,多次传输信息到监听节点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
                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
                
                
                1 条回复 最后回复 回复 引用 分享 0
                • H
                  hahage168 LV 3 最后由 编辑

                  7、RTOS新增方案

                  此处以在t113_s3p_c906 芯片下创建一个example_demo方案为例,帮助客户快速创建定制方案。
                  第一步:进入rtos/board/t113_s3p_c906目录,创建 example_demo 文件夹(从evb1_auto方案拷贝过来)

                  7fc09581-42af-4d90-adfd-6ee0f6a87990-image.png

                  第二步:进入rtos/lichee/rtos/projects/t113_s3p_c906目录,创建example_demo文件夹(从evb1_auto方案拷贝过来)

                  be496c61-e43e-4d69-839c-dd4557ef6f1e-image.png

                  第三步:修改rtos/lichee/rtos/projects/Kconfig,新增example_demo配置项(从evb1_auto配置项拷贝过来)

                  45d5e227-21c1-48cd-9022-0c7be628398a-image.png

                  第四步:修改rtos/lichee/rtos/projects/t113_s3p_c906/Makefile,关联了example_demo方案编译

                  228bcb7d-f89e-48d5-ae4f-7217e89b5216-image.png

                  第五步:进入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
                  

                  ef170378-33a5-48b1-af90-cf39c9298a23-image.png

                  fb443d12-8369-475d-b9e7-2afecd27e915-image.png

                  3be9ef3b-20e3-432c-81c9-aa1365d77b24-image.png

                  第七步:重新编译

                  mrtos clean
                  mrtos
                  
                  
                  1 条回复 最后回复 回复 引用 分享 0
                  • H
                    hahage168 LV 3 最后由 编辑

                    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命令。

                    ca1b9cd8-13d0-4c04-8044-b0484894ee2c-image.png

                    可以看到有新增的hello_world命令,控制台输入hello_world命令,控制台输出如下:

                    hello,world!
                    

                    RTOS下一个简单的软件包便创建成功了。

                    1 条回复 最后回复 回复 引用 分享 1
                    • T
                      T0n0T LV 2 最后由 编辑

                      楼主可以分享一下tina5 的sdk嘛

                      1 条回复 最后回复 回复 引用 分享 0
                      • Moved from 其它全志芯片讨论区 by  xiaowenge xiaowenge 
                      • A
                        alanhuangbj LV 2 最后由 编辑

                        希望楼主可以分享一下tina5 的sdk

                        1 条回复 最后回复 回复 引用 分享 0
                        • E
                          Euphoria LV 2 最后由 编辑

                          此回复已被删除!
                          1 条回复 最后回复 回复 引用 分享 0
                          • L
                            ljw22676739 LV 2 最后由 编辑

                            这个大概讲了整个步骤流程,非常棒,谢谢

                            1 条回复 最后回复 回复 引用 分享 0
                            • H
                              haivil LV 2 最后由 编辑

                              这个讲的很详细了,也想找个平台搭建一下试试看

                              1 条回复 最后回复 回复 引用 分享 0
                              • F
                                felixguan LV 2 最后由 编辑

                                这个写的太详细了,感谢分享

                                1 条回复 最后回复 回复 引用 分享 0
                                • 1 / 1
                                • First post
                                  Last post

                                Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                                行为准则 | 用户协议 | 隐私权政策