如何在Zynq SoC 上笔记本在使用中断网“中断”

你的位置:
&& 详细内容
赛灵思中国通讯52-如何在 Zynq SoC 上使用中断
热度299票&&浏览6167次
时间:日 12:49
在嵌入式处理中,中断表示暂时停止处理器的当前活动。处理器会保存当前的状态并执行中断服务例程,以便对引起中断的原因进行寻址。中断可能来自下列三个地方之一 :•& 硬件 – 直接连接处理器的电子信号•& 软件 – 处理器加载的软件说明•& 异常情况& – 发生错误或异常事件时处理器出现的异常情况无论中断的来源在何处,都可将中断的类别归为可屏蔽和不可屏蔽两种。您可通过在中断掩码寄存器中设置相应的位来安全地忽略可屏蔽中断。但不能忽略不可屏蔽中断,因为这类中断通常用于定时器和看门狗监控器。中断的触发既可以是边缘触发也可以是水平触发。我们将在后面部分看到,赛灵思 Zynq®-7000 All Programmable SoC 支持中断的这两种配置方式。为什么使用中断驱动方案?实时设计通常要求采用中断驱动方案,因为众多系统都会有很多输入单元(如键盘、鼠标、按钮、传感器以及类似设备等)偶尔需要处理。这些设备的输入单元通常会被异步至当前正在执行的进程或任务,因而用户不可能始终准确预测事件的发生时间。 &使用中断,处理器能继续进行处理,直到事件发生,这时处理器便可处理这一事件。此外,与轮询方案相比,中断驱动方案对事件的响应时间更短,在中断驱动方案中,程序会以同步的方式主动对外部设备的状态进行采样。Zynq SoC的中断结构 随着处理器技术不断进步,中断的来源也多种多样。如图 1 所示,Zynq SoC 可使用通用中断控制器(GIC)来处理中断。GIC 可处理源自以下方面的中断 :•& 软件生成的中断 – 每个处理器有 16 个此类中断,能够中断一个或两个 Zynq SoC 的 ARM®CortexTM-A9处理器内核 ;•& 共享外设中断 – 共计 60 个,这些中断来自 I/O 外围设备,或往返于设备的可编程逻辑(PL)侧。Zynq SoC 的两个 CPU 共享这些中断 ;•& 专用外设中断& – 这种类型中包含的 5 个中断对每个CPU 都属于专用中断,比如 CPU 定时器、CPU 看门狗监视器定时器以及专属 PL 至 CPU 中断。共享外设中断非常有趣,因为它们非常灵活。可将它们从 I/O 外设(共 44 个中断)或 FPGA 逻辑(共 16 个中断)路由至两个 CPU 中的一个,但也可以将中断从 I/O 外设路由至设备的可编程逻辑侧,参见图2。在 Zynq SoC上处理中断 在 Zynq SoC 中发生中断时,处理器会采取以下措施 : 1.&& 将中断显示为挂起 ;2.&& 处理器停止执行当前线程 ;3.&& 处理器在协议栈中保存线程状态,以便在中断处理后继续进行处理 ;4.&& 处理器执行中断服务例程,其中定义了如何处理中断 ;5.&& 在处理器从协议栈恢复之前,被中断的线程继续运行 ;中断属于异步事件,因此可能同时发生多个中断。为了解决这一问题,处理器会对中断进行优先级排序,从而首先服务于优先级别最高的中断挂起。为了正确实现这一中断结构,需要编写两个函数 :一是中断服务例程,用于定义中断发生时的应对措施 ;二是用于配置中断的中断设置。中断设置例程可重复使用,允许构建不同的中断。该例程适用于系统中的所有中断,将针对通用I/O(GPIO)设置和使能中断。如何在 SDK中使用中断可使用赛灵思软件开发套件(SDK)中的独立板支持包(BSP)在物理硬件上支持并实现中断。BSP 具备众多功能,可显著降低创建中断驱动系统的任务难度。它们位于带有以下报头的文件中 :•& Xparameters.h – 该文件包含处理器的地址空间和设备ID ;•& Xscugic.h – 该文件包含配置驱动程序以及 GIC 的使用范围 ;•& Xil_exception.h – 该文件包含 Cortex-A9 的异常函数。为了对硬件外设进行寻址,我们需要知道想要使用的设备(也就是 GIC)的地址范围和设备 ID,这些信息大多位于 BSP 报头文件 xparameters 下。但是 xparameters_ps.h(无需在您的源代码中申报该报头文件,因为它包含在 xparameters.h 文件中)提供了中断 ID。我们可在源文件中使用这个标记有中断的“ID” (GPIO_Interrupt_ID),使用方式如下 :#defne GPIO_DEVICE_ID& XPAR_XGPIOPS_0_DEVICE_ID#defne INTC_DEVICE_ID& XPAR_SCUGIC_SINGLE_DEVICE_ID#defne GPIO_INTERRUPT_ID& XPS_GPIO_INT_ID在这个简单的例子中,我们将配置 Zynq& SoC 的GPIO,以便在按下按钮后生成中断。为了设置中断,我们需要两个静态全局变量以及上述定义的中断 ID 来执行以下操作: &static XScuGic I // Interrupt Controller Driverstatic XGpioPs G //GPIO Device在中断设置功能中,我们需要初始化 Zynq SoC 异常; 配置并初始化GIC; 并将GIC连接到中断处置硬件。Xil_exception.h 和 Xscugic.h 文件可提供完成这一任务所需的函数。结果生成以下代码: &//GIC confgXScuGic_Confg *IntcC Xil_ExceptionInit();//initialize the GICIntcConfg = XScuGic_LookupConfg(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcCon-fg, IntcConfg-&CpuBaseAddress);//connect to the hardwareXil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHan-dler,& GicInstancePtr);当配置 GPIO 以使其在同一中断配置例程中发挥中断功能时,我们能够配置内存库或单个引脚。我们可通过使用在xgpiops.h中提供的函数来完成这项任务,比如:voi&& & d&& &XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask);voi&& & d&& &XGpioPs_IntrEnablePin(XGpioPs *InstanceP-tr, int Pin);当然,您还需要正确配置中断。例如,您希望采用边缘触发或水平触发吗?若答案为是,那么采用这个函数能实现何种边缘和水平呢?void&& &XGpioPs_SetIntrTypePin(XGpioPs *InstanceP-tr, int Pin, u8 IrqType);在这里,xgpiops.h 中五个定义中的其中一个可对 IrqType定义。这五个定义是 :#def&& & ne XGPIOPS_IRQ_TYPE_EDGE_RISING 0 /**& Interrupt on Rising edge */#def&& & ne XGPIOPS_IRQ_TYPE_EDGE_FALLING 1 /**& Interrupt Falling edge */#def&& & ne XGPIOPS_IRQ_TYPE_EDGE_BOTH 2 /**& Interrupt on both edges */#def&& & ne XGPIOPS_IRQ_TYPE_LEVEL_HIGH 3 /**& Interrupt on high level */#def&& & ne XGPIOPS_IRQ_TYPE_LEVEL_LOW 4 /**& Interrupt on low level */如果您决定使用 Bank 使能,那么您需要知道您希望使能中断的单个引脚或多引脚位于哪个 Bank 上。Zynq SoC最多支持 118 个 GPIO。在这种配置下,所有 MIO(54 个引脚)都会与EMIO(64个引脚)一起被用作GPIO。我们能将这个配置分为四个Bank,每个Bank容纳32个引脚。此外,这项设置功能还将定义中断服务例程,发生中断时,可用以下函数调用该例程:XGpioPs_SetCallbackHandler(Gpio, &&& (void *)Gpio, IntrHandler);中断服务例程的繁简程度由其应用定义。在该例中,每按一次按钮,它便会触发一个 LED,打开和关闭这个LED。另外,在每次按下按钮时,中断服务例程还会向控制台打印一条信息。static void IntrHandler(void *CallBackRef, int Bank, u32 Status){&&&&&&&&&&& XGpioPs *Gpioint = (XGpioPs *) CallBackR&&&&& XGpioPs_IntrClearPin(Gpioint, pbsw);&&& printf(“****button pressed****\n\r”); toggle = !&&& XGpioPs_WritePin(Gpioint, ledpin, toggle); for( delay = 0; delay & LED_DELAY; delay++) //wait& {}}专有定时器举例 Zynq SoC 拥有许多可用的定时器和看门狗监视器。它们既可作为一个 CPU 的专用资源也可作为两个 CPU 的共享资源。如需在您的设计中高效利用这些组件,则需要中断。这些定时器和看门狗监视器包括:•& CPU 32 位定时器(SCUTIMER),以 CPU 频率的一半计时•& CPU 32 位看门狗监视器(SCUWDT),以 CPU 频率的一半计时•& 共享 64 位全局定时器(GT),以 CPU 频率的一半计时(每个 CPU 都有其自己的 64 位比较器 ;它与 GT配合使用,能驱动各个 CPU 的专用中断)•& 系统看门狗监视时钟(WDT),可通过 CPU 时钟或外部来源进行计时•& 一对三重定时器计数器(TTC),每个包含三个独立定时器。在可编程逻辑中,可通过 CPU 时钟或来自MIO 或 EMIO 的外部来源对 TTC 进行计时。为了通过可用的定时器和看门狗监视器获得最大优势,我们需要使用Zynq SoC中断。其中配置最简单的就是专有定时器。和Zynq SoC的大多数外设一样,该定时器带有很多预定义的函数和宏指令,能帮助您高效使用这一资源。这些函数和宏指令位于:#include&&& “xscutimer.h”这个文件中的函数(宏指令)能够提供许多功能,包括初始化和自测试等。此外,文件中的函数还能启动和停止定时器并对其进行管理(重启 ;检查是否过期 ;加载定时器 ;使能 / 禁用自动加载)。它们的另一项工作就是设置、使能、禁用、清除和管理定时器中断。最后,这些函数还能获取并设置预分频器。定时器本身通过以下四个寄存器来控制:•& 专用定时器加载寄存器 – 可将该寄存器用于自动重新加载模式,包含在使能自动重新加载时被重新加载到专用定时器计数器寄存器中的数值。•& 专用定时计数寄存器 (Private Timer Counter Register) – 这是真实计数器本身。使能后,一旦寄存器达到零,则会设置中断事件标志。•& 专用定时器控制寄存器 – 控制寄存器可使能或禁用定时器、自动重新加载模式以及中断生成,还包含定时器的预分频器。•& 专用定时器中断状态寄存器 – 该寄存器包含专用定时器中断状态事件标志。就使用 GPIO 而言,设置定时器所需的定时器设备ID 和定时器中断 ID 都包含在 XParameters.h 文件中。在本例中,我们将使用先前开发的按钮中断。当按下按钮时,定时器将加载并开始运行(采用非自动重新加载模式)。一旦定时器过期,将生成能通过 STDOUT 输出一条消息的中断。然后清除该中断,以便等待下一次按下按钮。在本例中,将始终向计数器加载相同的数值 ;因此,在文件顶部的公告中公布了定时器计数值,如下所示:#define&&& TIMER_LOAD_VALUE& 0xFFFFFFFF下一步是配置和初始化专用定时器并在其中加载定时器计数值。&//timer initialisation&TMRConfigPtr = XScuTimer_LookupConfig && (TIMER_DEVICE_ID);&XScuTimer_CfgInitialize(&Timer,& && TMRConfigPtr,TMRConfigPtr-&BaseAddr);//load the timer&XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VAL-UE);此外,我们还需要更新中断设置子例程,从而将定时器中断连接至GIC并使能定时器中断。&//set up the timer interrupt& XScuGic_Connect(GicInstancePtr, TimerIntrId,(Xil_ExceptionHandler)TimerIntrHandler, &&& (void *)TimerInstancePtr);& //enable the interrupt for the Timer at GIC& XScuGic_Enable(GicInstancePtr, TimerIntrId);& //enable interrupt on the timer& XScuTimer_EnableInterrupt(TimerInstancePtr);发生中断时,需要调用 TimerIntrHandler 函数,这时必须在GIC上以及定时器本身使能定时器中断。定时器中断服务例程非常简单。它仅需清除挂起的中断,并通过STDOUT输出一条消息,如下所示:static&&& void&&& TimerIntrHandler(void&&& *CallBackRef){& XScuTimer *TimerInstancePtr =& &&&& (XScuTimer *) CallBackR& XScuTimer_ClearInterruptStatus(TimerInstancePtr);&&& &printf(“****Timer& Event!!!!!!!!!!!!!****\n\r”);完成该操作后,最后还要修改 GPIO 中断服务例程,从而在每次按下按钮后启动定时器,如下所示:&//load timer&XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);&//start timer&XScuTimer_Start(&Timer);首先,我们要将定时器值加载到定时器中,然后调用定时器启动函数。现在,我们能够再次清除按钮中断并恢复处理,如图3所示。在开始着手设计中断驱动系统时,很多工程师都会心生畏惧。但是,Zynq SoC 架构以及通用中断控制器(与配备 SDK 的驱动器相结合)可帮助您快速、高效地启动和运行中断驱动系统。
对本篇资讯内容的质量打分:
当前平均分:0.44 (152次打分)
【已经有147人表态】
[感动最多的]
[路过最多的]
[高兴最多的]
[难过最多的]
[搞笑最多的]
[愤怒最多的]
[无聊最多的]
[同情最多的]可最大程度地发挥Zynq SoC优势的双重方法
> 可最大程度地发挥Zynq SoC优势的双重方法
可最大程度地发挥Zynq SoC优势的双重方法
Zynq-7000全可编程 SoC的众多优势之一就是拥有两个ARM
Cortex-A9板载处理器。不过,很多裸机应用和更为简单的操作系统只使用Zynq
SoC处理系统(PS)中两个ARM内核中的一个,这种设计方案可能会限制系统性能。本文引用地址:根据所开发的应用类型不同,可能需要这两个处理器都运行裸机应用,或者需要在每个处理器上运行不同的操作系统。例如,其中一个处理器执行关键计算任务,从而运行裸机/RTOS应用,同时第二个处理器通过Linux提供HMI和通信功能。什么是多处理?这两种方案都属于多处理。简单定义:多处理就是在一个系统中使用一个以上的处理器。多处理架构可允许一次执行多个指令,但并非必须如此。多核处理包括两种类型:对称和非对称。对称多处理是通过将负载分配给多个内核,从而能够同时运行多个软件任务。而非对称多处理(AMP)则是使用专用处理器,或者针对特定应用或任务在相同处理器上执行应用。根据定义,使用上的两个内核执行裸机应用或不同操作系统都属于非对称多处理。上的AMP可能涉及如下几种组合:& 在内核0和内核1上运行不同操作系统;& 在内核0上运行操作系统,在内核1上运行裸机应用(反之亦然);& 在两个内核上均运行裸机应用,执行不同程序。当您决定在Zynq
SoC上创建AMP系统时必须考虑一个实际问题,即ARM处理器内核同时包含必须进行正确寻址的私有资源和共享资源。这两个处理器都有私有的L1指令和数据高速缓存、定时器、监视时钟以及中断控制器(针对共享和私有中断)。另外还存在一些共享资源,常见的有I/O外设、片上存储器、中断控制器分配器、L2高速缓存和位于DDR存储器中的系统内存(见图1)。这些私有和共享资源均需要精心管理。每个PS核都有自己的中断控制器,能够利用软件中断实现自身与一个或两个内核的中断。这些中断通过ARM的分布式中断控制器技术完成分配。由于针对每个内核执行的程序都位于DDR存储器内,因此您必须特别注意以确保对这些应用进行正确分割。建立AMP建立AMP并使其运行在Zynq
SoC上所需的关键因素是引导载入程序,该程序会在第一个应用载入到存储器后寻找第二个可执行文件。在XAPP1079中提供了有用的应用指南和源代码。该文档包含修改后的第一阶段引导载入程序(FSBL)和独立OS,可用来创建AMP系统。首先要做的是下载与应用说明配套提供的ZIP文件,再将FSBL和OS这两个要素解压到期望的工作目录。然后,必须给名为SRC&design&的文件夹重新命名。现在,非常重要的一点是一定要确保软件开发套件(SDK)知道这些新文件(修改后的FSBL和独立OS,两者兼备)的存在。因此,下一步需要更新您的SDK库,以便使其知道这些新文件的存在。使用软件中断与硬件中断基本相似,区别只在于您如何触发它们。这很容易实现。在SDK中工具菜单下选择&库&,然后选择&新建&,随之导航到目录位置您的工作目录&\
app1079\design\work\sdk_repo,如图2所示。处理器间的通信为AMP设计创建应用之前,您需要考虑应用如何进行通信(如有需要)。最简单的方法是使用片上存储器。Zynq
SoC配备256KB的片上SRAM,可从以下四个源地址进行访问:& 利用侦测控制单元(SCU)从任意内核进行访问;& 利用SCU通过AXI加速器一致性端口(ACP)从可编程逻辑进行访问;& 利用片上存储器(OCM)互联通过高性能AXI端口从可编程逻辑进行访问;& 也是利用OCM从中央互联进行访问。图1 & 处理系统,显示私有和共享资源图2 & 将您的新文件添加到库由于这些不同的访问源都能对片上存储器进行读写,因此尤为重要的一点是,在使用OCM之前一定要首先详细了解其的运行方式。既然OCM有多个访问源,那么显然应该定义一个仲裁和优先级形式。由于侦测控制单元需要最低时延(SCU既可以是处理器内核也可以是AXI
ACP接口),因此SCU从这些访问源的读操作就具有最高优先级,紧接着是SCU写操作,然后是OCM互联读/写操作。用户可通过将片上存储器控制寄存器中的SCU写操作的优先级设置为低来颠倒SCU写操作和OCM互联访问的优先级。OCM本身结构为128位字,分成四个64KB分区,并位于PS地址空间的不同位置。初始配置下,前三个64KB区块布置在地址空间的起始位置,最后一个64KB区块置于地址空间的末尾(见图5)。简单的片上存储器实例您可使用赛灵思I/O函数访问OCM,以便从所选的存储器地址读取和写入数据。这些函数包含在Xil_IO.h中,可支持在CPU地址空间内存储和访问8位、16位或32位字符型、短整型或整型数据。使用这些函数时,只需知道您希望访问的地址以及想要在此存储的值即可。如果是写操作,方法如下,使用该技术时要确保两个地址指向片上存储器中的相同位置,尤其是当不同人编写不同内核程序时更应如此,为此更好的方法是使用共同的头文件。该文件将包含针对特定传输的相关操作地址的宏定义,例如:另一种备选方法是让两个程序都使用指示器来访问存储单元。您可以通过使用宏命令定义指向恒定地址的指示器(一般用C语言)来实现这一点:此外,您还可以对地址再次进行宏定义,以确保该地址为两个应用程序的共用地址。这种方法无需使用赛灵思I/O库,而是通过指示器实现简单访问。处理器间的中断Zynq
SoC中的每个内核都有16个软件生成的中断。如上文所提到的,每个内核都能实现自身与另一个内核或两个内核的中断。使用软件中断与使用硬件中断基本相似,区别只在于您如何触发它们。若使用软件中断,正在接收的应用就无需针对更新数据而对目标存储单元进行轮询。就像使用任何硬件中断时一样,您需要对两个内核中的通用中断控制器进行配置。敬请参阅《赛灵思中国通讯》第87期的&如何在Zynq
SoC上使用中断&以了解更多相关信息。然后,您可以使用xscugic.h中提供的XScuGic_SoftwareIntr函数在正在更新的内核中触发软件中断。该命令将向该指定内核发出一个软件中断,再由该内核进行适当操作:您必须为内核0和内核1应用对DDR存储器进行正确分段,否则会存在其中一个应用破坏另一个应用的风险。创建应用将文件添加到库之后,下个阶段就是生成AMP解决方案的三个重要部分:AMP第一阶段引导载入程序、内核0应用和内核1应用。您必须为每个部分生成一个不同的板支持包(BSP)。您需要做的第一件事是用SDK创建一个新的FSBL。选择&新建应用项目&,创建一个支持AMP的FSBL项目。这与创建一般FSBL的过程没有什么不同。不过,这次您需要选择&Zynq
FSBL for AMP&模板,如图3所示。完成AMP FSBL创建之后,接下来需要为第一个内核创建应用。一定要选择内核0和您的首选操作系统,并允许其创建自己的BSP,如图4所示。创建应用之后,您需要正确定义应用在DDR存储器中的位置(应用将从该位置执行)。为此,您需要编辑图5中的链接器脚本,以显示DDR的基地址和大小。这一点很重要,因为如果没有为内核0和内核1应用对DDR存储器进行正确分段,就会存在其中一个应用破坏另一个应用的风险。完成分段之后,您现在可以编写希望在内核0上执行的应用,因为该内核是AMP系统中的主管。内核0必须启动内核1应用的执行。您需要将图6中的代码段包含在应用中。这段代码禁用片上存储器上的高速缓存,并将内核1程序的起始地址写到一个内核1将会访问的地址。一旦内核0执行Set
Event(SEV)命令,内核1便开始执行其程序。图3 & 为AMP设计选择第一阶段引导载入程序图4 & 为内核0创建应用和BSP下一步是为内核1创建BSP。一定要使用修改后的独立OS(standalone_amp,如图7所示),这一点很重要,因为它能防止PS侦测控制单元的重新初始化。就这一点而言,在创建项目时不要像对待内核0那样允许其自动生成BSP。必须确保在CPU选项中选择内核1。既然您已经为内核1创建了BSP,那么接下来首先需要修改BSP的设置,才能继续创建您想要在内核1上运行的应用。这非常简单,只需要向BSP驱动器部分的配置中添加一个额外的编译器标志:&DUSE_AMP=1。这一步完成后,您就可以任意为内核1创建应用了。务必选择内核1作为处理器,并使用您刚刚创建的BSP。创建新应用之后,您需要再次在DDR存储器中定义正确的存储单元,而内核1程序将从此处执行。您可按照之前的方法通过编辑内核1应用的链接器脚本来完成设定。与第一个内核一样,在该应用中同样要禁用片上存储器上的高速缓存&&该高速缓存可用来在这两个处理器之间进行通信。将所有组件完美整合在创建应用和构建项目之后,您现在应已拥有以下组件:& AMP FSBL ELF;& 内核0 ELF;& 内核1 ELF;& BIT文件,用来为预期能够实现AMP的Zynq器件定义配置。图5 & 内核0的DDR位置和大小使用所提供的工具在Zynq SoC上创建非对称多处理应用可以变得非常简单。图6 & 通过编码禁用片上存储器上的高速缓存图7 & 为内核1创建BSP为了使Zynq
SoC从所选的配置存储器中引导,您需要一个.bin文件。要创建该文件,您还需要一个BIF文件。BIF文件规定了应使用哪些文件创建BIN文件以及它们的顺序。不要使用SDK中的&创建Zynq&引导映像,而应使用ISE&设计套件命令提示符和BAT文件(BAT文件是XAPP1079的一部分,位于下载目录\design\work\bootgen)。该目录包含一个BIF文件和一个cpu1_bootvec.bin,后者作为修改后的FSBL的一部分,用于阻止其查找和加载更多应用。要生成BIN文件,您需要将生成的三个ELF文件复制到bootgen目录,并对BIF文件进行编辑以确保其中的ELF名称正确无误(如图8所示)。现在您可打开一个ISE命令提示符,并导航至bootgen目录。在这里运行createboot.bat。该步骤将创建boot.bin文件(如图9所示)。图8 & 修改BIF文件图9 & 创建将在Zynq SoC上运行的boot.bin文件然后,您可将该文件下载到Zynq SoC上的非易失性存储器中。该器件的引导将使两个内核启动并执行其各自的程序。使用所提供的工具在Zynq SoC上创建非对称多处理应用可以变得非常简单。使用片上存储器或DDR分区可以很容易地实现两个内核之间的通信。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一Adam Taylor玩转MicroZed系列46:将Zynq SoC上的两个ARM Cortex-A9处理器内核都利用起来 | 电子创新网赛灵思中文社区用Zynq SoC 设计低时延H.264系统
来源:Xilinx
发布时间:[]
  小型快速的流式视频系统结合采用微型H.264核和赛灵思Zynq&SoC。
