写在前面

ZYNQ固化时,正常情况下都需要DDR参与,但是有时硬件设计时,可能将DDR去掉或设计出错,这将导致ZYNQ无法正常固化,之前有写过一个使用静态链接库进行无DDR固化的文章,当时那个是压缩了FSBL的相关代码只保留FLASH模式下的功能,对于其他模式可能无法正常使用,本文将无DDR固化的情况进一步进行介绍,讲解如何修改FSBL实现ZYNQ的程序固化,给出一个demo进行演示测试。

适用范围

不论是之前提到的静态链接库的版本还是本文版本(暂且叫做运行在OCM版本)。都只适合PS端的轻量级代码,PL端无特殊要求,但是PL PS交互部分如果需要太多驱动可能也会超出片上RAM的空间。本工程根本思想就是将fsbl分配到较大的com0上,其余应用工程分配到ocm1上。

建立工程

建立一个Block design,添加zynq核,然后勾选,FLASH和UART部分。

这里为了验证PL端功能正常启动,添加了一个逻辑常数用于驱动LED灯。

创建HDL顶层,生成output products,因为涉及到PL端部分,所以需要综合导出生成bitstream,不要忘记加管脚约束。

当运行生成bitstream后,导出硬件,并且包含bit流文件。

准备好硬件平台后就可以进行SDK的FSBL代码的修改了。

SDK代码修改

新建应用工程建一个helloworld工程,打开lscript.ld文件将helloworld的代码段映射区对应到ps7_ram_1,保存编译。

新建应用工程建一个fsbl工程,打开lscript.ld文件将helloworld的代码段映射区对应到ps7_ram_0,保存编译。

打开fsbl代码的fsbl_debug.h文件,增加FSBL_DEBUG_INFO的宏定义方便进行查看fsbl的调试信息。

打开main.c文件,找到main函数,定位到296行附近,在这里可以看到因为缺少ddr的部分,该部分代码将不会正常执行,将会跳转到下面的代码中。

代码以下两行代码执行后FSBL 状态打印输出0XA008,在fsbl.h文件中对应DDR missing 的状态。

因此要想使得代码正常运行就要将正常存在ddr时的代码正常运行,仅删除和DDR强有关的部分(影响编译和运行的),然后将代码运行地址设置到OCM上。

所以,取消对296行的定义改成如下内容。

此时如果使用当前版本的fsbl的可执行文件可以正常进行烧写固化了。但是可能此时还是无法正常启动,下面步骤用于演示并定位具体问题。

选中helloworld工程创建镜像工程。

BootLoader选中刚刚修改好的fsbl.elf。

打开开发板,选择jtag模式下烧写,选择创建好的镜像和刚刚的fsbl的elf文件。

正在烧写…

烧写完成后关掉开发板,切换到flash模式下打开串口观察应用程序能否正常启动。在我的开发板FPGA done的指示灯和PL端的LED等都只是闪烁了一下,不能正常启动。

此时还在flash模式下去尝试在线烧写。从调试信息可见,FLASH正常启动,启动初始化后存在失败,单步调试后发现main函数的在570行的LoadBootImage()运行后就会存在上述问题。

定位到image_mover.c的436行,发现此处的DDR_END_ADDR的默认定义是0X00,无法正常执行下面的程序。

所以这里修改DDR_END_ADDR为片上rom的结束地址。

再次重复操作,完成镜像生成后,jtag模式烧写,flash模式启动,观察打印调试信息。从调试信息中可以看到,PS端正常启动,此时挂在PL端的LED灯也能正常点亮。

