0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Zynq中程序存储位置和设置方法

CHANBAEK 来源:嵌入式随笔 作者:嵌入式随笔 2023-10-17 17:00 次阅读

Zynq中存储程序的地方有QSPI Flash,SD卡,EMMC。

Zynq的程序分为三部分,上电启动的引导程序(fsbl),FPGA的程序,arm程序。这里以arm程序存储位置为主进行讨论。

1 ARM为裸机程序

裸机程序比较小,可以将全部程序(fsbl,FPGA的程序,arm程序)一起存储在QSPI Flash,SD卡,EMMC中的任何一个位置。

1.1 固化在QSPI FLASH

使用JTAG和sdk固化。

或者先运行程序,然后通过程序将可执行文件写入到QSPI Flash中,然后将启动方式设置为QSPI Flash启动,下次启动就可以从QSPI Flash启动了。

1.2 固化在SD卡

通过读卡器将可执行文件复制进SD卡,将启动方式设置为SD卡启动,下次启动就可以从SD卡启动了。

1.3 固化在EMMC中

先运行sd卡中的程序(或者通过jtag运行程序),然后通过程序将可执行文件写入到emmc中,然后将启动方式设置为emmc启动,下次启动就可以从emmc启动了。

2 ARM为运行linux的程序

linux跟文件系统一般比较大,全部固化在QSPI Flash中装不下。可以在QSPI Flash中固化一部分。

2.1 部分固化在QSPI FLASH中

可以在QSPI Flash中固化 fsbl+uboot+FPGA的程序+linux内核+设备树,将根文件系统存储在emmc中。

fsbl+uboot本身已经可以运行,uboot运行后会将其余部分拷贝到内存继续运行。以下是uboot中的zynq-common.h中的一部分程序。

"qspiboot=echo Copying Linux from QSPI flash to RAM... && " 
 "sf probe 0 0 0 && " 
 "sf read ${bitstream_load_address} 0x120000 ${bitstream_size} && " 
 "fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && " 
 "sf read ${kernel_load_address} 0x540000 ${kernel_size} && " 
 "sf read ${devicetree_load_address} 0x520000 ${devicetree_size} && " 
 "bootz ${kernel_load_address} - ${devicetree_load_address}�"

第三行是将fpga文件拷贝到内存中,第四行是处理内存中的fpga程序,第五行是将linux内核文件拷贝到内存中,第六行是将设备树文件拷贝到内存中。然后开始运行内核。内核运行后会去运行emmc中的根文件系统。

可以看出 fsbl+uboot+FPGA的程序和裸机程序是一样的,剩下的就是uboot执行程序的一部分。如果linux内核+设备树存储在别的地方,只需要将上述程序修改为从相应地方拷贝到内存就可以。

固化的话,可以在sd卡中先运行程序,然后按照设定将QSPI Flash分区并将对应的执行程序复制进QSPI Flash中,将emmc格式化为ext4文件系统在将跟文件系统复制进emmc中。再将启动方式设置为QSPI Flash启动,下次启动就可以从qspi启动了。

Qspi存储程序的分区大小可以自定义但是要能存的下程序,比如fpga程序3Mb不能只给个2Mb的分区。

2.2 固化在SD卡

通过读卡器将可执行文件复制进SD卡,将启动方式设置为SD卡启动,下次启动就可以从SD卡启动了。

2.3 固化在EMMC中

先运行sd卡中的程序,然后通过程序将可执行文件写入到emmc中,然后将启动方式设置为emmc启动,下次启动就可以从emmc启动了。

3 区别与联系

可以看出带Linux的就是多了一段跳转,固化在QSPI Flash中的时候由于全部程序比较大需要分散放。fsbl+第一段ARM程序需要在一起并且名字是固定的为BOOT.BIN(这是芯片内部预置程序决定的)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1638

    浏览量

    148214
  • Linux
    +关注

    关注

    87

    文章

    11322

    浏览量

    209870
  • 程序
    +关注

    关注

    117

    文章

    3792

    浏览量

    81186
  • Zynq
    +关注

    关注

    10

    文章

    610

    浏览量

    47216
  • emmc
    +关注

    关注

    7

    文章

    216

    浏览量

    52785
