ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法_zynqmpsoc 多核amp-程序员宅基地

技术标签: AMP  ThreadX  ZYNQ  

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

结束

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_15100379/article/details/123667569

智能推荐

nodejs websocket-程序员宅基地

文章浏览阅读49次。Node.js WebSocket 是一种协议,用于在单个 TCP 连接上进行全双工通信。它使得服务器和客户端能够发送和接收消息,在浏览器和服务器之间建立双向通信。在 Node.js 中使用 WebSocket,可以使用第三方模块 ws。...

设计 4 1.4 网络版五子棋小游戏_eclipse设计小游戏五子棋目标-程序员宅基地

文章浏览阅读1k次。一.【设计目的】1. 熟悉开发工具(eclipse)的基本操作;2. 掌握应用程序的编写过程;3. 对于 Socket 编程建立初步的概念。二.【设计要求】1. 熟悉 Sock API 主要函数的使用;2. 掌握相应开发工具对 Socket API 的封装;3. 设计并实现一对一网络版小游戏,本次课程设计实现的是五子棋。三.【工作原理】实现环境语言:java,jdk 1.8编译器 eclipse使用Socket和Thread进行服务器和客户端的通信和同步。_eclipse设计小游戏五子棋目标

多线程开发实战:Java实现多线程四种方式及相关方法原理_java多线程有几种实现方法-程序员宅基地

文章浏览阅读2.9w次,点赞112次,收藏210次。本文带大家了解Java实现多线程的四种方法以及实现多线程的重要注意事项和难点!_java多线程有几种实现方法

iOS 关于音频开发_ios开发 如何发出不同频率的音频声波-程序员宅基地

文章浏览阅读2.6w次。音频方面的知识,相对其他编程还是较为复杂的,特别是要搞清楚框架里具体使用的参数和方法,不然写起代码来非常迷茫.1:播放简短性质的音频,例如按键声音,等可以这样实现.一:引入框架:#import 二:先声明一个声音源IDSystemSoundID _bookSoundID;三:提供需要播放的音频地址进行声音源的注册. NSURL *bookSou_ios开发 如何发出不同频率的音频声波

golang gorm增删改查db.Model db.Where db.Table_gorm db.model-程序员宅基地

文章浏览阅读1.3w次,点赞15次,收藏62次。1. 创建创建记录:user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}db.NewRecord(user) // => 主键为空返回`true`db.Create(&user)db.NewRecord(user) // => 创建`user`后返回`false`设置默认值:可以在gorm ..._gorm db.model

matlab图像分为8块,MATLAB之图像分块处理-程序员宅基地

文章浏览阅读5.9k次。file_path = 'D:/MATLAB/bin/IMAGES/GreenChannels/_512_pixel/';% 图像文件夹路径img_path_list = dir(strcat(file_path,'*.tif'));%获取该文件夹中所有jpg格式的图像img_num = length(img_path_list);%获取图像总数量if img_num > 0 %有满足条件..._matla数据分块处理

随便推点

[附源码]计算机毕业设计springboot疫苗及注射管理系统_采购业务实体关系图表-程序员宅基地

文章浏览阅读376次。管理员登录系统后,可以对首页、个人中心、操作员管理、疫苗信息管理、疫苗预约管理、疫苗入库管理、疫苗出库管理、供应商管理、注射点管理、采购订单管理等功能进行相应的操作管理,如图5-2所示。疫苗预约管理,在疫苗预约管理页面可以对索引、疫苗名称、疫苗种类、批次号、预约时间、预约数量、预约地点、工号、姓名、审核回复、审核状态、审核等内容进行详情和删除等操作,如图5-5所示。疫苗出库管理,在疫苗出库管理页面可以对索引、疫苗名称、疫苗种类、批次号、数量、出库时间、备注等内容进行详情,修改和删除等操作,如图5-7所示。_采购业务实体关系图表

java计算机组成原理教学网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署-程序员宅基地

文章浏览阅读73次。java计算机组成原理教学网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署。springboot基于B_S架构的疫情包联信息管理系统的设计与实现。springcloud基于微服务架构的设备管理系统的设计与实现。JSP计算机C语言学习网站的设计与实现sqlserver。ssm基于SSM框架的菲特尼斯健身管理系统的设计与实现。ssm基于Vue.js的网上书城管理系统的设计与实现。ssm基于ssm+vue的高校个性化选课推荐。ssn基于SSM宠物店管理系统的设计与实现。

uiautomator2自动化测试_open_identify-程序员宅基地

文章浏览阅读533次。本文详细介绍了uiautomator2框架中的所有方法及其使用方式,我们可以使用uiautomator2轻松完成Android手机自动化测试。使用指令pip install --pre uiautomator2安装uiautomator2,使用指令pip install --pre --upgrade weditor==0.6.4安装WEditor。uiautomator2中的方法可以分为设备类方法、UI类方法、基础类方法。_open_identify

Linux 2.6.19.x 内核编译配置选项简介_hardware error]: power, interrupts, etc. ext. erro-程序员宅基地

文章浏览阅读398次。Linux 2.6.19.x 内核编译配置选项简介作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。_hardware error]: power, interrupts, etc. ext. error code: 2, link error

Mac 使用 vscode 写 latex_mac vscode latex-程序员宅基地

文章浏览阅读5.7k次,点赞6次,收藏42次。平时写 latex 都依赖 在线编辑器, 但这个网站在一些 ddl 时会偶尔崩溃,影响体验,因此本文尝试在 mac 环境中 用 vscode 写 latex。_mac vscode latex

ocbase 数据库 蚂蚁_iOS - OC SQLite 数据库存储-程序员宅基地

文章浏览阅读121次。前言采用 SQLite 数据库来存储数据。SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些。注意:写入数据库,字符串可以采用 char 方式,而从数据库中取出 char 类型,当 char 类型有表示中文字符时,会出现乱码。这是因为数据库默认使用 ASCII 编码方式。所以要想正确从数据库中取出中文,需要用 NSString 来接收从数据库取出的字符串。s..._ocbase数据库

推荐文章

热门文章

相关标签