S03_CH13_ZYNQ A9 TCP UART双核AMP例程

2023-05-16

S03_CH13_ZYNQ A9 TCP UART双核AMP例程

13.1概述

ZYNQ中存在两个独立的ARM核,在很多应用场景中往往只需使用其中的1个核心即可。然而,对于复杂的设计,例如多任务,并行控制、处理等,单个核心将难以胜任。因此,为了尽可能发挥ZYNQ中双ARM核的优势和性能,进行双核应用的开发显得尤为重要。同时,也进一步为Xilinx下一代MPSOC多核异构处理器的使用打下基础。

在ZYNQ中实现双ARM核AMP应用可以参考Xilinx官方的XAPP1078和XAPP1079。在SDK中也有用于双核应用开发的openamp库可以使用。

本例程未使用openamp库,通过自行设计的代码实现了一个简单的双核应用,旨在说明:

l 双核通过软件中断进行核间通信的原理及方法。

l 双核通过共享内存进行数据交互的基本原理和设计方法。

l 双核协同工作的基本模式。

l 双核BOOT的方法。

本例程基于vivado 2015.4开发。

13.2基本原理

本例程在ARM核的CORE0建立一个TCP Server,CORE0通过TCP Server从外部TCP Client接收数据。当CORE0接收到1个TCP包后,将数据复制到DDR3中的缓存区域内,然后将数据信息(长度、首地址)放入CORE0和CORE1在DDR3的共享内存中。

接着,CORE0通过触发软件中断通知CORE1数据信息已存入共享内存中,CORE1接到中断后从共享内存读出数据信息,并将对应长度的数据复制到缓存区中,然后通过UART将数据输出。当CORE1通过串口完成数据输出后,同样通过触发软件中断通知CORE0数据发送已完成,CORE0接到中断后通过串口打印完成信息,然后开始接收下一个TCP包,重复上述过程。

最后,通过FSBL实现双核的QSPI BOOT。

13.2.1软件中断

在UG585的Interrupts 部分7.2.1章节可以找到关于软件中断(SGI)的说明。简而言之,软件中断就是CPU自己产生的中断,可用于触发自身和其他CPU。ZYNQ中共有16个软件中断可以使用,对应的中断号为0~15,如下图所示。通过软件中断可以实现CPU之间的相互通信。本例程使用了编号1和2的软件中断。

wpsE551.tmp

13.2.2共享内存通信

所谓共享内存就是,CORE0和CORE1在DDR3内存中约定一块地址及长度已知的内存区域。然后,两者之间便可通过这片区域进行数据的传递。

两个核心各自拥有独立的L1 DCache,并且共享同一个L2 DCache,在ZYNQ中存在一个Snoop Control Unit (SCU)用于维护CORE0和CORE1的L1 DCache与L2 DCache之间的一致性,无需用户干预。因此,虽然CORE0和CORE1的共享内存区域位于DDR中,两者之间的数据传递并不需要考虑DCache一致性的维护。但是,为了更好阐明多级存储器结构的特性以及DCache一致性维护的问题,本例程在两核间通过DDR3共享内存进行数据交互时加入了DCache一致性操作,最终达到的效果与不使用DCache一致性操作时相同。

DCache一致性维护的原理为:在多级存储器结构中,CPU通过1级或多级Cache与DDR产生连接,CPU本身不直接访问DDR,而是通过Cache访问DDR。Cache中始终会暂存一小部分(通常是KB~几MB量级)CPU最近访问的DDR某些地址区域中的数据。因此,在应用程序中对DDR进行读或写操作,实际上都是CPU对Cache进行读或写操作。当DDR中某个地址范围内的数据突然被除CPU以外的Master(如DMA)改变时,若此时Cache中保存了这些区域的数据,且这些数据在Cache中状态为有效时,当CPU需要再次读取DDR这片区域的数据时,就不会让Cache去读取DDR中此区域内最新的数据来更新Cache,再从Cache里读取最新的数据,而是直接从Cache中读取原来的旧数据,显然这不是我们所期望的结果。这时,便引入了所谓的Cache一致性问题。

ZYNQ中存在ICache和DCache,ICache用于缓存可执行程序,DCache用于缓存数据。一般情况下,用于保存可执行程序的DDR地址范围不会被除CPU以外的对象访问。因此,一般不存在ICache的一致性问题。而DCache在很多应用中却经常会被除CPU以外的对象访问,所以存在一致性问题。