收藏 人收藏

    评论

    相关推荐

    让STM32应用与存储位置无关

    最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统
    发表于 09-05 11:43 825次阅读

    win10 IE浏览器无法更改临时文件夹存储位置

    临时文件修改不了存储位置的问题。这是怎么回事呢?接下来,小编就给大家介绍下win10系统下无法更改ie临时文件位置的解决方案。具体方法如下: 1、每次用ie修改,注销后还是没有改变。2、可以通过修改注册表
    发表于 03-08 13:46

    Keil C51 使用C语言编写程序,怎么设置程序的起始存储位置从0x1000开始

    使用STC 的IAP系列单片机,打算自己写一段更新程序。求教C语言编写的话要如何设置程序的起始存储位置,该段程序准备
    发表于 02-09 17:27

    【求助】指定变量在各个片上存储区域的存储位置时出现...

    由于程序的运算量很大,想把L1D和L2当做普通RAM,并将指定的数组变量存储在L1D和L2中。我的操作方法如下: 1. 先对L1DCFG和L2CFG寄存器进行操作,将L1D和L2配置为普通RAM而非
    发表于 05-13 06:40

    C语言中局部变量的存储位置是如何分配的?

    ADS下C语言中局部变量的存储位置是如何分配的?
    发表于 04-26 06:31

    Proteus中程序的调试及仿真的方法

    1.仿真的方法:将编译好的程序载入单片机1双击绘制完电路原理图中的单片机→在弹出的窗口中,点击“Program File”后边的小文件夹2找到之前编译好的C语言程序文件(2.2中的第⑤步所在
    发表于 11-23 06:07

    存储位元与存储单元是什么含义

    存储位元与存储单元是什么含义?数据通信的方式可以分为哪几种呢?
    发表于 01-21 07:17

    调试TMS570的F021库时 cmd文件设置程序放到指定位置,但实际指定位置的内存却全是FF,会是什么原因?

    在使用TMS570调试TI的F021库时,cmd文件已经设置了代码的存储位置,但是在查看内存数据时,指定的存储位置都是0xFFFFFFFF,有人遇到过同样的问题吗?
    发表于 04-17 10:21

    linux中程序调试的方法

    这是一个基本的调试问题的方法。 我们在程序中怀疑的地方插入print语句来了解程序的运行流程控制流和变量值的改变。
    发表于 06-16 09:34 2000次阅读
    linux<b class='flag-5'>中程序</b>调试的<b class='flag-5'>方法</b>

    Proteus中程序的调试(Proteus与ICCAVR的联合调试)

    1.仿真的方法:将编译好的程序载入单片机1双击绘制完电路原理图中的单片机→在弹出的窗口中,点击“Program File”后边的小文件夹2找到之前编译好的C语言程序文件(2.2中的第⑤步所在
    发表于 11-15 13:21 11次下载
    Proteus<b class='flag-5'>中程序</b>的调试(Proteus与ICCAVR的联合调试)

    单片机中程序和数据存放位置、与电脑内存和硬盘的类比,单片机和计算机程序启动流程对比

    单片机中程序和数据存放位置、与电脑内存和硬盘的类比,单片机和计算机程序启动流程对比
    发表于 11-26 17:51 14次下载
    单片机<b class='flag-5'>中程序</b>和数据存放<b class='flag-5'>位置</b>、与电脑内存和硬盘的类比,单片机和计算机<b class='flag-5'>程序</b>启动流程对比

    如何开发与位置无关的 STM32 完整工程

    最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。
    的头像 发表于 09-15 09:59 1663次阅读

    如何修改边沿存储位的地址

    说明 使用“扫描 RLO 的信号上升沿”指令,可查询逻辑运算结果 (RLO) 的信号状态从“0”到“1”的更改。该指令将比较 RLO 的当前信号状态与保存在边沿存储位( )中上一次查询的信号状态
    的头像 发表于 06-28 16:20 876次阅读
    如何修改边沿<b class='flag-5'>存储位</b>的地址

    如何开发与存储位置无关的STM32应用?

    如何开发与存储位置无关的STM32应用?
    的头像 发表于 10-18 16:46 613次阅读
    如何开发与<b class='flag-5'>存储位置</b>无关的STM32应用?

    怎么更改电脑上的云存储位置,更改电脑上的云存储位置教程

    。那要怎么更改电脑上的云存储位置呢?     更改电脑上的云存储位置通常是指将云存储服务(如OneDrive、GoogleDrive、Dropbox等)同步的文件夹位置从默认
    的头像 发表于 01-07 16:43 103次阅读
    怎么更改电脑上的云<b class='flag-5'>存储位置</b>,更改电脑上的云<b class='flag-5'>存储位置</b>教程