ZYNQ - 无DDR固化程序(代码运行在OCM上)相关推荐

  1. 华为方舟编译器和鸿蒙,终于来了,方舟编译后程序完美运行在鸿蒙上,脱离安卓就在眼前?...

    华为鸿蒙系统又传来新捷报,华为方舟编辑器完成并优化了首款应用新浪新闻,编译后的程序可以在鸿蒙上运用,可定有人好奇鸿蒙之前不就是已经存在EMUI上,华为手机上目前不是已经在用,这又是怎么回事呢? 鸿蒙历 ...

  2. [oracle原]访问局域网内出现“ORA-12541:TNS:无监听程序”

    近日在服务器局域网内27电脑上安装了oracle11g,本机上访问此数据库正常.但在局域网内其它机器上访问27上的数据库时,出现"ORA-12541:TNS:无监听程序"错误. 查 ...

  3. 为什么单片机的代码在Flash中运行,单片机的代码运行位置跟电脑有什么不同?

    1. 单片机与电脑,在代码运行空间的区别 单片机与 电脑/Linux嵌入式 在代码运行的空间上不同.大多数单片机,代码都是在Flash中运行的.而电脑/linux嵌入式,是将代码从存储介质(可能是硬盘 ...

  4. zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

    原标题:如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计 简介 作者: Alex He (何晔), 赛灵思高级嵌入式应用工程师 这里的 UIO 即 Userspa ...

  5. zynq+linux固化程序,MiZ702学习笔记6——ZYNQ如何固化程序

    上次,我们讲到了EMIO的使用,其实那就是一个最简的"PS + PL"运用的体现.我们之前是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序.但是 ...

  6. 【ZYNQ】QSPI Flash 固化程序全攻略

    普通的 FPGA 一般是可以从 Flash 启动,或者被动加载,ZYNQ 的启动是由 ARM 主导的,包括 FPGA 程序的加载,ZYNQ 启动一般为最少两个步骤,在 UG585 中也有介绍. Sta ...

  7. 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)

    1.日常聊一聊 今天为大家带来一篇对于单片机学习的小伙伴非常重量级的一篇文章<深度剖析单片机程序的运行(C语言版本)>,该文章会比较全面的为大家解析我们的用C语言编译出来的程序是如何在单片 ...

  8. Java 从虚拟机层面看程序代码是怎么运行起来的

    专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java ...

  9. 社区圆桌分享:代码学习无止境,程序员如何规划自己的职业生涯发展?

    CloudWeGo Study Group 是由 CloudWeGo 社区发起的学习小组,开展以 30 天为一期的源码解读和学习活动,帮助新成员融入社区圈子,和社区 Committer 互动交流,并学 ...

最新文章

  1. Ubuntu 10.10系统安装手记
  2. 资深专家深度剖析Kubernetes API Server第1章(共3章)
  3. gin HTTP/2 服务器推送
  4. java jquery基础_day20:JQuery基础(超系统的JavaWEB全套教程)
  5. 深度学习 正则化 正则化率_何时以及如何在深度学习中使用正则化
  6. ios 跨域_如何在iOS和Android中建立跨域通信桥
  7. 单片机传输浮点数给android,请问单片机怎么接收从串口发送过来的浮点数?
  8. 表单-图片浏览上传-单选框(二)
  9. 如何测试软件的性能瓶颈,性能测试如何定位瓶颈
  10. C# CollectionBase,ICloneeable
  11. 体验:Office SharePoint foundation 2010 Beta版安装使用
  12. 文远知行公布自动驾驶运营路线图:全新升级自动驾驶方案,建立500辆规模的自动驾驶车队...
  13. 各国在计算机视觉领域论文数,计算机视觉论文
  14. java 504错误怎么解决_前端报504错误如何定位
  15. 桥接模式+C#发送邮件+配置文件
  16. 物联网技能大赛-Ubuntu-(1)
  17. java qq验证_用Java代码来校验QQ号
  18. 鼠标能动但是无法点击屏幕(间歇性)
  19. 求1+2!+3!+...+n!的和。
  20. NASA发布史上最深的宇宙全彩照!韦伯如何回传150万公里外的太空数据?

热门文章

  1. 机器学习——马尔可夫模型及马尔可夫决策过程(MDP)
  2. 如何关闭ie 增强的安全配置
  3. openpyxl 单元格合并
  4. Element DatePicker 日期选择器禁用单个指定日期
  5. MySQL 数据库的基本操作
  6. 在 Selenium 中使用 Lambdatest 进行跨浏览器测试
  7. 考研政治80+经验:政治86分教你怎么复习
  8. Opengl绘制网格模型
  9. 有三类人永远做不了程序员
  10. reference_line_provider