ZYNQ中维护DCache一致性的方法为:写入方将数据写入DDR对应地址区域后,需将残留在DCache中相应地址范围内的数据全部刷入DDR3中。读取方在从DDR相应地址读取数据之前,需将DCache中DDR相应地址范围内的数据全部设置为invalid,然后CPU会再次通过DCache从DDR3中读取该地址范围内最新的数据。

13.2.3双核BOOT

裸机双核BOOT的方法参考自Xilinx的XAPP1079。首先,通过FSBL实现CORE0的BOOT。当CORE0启动进入main函数后,配合FSBL再实现CORE1的启动。

具体原理参考XAPP1079,此处不作赘述。

13.3驱动程序

CORE0工程的驱动程序文件位于c_driver文件夹中的core0文件夹中,CORE1工程的驱动程序文件位于c_driver文件夹中的core1文件夹中。需要说明的是,core0和core1的工程在DDR所占用的地址区域进行如下划分:

l CORE0: 0x00100000~0x01FFFFFF,见下图core0的lscript.ld文件设置。

wpsE561.tmp

l CORE1: 0x02000000~0x02FFFFFF,见下图core1的lscript.ld文件设置。

wpsE562.tmp

设计双核应用,两个工程的内存分配是一个关键的前提,程序所占用的DDR空间不能发生重合,应完全分隔开。

13.3.3 CORE0工程
13.3.3.1 main函数

main函数的完成的功能如下:

l 配置Timer及其中断

l 初始化中断控制器

l 初始化软件中断

l 初始化LWIP协议栈

l 建立TCP Server,启动Timer

l 配合FSBL启动CORE1

l 持续从LWIP协议栈接收数据,若接收到CORE1触发的软件中断,则作出响应。

13.3.3.2建立TCP Server

基于LWIP库在ARM中建立一个TCP Server,IP地址为192.168.1.10,端口号为5010。

l lwip库设置

见“基于TCP的QSPI Flash bin文件网络烧写”例程。

l 程序解析

见“基于TCP的QSPI Flash bin文件网络烧写”例程。

13.3.3.3 初始化软件中断

通过software_intr.c中的Init_Software_Intr()函数初始化软件中断,对于CORE0,该函数完成如下功能。

l 初始化CORE1到CORE0的软件中断,中断号为2,设置中断优先级和触发方式。

l 绑定该中断的中断服务函数为Cpu0_Intr_Hanedler。

l 将该中断映射至CORE0,并使能。

13.3.3.4 启动CORE1

通过main.c中的Start_cpu1()函数配合FSBL完成CORE1的启动。Start_cpu1()原理如下:

l 将FSBL工程位于OCM中的.stack区域和vector table区域的cache禁用。

l 将CORE1工程代码的位于DDR中的起始地址0x02000000(见core1的lscript.ld)写入FSBL的vector table中定义的cpu1_catch地址内。CORE1工程代码的起始地址由如下宏所定义。若core1的lscript.ld中代码位于DDR的起始地址发生更改,则该宏定义也必须进行相应更改。

#define APP_CPU1_ADDR 0x02000000

l 复位CORE1及其时钟

l 使能CORE1及其时钟

13.3.3.5 数据写入共享内存

CORE0通过TCP协议接收外部TCP Client发送的数据包,并将数据信息写入CORE0和CORE1共享内存中。共享内存首地址定义为:

#define SHARED_BASE_ADDR0x08000000

为共享内存区域在shared_mem.h中定义结构体shared region,其中包含了两核间所需交互的数据长度及数据指针。

typedefstruct

{

u32data_length;

u8* dataload;

}shared_region;

CORE0通过shared_mem.c中的put_data_to_region()函数将所需传递的数据长度及指针存入shared region结构体中。在put_data_to_region函数中调用Xil_DCacheFlushRange函数将DCache中该数据指针所指向内存区域的数据刷入DDR中,进行DCache一致性维护。

CORE0将此结构体放置于共享内存首地址SHARED_BASE_ADDR,CORE1便可以从该地址读取CORE0所需传递的数据信息,从而进一步获取数据。

13.3.3.6 触发软件中断

CORE0通过调用shared_mem.c中的Gen_Software_Intr函数触发CORE0到CORE1的软件中断,中断号为1,中断目标CPU设置为CORE1。

13.3.3.7响应软件中断

当CORE1向CORE0触发中断号为2的软件中断时,CORE0调用Cpu0_Intr_Hanedler函数响应此中断。然后,CORE0通过串口打印相应信息。

