`
473687880
  • 浏览: 535353 次
文章分类
社区版块
存档分类
最新评论

ZYNQ "HELLO,WORLD!"背后的故事

 
阅读更多
之前看到一篇比较好的博文,转载了。
我等电子爱好者拿到一块开发板当然首先就是让他输出HELLO,WORLD的啦。ZYNQ作为XILINX推出的最新的ALL PROGRAMME平台自然也无法逃离此等“厄运”。
让ZYNQ输出"HELLO,WORLD"非常简单,ZEDBOARD.ORG网站上已有ZedBoard_CTT_v14.1文档,大家按照文档中的步骤就能通过串行接口看到输出了。如果不太明白也可以到BAIDU上搜索ZEDBOARD,很多前辈已经把输出"HELLO,WORLD"的步骤图文并茂的一步一步给出了。图1就是main函数的截图,可以看到该函数非常的简单,首先初始化 平台,然后利用“重定向把printf”函数的输出定位到串口上。
注意到代码中把init_platform和cleanup_platform函数已经被注释掉了,难道只有
一个printf就能输出吗?当然,查看Init_platform()和cleanup_platform()源码我们会发现其实这两个函数和串口输出并没有任何关系,这两个函数的作用就是打开系统的CACHE和关闭系统CACHE(Init_platform函数中包含有init_uart函数,但仔细观察发现只有在系统中定义了STDOUT_IS_16550宏,init_uart函数中的语句才起作用,否则该函数就是一个空函数。而在本例子中我们是并没有用到STDOUT,所以根本没有定义 STDOUT_IS_16550宏)。
看到这个估计很多人都有个疑问:串口在使用之前不是应该初始化的吗?至少要设置一下波特率啥的吧?看代码中,似乎没有对ZYNQ的串口进行初始化就使用了,难道ZYNQ太先进了不用初始化?
在讨论这个问题之前让我们先来看看ZYNQ的结构以及ARM的启动过程。ZYNQ中包含有2个ARM CORTEX-A9的核(PS)和PL逻辑单元。ZYNQ支持多种启动模块,总的来说包括安全和不安全的两种引导方式。引导主要是通过PS部分来完成。对于安全引导来说,PL部分必须启动以便使用其中的安全模块,通过这些模块可以完成256位AES和SHA授权。在系统复位后,系统将会检测模式引脚上的电平状态,以此来决定从哪个设备(NOR,NAND,QUAD-SPI或JTAG)来引导系统。当然,JTAG方式只能工作在不安全引导方式下,通常该模式是用来调试系统的。在决定从哪个设备引导系统后,其中一个ARM A9的核开始执行片外ROM中的代码并拷贝第一阶段BOOT LOADER(FSBL)到OCM中。拷贝完成后,处理器开始执行FSBL,系统开始对PS部分进行初始化并可以开始配置PL模块(当然,你也可以不配置PL模块)。通常,在FSBL中需要包含对第二阶段代码(SSBL)的载入(如UBOOT)。SSBL继续对处理器进行配置直到系统完全完成初始化。
既然在执行MAIN函数之前还有这么多步骤,那么这些代码到底写在哪里呢?打开工程目录下的SDK\SDK_Export\hello_world_bsp_0\ps7_cortexa9_0\libsrc\standalone_v3_05_a\路径下的SRC文件夹,里面有asm_vectors.S
boot.S
cpu_init.S
translation_table.s
xil-crt0.S等5个文件,它们都是.s结尾的汇编文件,根据以往的经验,这些都应该是最底层的,系统启动后首先执行的文件。我们知道ARM启动都是从0x00地址开始的,而在这个地址上放的应该是中断向量表,根据这个线索,我们首先查看asm_vectors.S文件,文件的最开头如图2所示:
这里就是中断向量表,ZYNQ启动后所运行的第一句话就是B _boot,这是一个跳转语句,直接跳转到boot.s文件中的 _boot 标号处开始执行后面的语句,由于后面的代码比较长,在此就不赘述了。boot.s中的代码主要完成MMU、CACHE的初始化以及ARM各种模式下栈基地址的配置,最后通过
b _start
语句跳转到_start标号中继续执行。_start标号在xil-crt0.S文件中被实现,代码如下:
_start:
bl __cpu_init /* Initialize the CPU first (BSP provides this) */
mov r0, #0
/* clear sbss */
ldr r1,.Lsbss_start /* calculate beginning of the SBSS */
ldr r2,.Lsbss_end /* calculate end of the SBSS */
.Lloop_sbss:
cmp r1,r2
bge .Lenclsbss /* If no SBSS, no clearing required */
str r0, [r1], #4
b .Lloop_sbss
.Lenclsbss:
/* clear bss */
ldr r1,.Lbss_start /* calculate beginning of the BSS */
ldr r2,.Lbss_end /* calculate end of the BSS */
.Lloop_bss:
cmp r1,r2
bge .Lenclbss /* If no BSS, no clearing required */
str r0, [r1], #4
b .Lloop_bss
.Lenclbss:
/* set stack pointer */
ldr r13,.Lstack /* stack address */
/* Initialize STDOUT to 115200bps */
ldr r0, =UART_BAUDRATE
bl Init_Uart
#ifdef PROFILING /* defined in Makefile */
/* Setup profiling stuff */
bl _profile_init
#endif /* PROFILING */
/* Initialize the SMC interfaces for NOR and SRAM */
#ifndef USE_AMP
bl XSmc_NorInit
bl XSmc_SramInit
#endif
/* make sure argc and argv are valid */
mov r0, #0
mov r1, #0
/* Let her rip */
bl main
代码首先通过语句bl __cpu_init 跳转到_cpu_init标号处(该标号在cpu_init.S文件中,其中的代码主要对cp15寄存器进行操作),随后代码对SBSS段、BSS段以及栈指针R13进行初始化,紧接着通过语句bl Init_Uart跳转到UART.C文件中对串口进行初始化;通过语句bl XSmc_NorInit和bl XSmc_SramInit对NOR和SRAM存储器进行初始化,最后调用bl main跳转到我们的MAIN函数中开始执行用户的程序。
这下我们就可以解释开始所提出的问题了,实际中ZYNQ的串口并不是不需要初始化,而是在进入main函数之前就已经被初始化过了,其所用的波特率在xil-crt0.S文件的顶头被宏定义过,默认为115200BPS。如果我们要用其它的波特率的话,理论上来说在该处更改即可。为什么说理论上呢?因为在实际中更改此处是不行的,究其原因我认为是由于xil-crt0.S是系统生成,如果我们更改后不编译该文件那么自然不能更改波特率;如果编译该文件则EDK会自动从系统中重新拷一个xil-crt0.S文件到项目中, 这也就把我们更改过的文件覆盖了。所以,如果我们需要更改串口的波特率的话最简便的方法就是在main函数中再调用一次Init_Uart函数,指定其输入参数为我们所需要的波特率,如9600.
总结一下,其实ZYNQ中的ARM和我们平时所用的ARM启动方式上并没有任何差别,也是从中断向量表开始然后经过多次跳转最终调用用户程序的MAIN函数。用流程图表示如下所示:


总结如下:

实际中ZYNQ的串口并不是不需要初始化,而是在进入main函数之前就已经被初始化过了,如果我们需要更改串口的波特率的话最简便的方法就是在main函数中再调用一次Init_Uart函数,指定其输入参数为我们所需要的波特率,如9600.


分享到:
评论

相关推荐

    zynq_hello_world

    在本文中,我们将深入探讨"Zynq PS下的裸奔Hello_World"这一主题,它涉及到嵌入式系统设计中的关键概念,特别是Xilinx公司的Zynq系列片上系统(SoC)。Zynq结合了可编程逻辑(PL)和处理器系统(PS),为开发者提供...

    ZYNQ 矿板EBAZ4205的例helloworld

    《ZYNQ矿板EBAZ4205的“Hello World”实例解析》 在电子工程领域,尤其是嵌入式系统设计中,ZYNQ系列芯片因其独特的FPGA(Field-Programmable Gate Array)与ARM处理器的结合,成为了一个备受关注的平台。本文将...

    Zynq ARM PS helloworld工程

    《Zynq ARM PS helloworld工程详解》 Zynq ARM PS helloworld工程是一个基础的嵌入式系统开发实例,旨在帮助开发者理解如何在Xilinx的Zynq片上系统(System-on-Chip,SoC)的处理系统(Processing System,PS)端...

    Xilinx zynq 7020移植uCOS_HelloWorld

    在本文中,我们将深入探讨如何在Xilinx Zynq 7020 SoC上移植并运行uCOS操作系统,以实现一个简单的"HelloWorld"示例。Zynq 7020是一款高度集成的系统级芯片(SoC),集成了可编程逻辑(FPGA)与ARM Cortex-A9双核...

    ZYNQ 矿板EBAZ4205的例子helloworld

    在本文中,我们将深入探讨基于Xilinx ZYNQ FPGA平台的EBAZ4205矿板,并通过一个具体的例子——“helloworld”项目,来理解如何在该平台上进行开发工作。ZYNQ(Zynq-7000 All Programmable SoC)是由Xilinx公司推出的...

    基于Zynq 7000实现最简单PS核工作的hello world工程

    基于Zynq 7000实现最简单PS+PL串口工作的hello world工程,适合入门上手了解vivado整个操作过程

    PS部分HELLO_WORLD.rar_Xilinx_ZYNQ7000_ps_world

    在本文中,我们将深入探讨与"PS部分HELLO_WORLD.rar_Xilinx_ZYNQ7000_ps_world"相关的知识,这个主题主要涉及Xilinx公司的ZYNQ7000系列SoC(System on Chip)以及如何通过编程实现“Hello World”实例。Xilinx ZYNQ...

    黑金ZYNQ7035-ps端打印一个helloworld

    标题中的“黑金ZYNQ7035-ps端打印一个helloworld”指的是在基于Xilinx ZYNQ7035的嵌入式系统中,通过处理器系统(PS,Processing System)实现打印“Hello World”这个经典的程序示例。ZYNQ7035是Xilinx公司生产的...

    hello_world.rar

    在这个特定的情况下,这个压缩包是关于ZYNQ FPGA平台的Vivado 2018工程,目标是输出简单的"Hello World!"信息。这通常是一个初学者入门的典型示例,用于验证硬件设计的功能。 描述部分提供了更多细节。"zedboard"是...

    PS_helloworld.zip

    总结来说,这个“PS_helloworld.zip”项目涵盖了FPGA设计的基础流程,包括Vivado的使用、硬件描述语言编程、硬件平台配置、SDK中的C语言编程以及软件与硬件的交互。通过这个项目,初学者可以了解到一个完整的嵌入式...

    S02CH01_HelloWorld.rar_vivado zynq_vivado入门_zynq

    用zynq板子在vivado上实现一个简单的helloworld程序

    Zynq(2)从Hello World熟悉Zynq开发流程

    包含vitis工程,vivado工程,通过PS端串口实现打印HelloWorld的实验。

    zcu102_zynqMpsoc_uart_hello_world源码

    zcu102 zynq Mpsoc uart hello world project and code&&vivado and sdk 2017.4 博客原文:https://mp.csdn.net/editor/html/115321575

    xilinx zynq7000移植sqlite3

    ### Xilinx Zynq7000上SQLite3的移植详解 #### 一、引言 随着嵌入式系统的不断发展,对于数据管理的需求也日益增长。SQLite作为一个轻量级的关系型数据库管理系统,因其体积小、功能强大且易于移植等特点,在嵌入式...

    zynq ultrascale双核逻辑测试工程

    在“双串口独立运行打印helloworld!”的实现中,我们需要对每个CPU配置单独的中断控制器和串口驱动,确保它们在没有操作系统的情况下能够独立工作。每个CPU将负责控制一个串口设备,发送“Hello World!”消息。这...

    vivado+vitis 2021.2 EBAZ4203 helloworld例程

    总的来说,通过Vivado和Vitis 2021.2,我们可以实现一个在ZYNQ平台上运行的EBAZ4203 HelloWorld示例,利用UART1接口每10毫秒发送数据。这个例子不仅展示了ZYNQ SoC的软硬件协同设计能力,也揭示了Vivado和Vitis工具...

    zeboard上PS部分完成HelloWord

    在本文中,我们将深入探讨如何在Zynq FPGA平台的 Processing System (PS) 部分实现"Hello World"程序,并在串口终端上显示输出。"zeboard"是一款基于Zynq SoC(系统级芯片)的开发板,它集成了ARM处理器核和FPGA逻辑...

    Hellow world

    3. **创建硬件描述**:在Vivado中,我们不需要编写硬件描述来实现“Hello World”,因为这将由Zynq SoC的内建处理器处理。不过,如果你想要自定义FPGA逻辑,可以在IP Catalog中添加必要的IP核,例如,可以创建一个...

Global site tag (gtag.js) - Google Analytics