ARM-Gicv2 第三章学习
多核处理不同中断
SGI:N-N 模型。
外设中断:1-N 模型。识别支持的中断GICD_ISENABLERn访问 GICD_ISENABLERn,来了解 GIC 目前支持那些中断,GICD_ISENABLER0[15:0] 对应 SGI 0-15,GICD_ISENABLER0[31:16] 对应 PPI 16-31。以此类推 GICD_ISENABLE1[31:0] 对应 SPI 32 - 63。
对于一个中断,如果不被支持,则对应的寄存器位读为0且写无效;如果支持且永久启用,对应的寄存器读为1且写无效,其余的读写规则:
操作方法
访问 GICD_TYPER.ITLinesNumber 揭示有多少数量的 GICD_ISENABLER。
写 GICD_CTLR 来禁用分发器分发中断
对于每个 GICD_ISENABLER 的位对应的中断,利用不支持则写无效原则,写 0xffffffff 给寄存器,再次读寄存器,读出 1 则可知道支持的中断号。
识别永久启用的中断GICD_ICENABLERn访问 GICD_ICENABLERn,来了解 GIC 目前关闭哪些中断,其是 GICD_ ...
ARM-Gicv2 第二章学习
GIC 组成分发器 Distributor分发器的功能是定义优先级和将中断分发给GIC的CPU结构,其寄存器以 GICD_ 前缀识别。
CPU 接口介绍每个 CPU 接口层提供优先级掩码和抢占处理,其寄存器以 GICC_ 前缀识别。
虚拟 CPU 接口虚拟接口控制器最主要部分是一套寄存器,包含一个当前虚拟机正在处理和等待的中断表。一般情况下,这些寄存器被运行在此处理器上的Hypervisor管理,以 GICH_ 前缀识别。
虚拟 CPU 接口每个虚拟 CPU 接口对于虚拟中断提供物理信号对于连接到的处理器。ARM 处理器虚拟化扩展将这些中断信号发送到当前处理器正在执行的虚拟机上。虚拟CPU接口的寄存器可以被虚拟机访问,提供中断控制和状态信息。格式类似于 CPU 接口,以 GICV_ 前缀识别。在实现了虚拟化扩展的GIC中,Hypervisor有义务在切换虚拟机时切换 GICH 中存储的信息。
图示
Distributor功能分发器集中所有的中断源,确定每个中断的优先级,并为每个CPU接口转发具有最高优先级的中断到该接口,以进行优先级屏蔽和抢占处理。
可配置参数
全局启用中断分发。
开 ...
ARM-Gicv2 第一章学习
介绍GIC 功能
为管理中断资源、中断行为进行注册,并对中断进行路由。
支持 ARM 安全扩展、虚拟化扩展
启用、禁用来自硬件的中断
SGI(软件中断)
中断掩码和优先级设置
在电源管理环境中产生唤醒事件。GIC 分组
将每个中断配置为组 0 或者组 1。
将组 0 的中断以 IRQ 或者 FIQ 的形式发到处理器。
将组 1 的中断以 IRQ 的形式发送到处理器。
以一个统一的表来处理组0组1中断的优先级。
对组0的某些中断可以锁定。在许多 ARM 架构的实现中,IRQ 和 FIQ 中断请求对应于 IRQ 和 FIQ 异步异常。
GIC 安全支持对于实现了安全扩展的处理器:
组 0 中断为安全中断、组 1 中断为非安全中断。
处理器对 GIC 寄存器的访问分为安全与非安全。
非安全访问只能读写控制非安全中断的寄存器。
安全访问可以读写任意寄存器。
安全系统软件单独将每个已实施的中断定义为安全和非安全。GIC 虚拟化支持支持对于虚拟中断的处理,降低 Hypervisor 路由中断到虚拟机的开销。术语介绍中断状态
Inactive: 中断是未触发或者不在等待被处理。
Pending ...
ZCU102提升-PL 协同 PS
写在开头本文正式对 ZynqMP Ultrascale+ 的重点特性—— PL 协同 PS 共同工作进行了初步探索。具体为在 PL 段烧写两个 GPIO 控制器来控制 LED 灯和五个按钮,并编写 PS段程序实现按钮通过中断来控制 LED 灯。
探索过程极其曲折,以至于笔者不得不用一张图来表达现在的心情:
Vivado准备工作
工作环境 vivado 2024.1, ubuntu 22.04.3。
创建 vivado 工程,例如叫做 ZCU102-PSPL-LED。
和 Helloworld 一样在 Block Design 对 ZynqMP 芯片初步配置。
GPIO配置
点击 + 号新增两个 GPIO
GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,这里我们加入的 GPIO 将可以让 PL段的 LED灯、按钮得以通过 GPIO 连接到 AXI 进而和 PS 进行交互。
GPIO 0 配置 LED 输出
Xilinx 提供的 AXI GPIO IP 核有两条通道,因此其实可以使用一个 GPI ...
ZCU102初步-使用 Petalinux 基于 BSP 构建 Linux
前言从上一篇从 0 开始构建 Linux 可以看出,有一些坑点和难点,可能最终难度上也会比较高,所以在对自定义需求不高的情况下,本篇提供一种基于 BSP 快速构建 Linux 的方式方法。
BSPBSP 即板级支持包,是定义如何支持特定硬件设备、设备组或硬件平台的信息集合。其介于底层硬件和上层软件之间,目的是为了向上层软件屏蔽下层硬件。
做个类比的话,笔者认为 .xsa 文件就归属于 BSP
使用
依旧是基于 Petaliunx 2024.1,首先在官网下载 ZCU102 BSP,其位置在 Petalinux 下载界面滚轮下滑。
BSP 使用要通过 Petalinux 来进行,因此首先激活 Petalinux 环境。source settings.sh
petalinux-create -t project -s <BSP路径>,通过此命令即可使用下载好的 BSP 创建出对应的 Petalinux 工程。
里面的 Pre-build 即为预先编译好的 images,可以直接拿去用。如果要求不高,至此就已经结束了。
如果想进行一些自定义,里面也有 viv ...
ZCU102初步-使用 PetaLinux 从 0 构建 Linux
写在开头本文介绍了使用 Petalinux 在 ZCU102 硬核上启动 Linux 的方式方法。 PetaLinux 版本为 2024.1
硬件设计参照 ZCU102初步-HelloWorld 配置硬件资源,导出 .xsa 文件,需要注意一定配好 SD Card。 本文将使用 SD Card 来 Boot Linux。而非 HelloWorld 中的 QSPI 方法。
PetaLinux介绍PetaLinux 是 Xilinx 开发出来为 FPGA 运行系统的一套懒人化工具链,其输入类似于 Vitis,为 .xsa 的硬件描述文件。其根据硬件描述文件为其生成启动 Linux 的一切程序,包括但不限于 fsbl、u-boot、linux 本体、设备树,并且将其合并为 Boot.bin,使得用户可以直接使用 Petalinux 的产物在 FPGA 开发板上启动 Linux。
使用过程
首先一定进入 PetaLinux 的用户手册查找安装对应版本的 Petalinux 所需要的环境,在不符合要求的环境上运行 PetaLinux 出现任何奇怪报错都是可能的!
笔者使用版本为 2024.1,U ...
ZCU102初步-HelloWorld
写在开头本文讲述了 Xilinx Zynq UltraScale+ MPSoc ZCU102 从开箱到运行第一个程序-HelloWorld 的全部过程。
机器自检如果是初次拿到 ZCU102 这块板子,个人非常建议在使用之前按照随箱附带的手册进行自检。因为对 ZCU102 的 QSPI Flash 进行烧写后,这段位于 QSPI Flash 自检程序将会被删除。
具体操作参看手册。
Vivado 硬件设计以截止文章发表时最新的 Vivado 2024.1 为例
安装注意事项由于涉及到了后续的软件开发,所以需要安装 Vivado SDK 该工具在 Vivado 2019.2 后合并到了 Vitis 中,所以需要安装 Vitis Embedded Development。
其次,由于基于 ZCU102 开发,所以 Production Devices 中需要使用 SoCs 和 UltraScale+
笔者使用的安装如下:
创建硬件工程
打开 Vivado -> Create Project
Project Name 自行拟定
Project Type 选择 RTL Proj ...
Hyper-V HCN 配置端口映射
引入windows 开启 Hyper-V 后,会创建一个如图所示的默认虚拟 Switch 用于向虚拟机提供网络:
上图是 Hyper-V 管理器的界面,如图所示,它指示这个默认网络使用 NAT 向虚拟机提供网络,事实上,它使用的是 NAT 的丐版 —— ICS。
究竟两者有什么区别呢?在 Windows 2000 的帮助文件中 ICS 和 NAT 分别叫做 Internet 的转换连接和路由连接,其实说白了 ICS 就是 NAT 的简化版,使用 ICS 无需理解 IP 地址和路由方面的一些知识,并且提供一种局域网中使用 Windows 2000 路由器共享 Internet 的简化配置,不过 ICS 可能不允许局域网和 Internet 主机之间所有的 IP 通信,如《暗黑破坏神》一类的多玩家游戏、实时通讯及其他对等服务,如果在公用 Internet上使用专用地址或同时使用同一端口号,这些应用程序就会中止。而 NAT 的配置需要有关于IP地址和路由配置方面的知识,它的配置比 ICS 要复杂,它允许在局域网和 Internet 主机间所有的IP通信。此外,ICS 只能使用一个合法的公用I ...
编译总结感想
编译总结
课程收获161次提交记录…….在大二的时候久闻编译强度之大,终于在这一学期也是让我真正的亲身体会了一把,但回首这几个月,除了De不出Bug时那绝望的心情,我更多的时候收获的是每一次提交时的自豪与满足。每一次De出Bug、实现功能的成就感。对编译器的理解也是从一开始抓着别人问我该做什么,变成了我知道我该做什么,我写的哪里还有不足等等。这些提升都是实打实的提升。我对编译器的理解也是随着我实践的深入逐渐清晰,原来大一大二时在我眼里十分神秘的编译器也逐渐变得明朗。这种成长的感觉非常棒,足以抵消强度之大的流言。
而且,我认为大家都说编译强度大,我现在更多的倾向是他们没有合理安排自己的时间所导致的,因为我虽然提交次数很多,但我在一学期中并没有特别明显的感受到编译实验带来的时间上的压力,这是因为我对此在开学就有一定的规划,我听取了学长们的建议,结合自己的实际下定决心从开学开始开发,到国庆就完成了不带优化的编译器的实现。这让我后面的时间极其宽松,我甚至可以放着编译实验一周而去做更为急迫的事情。也因此虽然在最后我的时间也不是很充足,但我也不像很多人一样完全缺乏时间进行优化。让我得以取得了一个较 ...
Mips-编译优化总结
优化实现概览前端
函数内联中端
单赋值形式
全局代码移动
全局值编号
全局常量折叠
代数恒等变换
等价指令变换
激进死代码删除
基本块合并后端
全局寄存器图着色分配
局部寄存器OPT分配
立即数乘除优化
指令选择优化
寄存器选择优化具体优化实现函数内联实现方式函数内联有两种实现方式:
写在中端,将函数基本块插入Call的位置,删除Call语句,处理Return,变量重命名。
写在前端,在生成中间代码时如果遇到了Call节点,直接生成一遍该Call调用函数的中间代码。难点与解决方案第一种是最开始想到的方案,好处是可以插入优化后的函数,但比较大的问题是变量的重命名,处理起来比较麻烦,稍有不慎就会出错。
因此我们选择第二种方案作为解决方案,由于中间代码生成的过程本来就是在不断的创建变量、使用变量,将内联做到此处可以让其和正常的代码归一处理,只需要考虑该函数是否适合内联即可。
如图,ToIntermediate即为我在语法树生成中间代码的方法,在这里展示的是CallNode中的ToIntermediate,在这里我调用了FuncDefNode的ToIntermediate将其内联 ...