13.4 CORE1工程

13.4.1 main函数

main函数的完成的功能如下:

l 配置Timer及其中断

l 初始化中断控制器

l 初始化软件中断

l 等待CORE0触发的软件中断,将CORE0通过共享内存传递的数据由串口输出

l 串口数据输出完成后触发CORE1到CORE0的软件中断

13.4.2初始化软件中断

通过software_intr.c中的Init_Software_Intr()函数初始化软件中断,对于CORE1,该函数完成如下功能。

l 初始化CORE0到CORE1的软件中断,中断号为1,设置中断优先级和触发方式。

l 绑定该中断的中断服务函数为Cp1_Intr_Hanedler。

l 将该中断映射至CORE1,并使能。

13.4.3响应软件中断

当CORE0向CORE1触发中断号为1的软件中断时,CORE1调用Cpu1_Intr_Hanedler函数响应此中断。然后,CORE1开始从共享内存中读取CORE0所传递的数据。

13.4.4共享内存数据读出

CORE1从共享内存区域SHARED_BASE_ADD地址中获取CORE0传递的数据信息,通过shared_mem.c中的get_data_from_region()函数将CORE0传递的数据长度及指针读出,并复制到本地缓存中。

在get_data_from_region函数中,在将CORE0传递的数据复制到本地缓存区域之前,调用Xil_DCacheInvalidateRange函数将DCache中该数据指针所指向内存区域的数据设置为invalid,进行DCache一致性维护。

13.4.5触发软件中断

当CORE1将从共享内存中读取的数据通过串口输出完毕后,CORE1通过调用shared_mem.c中的Gen_Software_Intr函数触发CORE1到CORE0的软件中断,中断号为2,中断目标CPU设置为CORE0。以此通知CORE0,CORE1串口输出数据完成。

13.5工程创建及设置关键步骤

l CORE1工程创建时Processor要选择ps_cortexa7_1,不要选成ps_cortexa7_0,如下图所示。

wpsE573.tmp

l 创建FSBL工程后,需替换其bsp的standalone库。

首先,设置工程目录下sdk_repo文件夹的路径,sdk_repo文件夹中包含了需要使用的standalone库,如下图所示。用户需要根据自己所建工程的实际路径进行修改,使用原工程的路径设置将产生错误。

wpsE574.tmp

其次,更改FSBL工程的bsp中standalone的版本,将其更换为sdk_repo文件夹中的5.19版本,如下图所示。该版本standalone库来自xapp1079,只有使用该版本的standalone库才可实现双核BOOT,自带的standalone库无法实现。

wpsE575.tmp

l 设置CORE1工程的编译选项

在CORE1工程的bsp中要增加编译选项“-DUSE_AMP=1”,如下图所示。该编译选项将影响到CORE1工程代码里中断控制器SCUGIC的初始化函数以及Cache操作函数的编译,若不增加该选项,可能会出现CORE0和CORE1中断异常和Cache一致性维护异常。

wpsE585.tmp

13.6工程调试关键步骤

l system debugger里同时添加core0和core1工程文件,如下图所示。Debug时先让CORE0运行,再让CORE1运行。

wpsE586.tmp

wpsE587.tmp

l Debug时一定要注释CORE0工程中main函数里的Start_cpu1函数,否则在debug时,CORE1将无法正常工作。只有当需要生成BOOT.bin文件时,才需要使用该函数。

13.7网络调试助手操作方法

在SDK中下载程序至ZYNQ中。打开网络调试助手,选择TCP Client方式,输入ARM中定义的TCP Server的IP地址和端口号,然后点击连接按键,建立TCP连接。输入任意文字信息发送。如图所示。

wpsE588.tmp

SDK终端串口输出的信息如下图所示。

wpsE599.tmp

继续通过网络调试助手发送信息,串口输出如下图所示。

wpsE59A.tmp

wpsE59B.tmp

13.8生成BOOT.bin

切记在生成BOOT.bin文件时不要注释CORE0工程中main函数里的Start_cpu1函数,否则将无法BOOT CORE1。生成BOOT.bin文件时依次添加FSBL工程的elf,bit文件,CORE0和CORE1的elf文件,如下图所示。

wpsE5AC.tmp

13.9双核BOOT验证

将BOOT.bin文件烧入QSPI flash中,重启开发板。SDK串口终端输出信息,如下图所示。当提示“core1:application start”,代表CORE0和CORE1都已成功启动。

wpsE5AD.tmp

