ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法

2023-05-16

ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法

  • ZYNQ UltraScale+ MPSoC与ZYNQ 7000架构比较
    • 目标
  • 一. 创建Linux
    • 1、修改kernel
    • 2、修改设备树
    • 编译&下载
  • 二、创建ThreadX工程
    • 1、ThreadX系统移植
    • ThreadX工程
  • 加载并启动RPU0
    • 加载RPU0代码
    • 启动RPU0
    • 关闭RPU0
  • 结束

ZYNQ UltraScale+ MPSoC与ZYNQ 7000架构比较

处理器架构
ZYNQ 7000双核ARM-Cortex A9 CPU
ZYNQ UltraScale+ MPSoC四核ARM-Cortex A53 CPU、双核Cortex-R5 RPU、Mali-400 GPU(一个Geometry核,两个像素核)、PL逻辑以及视频编解码器Codec核

目标

  • A53上运行Linux ;
  • 在RPU0核也就是R5F的第一个核上运行ThreadX;
  • 系统启动后,Linux 加载RPU0并运行。

一. 创建Linux

在之前的文章中,介绍了使用Xilinx的git 库上的通用Linux源码编译了一个支持AMP的Linux,运行的FreeRTOS,本文也可以按照上面自己编译一个Linux,也可以取个巧通过PetaLinux生成Linux。本文计时通过PetaLinux完成Linux系统的生成的。

需要注意的两点:

1、修改kernel

我们需要Linux支持AMP,就需要在配置petalinux-config -c kernel的时候添加amp的支持。

[*] Enable loadable module support  --->

Device Drivers  --->
    Remoteproc drivers  --->
        [*] Support for Remote Processor subsystem
        <*>   ZynqMP_r5 remoteproc support

Rpmsg drivers  --->
    <*> RPMSG device interface

2、修改设备树

我们需要在设备树中,预留给RPU的RAM空间这里可以参考这里,因为这里仅仅开启了RPU0, 所以只用设置RPU0的部分。

注意:!!
需要注意的是APU以RPU不能同时访问同一个外设,此工程中RPU0访问的外设有UART0, IIC0,因为此工程使用的是黑金的ZU3EG,PS端仅仅接了uart0接口,所以APU端就通过ssh去访问系统,同时在设备树中禁止UART0、IIC0。
修改project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 如下

/include/ "system-conf.dtsi"
/ {
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        rproc_0_reserved: rproc@3ed00000 {
            no-map;
            reg = <0x0 0x3ed00000 0x0 0x1000000>;
        };
    };
  
    power-domains {
        pd_r5_0: pd_r5_0 {
            #power-domain-cells = <0x0>;
            pd-id = <0x7>;
        };

        pd_tcm_0_a: pd_tcm_0_a {
            #power-domain-cells = <0x0>;
            pd-id = <0xf>;
        };
        pd_tcm_0_b: pd_tcm_0_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x10>;
        };
    };
  
    amba {/*您需要将固件内存指定为“mmio-sram”。*/
        r5_0_tcm_a: tcm@ffe00000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE00000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_a>;
        };
        r5_0_tcm_b: tcm@ffe20000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE20000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_b>;
        };
        elf_ddr_0: ddr@3ed00000 {
            compatible = "mmio-sram";
            reg = <0 0x3ed00000 0x0 0x40000>;
        };
        test_r50: zynqmp_r5_rproc@0 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg = <0x0 0xff9a0100 0 0x100>, <0x0 0xff9a0000 0 0x100>;
            reg-names = "rpu_base","rpu_glbl_base";
            dma-ranges;
            core_conf = "split0";
            srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
            pd-handle = <&pd_r5_0>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
  
        } ; 
    };
};

&i2c1 {
	clock-frequency = <400000>;
	status = "disabled";
};

&uart0 {
    status = "disabled";
};

&i2c0 {
/*	clock-frequency = <400000>;*/
	status = "disabled";
};

/* SD */
&sdhci1 {
	disable-wp;
	no-1-8-v;
};
/* USB */
&dwc3_0 {
	status = "okay";
	dr_mode = "host";
};

编译&下载

通过petalinux-config -build 后,我们将系统通过jtag下载到板子上,当然也可以根据需求使用SD卡启动,这个需要在config中设置root filesystem type 为SD卡,此工程使用默认的INITRAMFS

petalinux-boot --jtag --u-boot --fpga

二、创建ThreadX工程

1、ThreadX系统移植

关于ThreadX的系统移植部分,可以参考这里,与ZYNQ7000的套路一样,但是需要注意的是,需要在库如tx库、nxd库、fx库中都要开启浮点fpv的支持:
在Properities->Settings->C/C++ Build->Miscellaneous中添加 -mfloat-abi=hard -mfpu=vfpv3-d16

别的套路都相同了,这里不再做介绍。

ThreadX工程

这个工程中就访问了IIC上的温度传感器:参考黑金手册 ZYNQ MPSoC 开发平台 VITIS 应用教程第六章即可。
在这里插入图片描述

注意的是在ld Available Memory Regions中,psu_r5_ddr_0_MEM_0的基地址和大小一定要与设备树中设置的一样:
在这里插入图片描述

加载并启动RPU0

启动好Linux后,我们在文件系统的\lib 下创建firmware文件夹,然后通过scp 将threadx.elf文件拷贝到\lib\firmware 文件夹。

加载RPU0代码

通过ssh 执行:

echo threadx.elf> /sys/class/remoteproc/remoteproc0/firmware

启动RPU0

echo start > /sys/class/remoteproc/remoteproc0/state

剩下的就是在串口中happy的查看温度信息了.

关闭RPU0

echo stop > /sys/class/remoteproc/remoteproc0/state

结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法 的相关文章

  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M

随机推荐