&&&&&&&&ASSP架构不灵活,而基于FPGA微处理器组合的系统虽然尺寸大但较为灵活,一直以来设计人员为创建PCB占位面积小的基于IP的流式视频系统,除了在这两者之间反复权衡外别无他选。将软核微处理器集成到FPGA,就无需单独的处理器和DRAM,但最终系统的性能可能无法与以外部ARM&处理器为核心且可能还包括USB、以太网及其它有用外设构建的解决方案所提供的性能相媲美。随着赛灵思Zynq&-7000&All&Programmable&SoC&和小型H.264核的问世,现在仅用一组DRAM就可在超小型PCB板上构建出一个具有用多条高速AXI4总线连接起来的ARM双核和高速外设所实现的高性能的系统(见图1)。
  虽然针对FPGA的H.264核问世已有相当长的一段时间,但至今仍没有一款H.264核够快够小,能够达到足以转换1080p30帧视频的水平,而且仍旧适用于小型低成本器件。将A2e&Technologies公司的最新微型H.264核与Zynq&SoC结合使用,可构建一种低时延系统,该系统能够以15-60fps的不同帧速率对720p-4K之间的多种视频流进行编/解码。将A2e&Technologies&H.264核集成到Zynq&SoC器件中,可大幅缩减板级空间并明显减少组件数,同时在Zynq&SoC集成ARM双核还可避免使用单独的微处理器及其必须连接的存储体。
  图1&-&基于单芯片&Zynq&SoC的视频压缩系统&(上)与基于双芯片处理器和FPGA的视频压缩系统对比
  这样可以构建出一个以Linux驱动程序和实时流协议(RTSP)服务器为核心的完整流式视频系统,该系统能够对来自两个摄像头的1080p30帧视频进行压缩,且端到端时延约为10毫秒。A2e&Technologies&H.264核提供纯编码版和编/解码版两个版本。此外,还有一款低时延版本,可将编码时延降至5毫秒以下。1080p30纯编码版需要10000个查找表(LUT),或者说会占用Zynq&Z7020&FPGA架构25%左右的资源,而编/解码版则需要11,000个查找表。
  基于SOC-FPGA的系统
  基于Zynq&SoC的产品比采用特定应用标准产品(ASSP)构建的产品灵活性更高。例如,通过在FPGA架构中内置4个H.264核,并将每个摄像头输入端连接到FPGA,就可以很容易构建一个支持1080p30输入的系统。许多ASSP产品只有两个输入端,这让设计人员不得不想办法多路复用若干视频流到一个输入端。每个A2e&Technologies&H.264核能够处理六个VGA分辨率摄像头或一个1080p30分辨率摄像头。因此,有可能构建一个双核系统,以便对来自12个VGA摄像头输入的视频进行压缩。
  ASSP产品通常仅对已解码视频提供屏幕视控(OSD)功能,这迫使设计人员将OSD信息作为元数据发送或使用ARM内核测定视频帧时间并以编程方式将OSD数据写入视频缓冲区。在FPGA中,在进行视频压缩前添加OSD如同访问IP模块一样简单。同时在压缩引擎前添加鱼眼镜头校正等其它处理模块,也相对容易。此外,FPGA还支持功能的现场与未来升级,例如添加H.265&压缩功能。图2是带有两个1080p30摄像头输入的H.264压缩引擎方框图,其中OSD适用于未压缩图像。
  如何应对延时
  某些应用程序,如遥控飞行器(RPV)的控制,是基于遥控装置发回的流媒体图像反馈。为了控制遥控装置,从传感器发送视频至压缩引擎到解码图像显示(称为&玻璃对玻璃&)之间的时延通常要小于100毫秒。一些设计人员将时延规定在50毫秒内。总时延是如下几项的和:
  视频处理时间(ISP、鱼眼镜头校正等)
  &填充帧缓冲的延迟
  &压缩时间
  &发送数据包引起的软件延迟
  &网络延迟
  &接收数据包引起的软件延迟
  &视频解码时间
  许多系统采用硬件对视频进行编码,但最终却采用标准的视频播放器进行解码,如在PC上运行的VLC。即使媒体播放器的缓冲延迟可从一般的500-1000毫秒大幅减少,但时延仍然远远超过50毫秒。要真正控制时延并保持在绝对最低水平,就需要对已压缩视频流进行硬件解码,而且要求缓冲最小。
  H.264编码器时延通常以帧来表示,如一般在压缩开始前必须缓冲一个完整帧的时间。假设编码器速度可以提高,那么仅通过帧速率加倍即可降低编码时延,也就是说,帧速率为30fps时每帧时延为33毫秒,而帧速率为60fps时每帧时延则为16.5毫秒。
  一种典型的流式视频系统采用RTSP服务器在摄像头与客户端(解码/记录)设备之间创建流式视频连接。RTSP服务器将已压缩的视频传送至客户端以供显示或存储。
  很多时候,由于摄像机和编码器的性能限制该方案无法实施。因此,该解决方案是专门设计用于低延编码器。而最新A2e&Technologies低延时编码器只有16个视频线才需要在压缩开始前进行缓冲。对于1080p30视频流而言,时延不足500微秒(&s)。而对于480p30视频流而言,时延则低于1毫秒。设计人员采用这种低时延编码器可构建出时延可预测且很低的系统。
  为使总时延最小化,必须同时最大限度地降低编码侧和解码侧上缓冲、网络协议栈、RTSP服务器/客户端等引起的时延,因为软件路径会产生很长的时延,而在这种情况下采用低时延编码器毫无意义。RTSP服务器通常用来在服务器(摄像头)与客户端(解码/记录)设备之间创建流式视频连接。连接建立后,RTSP服务器会将压缩的视频传送至客户端以供显示或存储。
  延时最小低化时延
  通常情况下,服务器和客户端的软件组件只要求与带宽匹配,方便传送压缩视频,而不是为了最小化时延。而如Linux之类的非实时操作系统则很难保证时延。典型的解决方案就是为服务器和客户端创建低时延自定义协议。但这种方法的不足之处就是不符合行业标准。另一种方法是采用一种类似RTSP的标准,通过对软件的低层进行修改来最小化时延,同时保证符合各项标准。
  然而,也可采取措施尽量减少内核与用户空间之间的拷贝操作,从而减少相关时延。
  图3&&完整编/解码系统方框图
  而就整个软件路径而言,要减少时延,就需要将RTSP服务器和压缩信息转发任务分离,从而用Linux驱动程序替代RTSP服务器执行发送任务。
  为了降低时延,我们对A2e&Technologies低时延RTSP服务器进行了两处修改。首先,移除转发路径上的RTSP服务器。RTSP服务器仍采用实时控制协议(RTCP)维护统计数据,并随网络目标地址(即IP或MAC目的地地址)的变动定期(或异步)更新内核驱动。第二,内核驱动程序附加必要数据头(基于RTSP服务器提供的信息),通过直接输入网络驱动程序(例如udp_send)立即转发数据包,从而无需在内核和用户空间之间进行内存拷贝。
  图3&显示了基于H.264&IP的完整编/解码系统,总时延不足50毫秒。该系统是根据Zynq&SoC、A2e&Technologies低时延H.264编/解码器与A2e&Technologies&低时延RTSP服务器/客户端而建立的。需要注意的是,从硬件角度来看,编码与解码系统之间唯一真正的区别在于,编码侧必须连接到摄像头/传感器,而解码侧则必须能够为平板显示提供驱动。您可以轻松地设计一个具备编码与解码所需的所有必备硬件功能的电路板。
  为尽量减少实时控制应用中视频压缩/解压缩的时延,设计人员需要特殊编码器和优化的软件。利用赛灵思的Zynq&SoC和&A2e&Technologies的H.264低时延编码器与以及优化的RTSP&服务器/客户端,可在小型PCB板上创建一个时延极低、高度可配置的系统。
活动时间:-
QQ群号:,还有 Xilinx 资深工程师入驻,帮您答疑解惑!!!
ZedBoard及ZingBoard开发优秀手记展示,详情进入……
开发者资源}

我要回帖

更多关于 stm32使用定时器中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信