使用网络调试助手进行TCP连接并发送数据,串口输出如下图所示。此时,验证了双核BOOT后,CORE0和CORE1均运行正常。

wpsE5AE.tmp

转载于:https://www.cnblogs.com/milinker/p/6484459.html

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

S03_CH13_ZYNQ A9 TCP UART双核AMP例程 的相关文章

  • 用 C 处理 TCP 的部分返回

    我一直在读Beej 的网络编程指南 http beej us guide bgnet 获取 TCP 连接的句柄 在其中一个示例中 简单 TCP 流客户端的客户端代码如下所示 if numbytes recv sockfd buf MAXDA
  • 如何进行 TCP 打孔?

    问题如下 这是我当前的测试代码 但没有成功 static void Main string args if args Count 3 Console WriteLine Bad args var ep new IPEndPoint IPAd
  • Boost ASIO:服务器如何知道客户端是否仍然连接?

    我在用boost asio对于服务器 客户端应用程序 服务器一次只接受一个连接 我想知道服务器验证客户端是否仍然连接的最佳方法是什么 这样做的目的是我希望能够知道客户端是否崩溃 以便我可以重新开始侦听新的连接尝试 在我的应用程序中 我使用以
  • 无法通过 ngrok ssh 进入远程 Linux

    远程Linux计算机位于内部网络中 没有公共IP地址 所以我安装了ngrok ngrok tcp 22 ngrok by inconshreveable Ctrl C 退出 在线隧道状态版本2 0 19 2 0 17网页界面http 127
  • 我的代码中某处存在无限循环

    我有这个 Java 游戏服务器 最多可处理 3 000 个 tcp 连接 每个玩家或每个 tcp 连接都有自己的线程 每个线程的运行情况如下 public void run try String packet char charCur ne
  • 如何使用 kotlin 通过 TCP 连接发送和接收字符串

    我在 Windows 上有一个 TCP 服务器 我想在服务器和我的 Android 设备之间发送和接收文本字符串 我花了很多时间搜索使用 Kotlin 的示例 但没有找到任何有用的代码 所以我现在只能创建套接字并连接 fun connect
  • 在 C# 中通过 TCP 发送 C 结构体

    我正在编写一个程序 通过 TCP 与一台设备的管理界面进行交互 问题是 设备的文档是用C写的 而我写的程序是用C 写的 我的问题是 文档指定 通信基于基于C结构的API缓冲区 再多的谷歌搜索似乎也无法让我找到这个 API 或如何通过 TCP
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • 如何在NodeJS中测试socket.setKeepAlive

    我尝试在NodeJS中测试setKeepAlive 的功能 我在同一本地网络中的不同计算机上运行 Server js 和 client js 然后 我关闭了客户端计算机上的 WiFi 连接 断开互联网连接 15分钟后 仍然没有消息抛出 这是
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 如果其中一台机器死机,TCP 连接如何终止?

    如果两个主机 A 和 B 之间建立了 TCP 连接 假设主机 A 已向主机 B 发送了 5 个八位字节 然后主机 B 崩溃了 由于未知原因 主机 A 将等待确认 但如果没有收到确认 将重新发送八位字节并减小发送者窗口大小 这将重复几次 直到
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我

