大于16MB的QSPI存放程序引起的ZYNQ重启风险

  ZYNQ芯片是近两年比较流行的片子,双ARM+FPGA,在使用分立FPGA和CPU的场合很容易替代原来的分立器件。

  ZYNQ可以外接QSPI FLASH作为程序的存储介质。

  QSPI和SPI flash是串行接口的NOR FLASH,在设计支持,容量都比较小,所以协议中只留了3Bytes寻址,也就是最大16MB空间。但是随着工艺和技术的提升,现在32MB、64MB,甚至128MB和更大容量的SPI/QSPI flash都出现了。

  

  以32MB为例,当需要访问大于16MB的地址是,新的器件提供了两种方法:

  1. 切换bank,每个bank 16MB,地址扔采用3Byte模式,只能访问此bank,需要访问高地址时,切换到高bank;

  2. 切换到4Btyes地址模式,通过命令,可以把flash从3Bytes传统模式切换到4Bytes新模式

  以上方法都可以实现大于16MB地址的访问,软件可以随便玩。但是,ZYNQ有个设计问题,固化到片子内部的bootrom,“固执”得认为外面接的qpsi flash是16MB的,只能访问这16MB:

  如果cold reset,flash自然会处于BOOTROM认识的状态;

  但是warm reset时,如果之前切换到别的bank或者进入4Bytes模式,就会导致BOOTROM找不到正确的景象,从而启动失败。这是由血泪教训验证出来的。所以软件在主动复位之前,一定要把flash设置为默认的模式;如果系统外接了硬件看门狗,看门狗也reset要一并拉到flash的reset引脚上!!!

  

时间: 2024-08-13 09:20:20

大于16MB的QSPI存放程序引起的ZYNQ重启风险的相关文章

SharePoint自定义程序页面部署 不用重启IIS

SharePoint的部署方式默认是部署WSP包,尤其是有多个前端的时候WSP包的部署显得非常方便和快捷,但是WSP的部署需要重启整个IIS服务会造成SharePoint站点一段时间不能访问.结合自己项目的情况这里我们提出文件对考的方式来替代WSP包的部署.这里有两个地方需要注意: 1. 我们的SharePoint项目不会影响SharePoint内容数据库: 2. IIS不重启,但是SharePoint站点对应的应用程序池会自动回收 这里我们以一个demo来做说明: 如图我们的SharePoin

linux用于后台监控指定程序运行状况的脚本(如果程序死了则重启程序)

#!/bin/sh while true do ps | grep "main_3g" | grep -v "grep" > /dev/null if [ "$?" -ne 0 ] then ls /root/main_3g > /dev/null if [ "$?" -eq 0 ] then chmod 777 /root/main_3g /root/main_3g & echo "main_3

Python(54)_大于66的分组存放在字典里

#-*-coding:utf-8-*- ''' 分别放在列表里 ''' li = [11,22,33,44,55,66,77,88,99,110] result ={} for row in li: if row>66: if 'key1' not in result: # 如果不在,就创建键值对,空列表 result['key1'] =[] result['key1'].append(row) else: if 'key2' not in result: # 如果不在,就创建键值对,空列表 r

程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)

TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDownStatus); var     NewState:       TTokenPrivileges;     lpLuid:         Int64;     ReturnLength:   DWord;     ToKenHandle:    Cardinal;  begin     Open

java:如何让程序按要求自行重启?

正文开始前的废话: 这里的程序即包括b/s的web application,也包括standalone的类c/s的java application. 为什么要自我重启? 场景1:分布式环境中,一般会有很多应用(即包括c/s的java application,又有b/s的web application)部署在不同的环境中,为了管理方便,通常会把一些公用的配置,比如:报警发邮件用的邮箱账号/密码/smtp信息,公用的ftp账号信息,甚至jdbc的连接串信息等,统一放在某个位置(共享的网络存储目录.r

C#怎样处理xml文件的大于号和小于号等常用符号(xml符号引发的程序错误)

在程序中由xml配置而成的sql语句要转换为C#支持的sql语句 <settings> <select> a.*</select> <from> (select top 1 (select COUNT(*) from OmsOrder as a left join SysState as b on (a.[State] = b.Value and b.StateType='StateDefault') where a.[State] = 0  and dat

单片机程序的存放

1)对于烧录在单片机里面的程序,程序的代码段,data段,bss段,rodata段等都存放在单片机的Flash中.当单片机上电后,初始化汇编代码将data段,bss段,复制到单片机的RAM中,并建立好堆栈,开始调用程序的main函数.以后,便有了程序存储器和数据存储器之分,程序运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据. 2)RAM->存放data段,bss段,堆栈段: ROM->存放代码段(code 段)与只读数据段(rodata段); 3)bss段

程序的内存分配

本人收集整理!感觉非常经典,,与众人阅之! 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack):由编译器自动分配释放 ,站的特点是空间小但被CPU访问的速度快,使用户存放程序中临时创建的变量.由于桟的后进后出的特点,所以桟特别方便用来保存和恢复调用现场.用于存储占用空间长度不变并且占用空间小的数据类型的内存段,而相同类型的数据占用的空间是等长的,其操作方式类似于数据结构中的栈. 2.堆区(heap):它大小并不固定,可动态扩张或缩减.用于存放数据长度可变或内存占用较大的

程序的内存空间 堆空间和栈空间的区别

一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack): 由编译器自动分配释放,其操作方式类似于数据结构的栈. 用于存放函数的参数值,用户程序临时创建的局部变量等,即函数括号"{}"中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量).除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,等到调用结束后,函数的返回值也会被存放回栈中. 由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场.从这个意义上讲,可以把栈看成