随机推荐

  • MySQL在远程访问时非常慢的解决skip-name-resolve

    服务器放在局域网内进行测试时 xff0c 数据库的访问速度还是很快 但当服务器放到外网后 xff0c 数据库的访问速度就变得非常慢 后来在网上发现解决方法 my cnf里面添加 mysqld skip name resolve 这样速度就快
  • 一起学Hadoop——二次排序算法的实现

    二次排序 xff0c 从字面上可以理解为在对key排序的基础上对key所对应的值value排序 xff0c 也叫辅助排序 一般情况下 xff0c MapReduce框架只对key排序 xff0c 而不对key所对应的值排序 xff0c 因此
  • MySQL复制表结构和复制表

    之前看到网上很多说用 SELECT INTO 表2 FROM 表1 WHERE 1 61 2 可以将表1结构复制到表2 用SELECT INTO 表2 FROM 表1 可以将表1 内容全部复制到表2 但是每次都会报错 xff1a 说表2 没
  • python的tuple()元组数据类型的使用方法以及案例

    一 元组的概念介绍 1 元组是列表的二次加工 列表可以被修改 列表的类型 list li 61 1 2 3 4 5 6 2 元组的元素不可被修改 xff0c 不能被增加或者删除 xff0c xff08 只是针对元组的一级元素是不可以修改的
  • 从源码解析ERROR 1129 (HY000):Host is blocked because of many connection errors

    原创水平有限 有错请指出 源码版本5 7 14 今天群里一个朋友出现如下错误 xff1a ERROR 1129 HY000 Host 39 10 0 0 8 39 is blocked because of many connection
  • 3.python 发送邮件之smtplib模块

    SMTP xff08 Simple Mail Transfer Protocol xff09 是简单邮件传输协议 xff0c 它是一组用于由源地址到目的地址的邮件传输规则 python中对SMTP进行了简单的封装 xff0c 可以发送纯文本
  • Linux VMWare VNC远程桌面管理

    一 linux vncserver环境配置 xff1a 1 vncserver和gnome安装软件包 xff1a yum install tigervnc server y yum groups install GNOME yum grou
  • UML动态模型(顺序图、协作图、状态图)

    顺序图 xff1a 用来表示用例中的行为顺序 xff0c 当执行一个用例行为时 xff0c 顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件 顺序图展示对象之间的交互 xff0c 这些交互是指在场景或用例的时间六中发生的 xff
  • PX4编译总结以及底层驱动流程

    师父给的 Px4编译总结 1 ld文件配置MCU Firmware nuttx configs typhoon scripts 2 配置NUTTX系统 xff1a 修改defconfig Firmware nuttx configs typ
  • ovs ovn 学习资料

    0 A Primer on OVN http blog spinhirne com 2016 09 a primer on ovn html 1 Open Virtual Networking With Docker http docs o
  • openstack No valid host was found. There are not enough hosts available.

    root 64 dell PowerEdge T30 gedit var log nova nova conductor log root 64 dell PowerEdge T30 gedit var log nova nova sche
  • Python中判断字符串是否为数字的三个方法isdecimal 、isdigit、isnumeric的差别

    isdecimal isdigit isnumeric这三个字符串方法都用于判断字符串是否为数字 xff0c 为什么用三个方法呢 xff1f 他们的差别是什么内 xff1f isdecimal xff1a 是否为十进制数字符 xff0c 包
  • 超过255台电脑IP和子网掩码的一些知识(轉)

    超过255台电脑IP和子网掩码的一些知识 我们都知道 xff0c xff29 xff30 是由四段数字组成 xff0c 在此 xff0c 我们先来了解一下3类常用的 xff29 xff30 A类IP段 0 0 0 0 到127 255 25
  • Unable to determine the device handle for GPU 0000:01:00.0: GPU is lost.问题排坑

    在运行maskrcnn时 xff0c 会碰到训练不动的问题 xff0c 就卡在这儿 UserWarning Converting sparse IndexedSlices to a dense Tensor of unknown shape
  • TCP/UDP协议

    一 协议的概念 什么是协议 xff1f 从应用的角度出发 xff0c 协议可理解为 规则 xff0c 是数据传输和数据的解释的规则 假设 xff0c A B双方欲传输文件 规定 xff1a 第一次 xff0c 传输文件名 xff0c 接收方
  • Chapter 4 Metrology system

    The metrology system measures the position of the probe relative to the product in the six critical directions in the pl
  • 二值信号量和互斥锁到底有什么区别?

    在说明之前我先抛出结论 xff1a 互斥锁和二值信号量在使用上非常相似 xff0c 但是互斥锁解决了优先级翻转的问题 假定我们现在有三个任务 xff0c task1 xff0c task2 xff0c task3 xff0c 任务优先级ta
  • uCos的多任务实现

    uCos的多任务实现 作为操作系统 OS xff0c 最基本的一项服务就是提供多线程 xff0c 在实时操作系统uCos里 xff0c 多线程被称为多任务 Task 多任务并不是CPU能真正同时运行多个程序 xff0c 实际是靠CPU在多个
  • 设置vnc登录远程虚拟机

    设置vnc登录远程虚拟机 原理简介 xff1a vnc分为vnc server 和vnc view xff0c 我们经常用来连接远端服务器的是vnc view客户端 xff0c server端部署在服务器端 vnc 能够与远端服务器实现通信
  • S03_CH13_ZYNQ A9 TCP UART双核AMP例程

    S03 CH13 ZYNQ A9 TCP UART双核AMP例程 13 1概述 ZYNQ中存在两个独立的ARM核 xff0c 在很多应用场景中往往只需使用其中的1个核心即可 然而 xff0c 对于复杂的设计 xff0c 例如多任务 xff0