深圳大学-计算机系统(3)-实验一MIPS指令集实验
实验目标
a) 了解WinMIPS64的基本功能和作用;
b) 熟悉MIPS指令、初步建立指令流水执行的感性认识;
c) 掌握该工具的基本命令和操作,为流水线实验作准备。
实验内容
按照下面的实验步骤及说明,完成相关操作记录实验过程的截图:
1)下载WinMIPS64;运行样例代码并观察软件各个观察窗口的内容和作用,掌握软件的使用方法。(80分)
2)学会正确使用WinMIPS64的IO方法;(10分)
3)编写完整的排序程序;(10分)
实验环境
硬件:桌面PC
软件:Windows,WinMIPS64仿真器
实验步骤及说明
WinMIPS64是一款指令集模拟器,它是基于WinDLX设计的,如果你对于WinDLX这款软件十分熟悉的话,那么对于WinMIPS64也会十分的容易上手。DLX 处理器 (发音为 “DeLuXe”)是Hennessy 和Patterson合著一书《Computer Architecture - A Quantitative Approach》中流水线处理器的例子。WinDLX是一个基于Windows的模拟器。
本教程通过一个实例介绍WinMIPS64的使用方法。WinMIPS64模拟器能够演示MIPS64流水线是如何工作的。
本教程使用的例子非常简单,它并没有囊括WinMIPS64的各个方面,仅仅作为使用WinMIPS64的入门级介绍。如果你想自己了解更多的资料,在给出的winmips64.zip中,有WinMIPS64 — Documentation Summary.html和winmipstut.docx两个文件可以供你随时参考,其中涵盖了WinMIPS64的指令集和模拟器的组成与使用方法。
虽然我们将详细讨论例子中的各个阶段,但你应具备基本的使用Windows的知识。现假定你知道如何启动 Windows,使用滚动条滚动,双击执行以及激活窗口。
(一)、安 装
在Windows下安装WinMIPS64 :
解压给出的winmips64.zip压缩文件到我的电脑上D盘的D:\software\winmips64

(二)、一个完整的例子
1.开始和配置WinMIPS64
在winmips64这个子目录下,双击winmips64.exe文件,即打开了WinMIPS64模拟器,其外观如下图:

为了初始化模拟器, 点击File 菜单中的 Reset all(Ctrl+R) 菜单项即可。
WinMIPS64可以在多种配置下工作。你可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。点击 Configuration / Floating Point Stages(点击Configuration打开菜单,然后点击Architecture菜单项),选择如下标准配置:

如果需要,可以通过点击相应区域来改变设置。然后,点击OK 返回主窗口。
在 Configuration 菜单中的其他四个配置也可以设置,它们是:Multi-Step, Enable Forwarding, Enable Branch Target Buffer 和 Enable Delay Slot。 点击相应菜单项后, 在它的旁边将显示一个小钩。如下图所示(下图仅做功能示范,实验时并没有勾选“Enable Forwarding”):

本次实验要求不要勾选“Enable Forwarding”。
2. 装载测试程序
用标准的text编辑器来新建一个名为sum.s的文件,这个文件的功能是,计算两个整数A、B之和,然后将结果传给C。程序如下:
.data
A: .word 10
B: .word 8
C: .word 0.text
main:
ld r4,A(r0)
ld r5,B(r0)
dadd r3,r4,r5
sd r3,C(r0)
halt
在将该程序装载进WinMIPS64之前,我们必须用asm.exe来检验该输入程序的语法正确性。asm.exe程序文件在所给的winmips压缩包里有,用命令行使用它。具体操作为,打开终端,利用cd命令进到D:\software\WinMIPS64目录中,然后直接使用asm.exe sum.s命令,检查输出结果是否无误。输出结果如下,可知代码无误。

在开始模拟之前,至少应装入一个程序到主存。为此,选择File / OPEN,窗口中会列出当前目录中所有汇编程序,包括sum.s。
按如下步骤操作,可将这个文件装入主存。
- 点击 sum.s
- 点击 open 按钮

现在,文件就已被装入到存储器中了,现在可以开始模拟工作了。
你可以在CODE窗口观察代码内容,可以在DATA窗口观察程序数据了。
CODE窗口如下:

DATA窗口如下:

3.模 拟
在主窗口中,我们可以看见七个子窗口,和一条在底部的状态栏。这七个子窗口分别是Pipeline, Code, Data, Registers, Statistics, Cycles和Terminal。在模拟过程中将介绍每一个窗口的特性和用法。
(1) Pipeline 窗口
在Pipeline窗口中,展示了MIPS64处理器的内部结构,其中包括了MIPS64的五级流水线和浮点操作(加法/减法,乘法和除法)的单元。展示了处于不同流水段的指令。

(2) Code 窗口
我们来看一下 Code 窗口。你将看到代表存储器内容的三栏信息,从左到右依次为:地址 (符号或数字)、命令的十六进制机器代码和汇编命令。
我们可以看到,初始时,第一行为黄色,表示该行指令处于“取指”阶段。
现在,点击主窗口中的 Execution开始模拟。在出现的下拉式菜单中,点击Single Cycle或按 F7键。
这时,第一行变成了了蓝色,第二行变成了黄色,这表示第一行指令处于“译码”阶段,而第二行指令处于“取指”阶段。这些不同的颜色代表指令分别处于不同的流水线阶段。黄色代表“取指”,蓝色代表“译码”,红色代表“执行”,绿色代表“内存数据读或写”,紫色代表“写回”。
接着按F7,直到第五个时钟周期的时候,有趣的事情发生了,“dadd r3,r4,r5”指令没有从“译码”跳到其下一个流水阶段“执行”,并且“sd r3,C(r0)”指令,仍然停留在“取指”阶段,同时在terminal窗口显示一行信息“RAW Stall in ID (RS)”,思考一下这是为什么?

(3) Cycls窗口
我们将注意力放到Cycls窗口上。它显示流水线的时空图。

在窗口中,你将看到模拟正在第五时钟周期,第一条指令正在WB段,第二条命令在MeM段,第四条命令在处于暂停状态(installed),第五条指令也因此停滞不前。这是因为发生了数据相关(第四条指令的dadd命令需要用到寄存器r5的值,但是r5的值并不可用)。
接着点击F7,到第五个时钟周期时,再次发生相关,造成停滞。接着点击F7,直至第十三个时钟周期全部指令执行结束。
值得一提的是,Cycls窗口是分为两个子窗口的,左边的子窗口是一系列的指令,右边的窗口是图示的指令执行过程。其中,左边子窗口的命令是动态出现的,当一条指令在进行“取指”时,该指令才出现,而且,当出现了数据相关的时候,所涉及到的指令会变色,暂停的指令会变成蓝色,而被其影响的后续指令会变成灰色。
(4) Data 窗口
在Data中,我们可以观察到内存中的数据,包括数据内容和地址两个方面,其中地址使用64位表示。
如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行。

上图即为第十三个时钟周期的data窗口的图示,其中,左边一行即为用64位表示的内存地址,中间行为数据的内容,右边的一行为相关的代码。可以看出,在这个时钟周期,A与B的值分别为0xa和0x8,C的值为0x12,表明A与B的值之和已经相加并保存到了C中。
(5) Registers 窗口
这个窗口显示存储在寄存器中的值。
如果该寄存器为灰色,那么它正处于被一条指令写入的过程,如果它用一种颜色表示,那么就代表,该颜色所代表的的流水线阶段的值可以用来进行前递(forwarding)。同时,这个窗口允许你交互式的该变寄存器的值,但是前提是该寄存器不能处于被写入或者前递的阶段。如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行,然后按OK来进行确定。

上图即为第十三个时钟周期的Registers窗口的图示,很显然,其中可以很清楚的看出每个寄存器的值是什么。
(6) Statistics 窗口
最后我们来看一下Statistics 窗口。
这个窗口是用来记录一些模拟周期的统计数据。其中包括Execution,Stalls,和Code Size三个大项。其中,Execution用来显示模拟周期中指令数,执行周期数和CPI(没条指令所用周期数),Stalls用来表示暂停的周期数,并且分门别类的进行了统计,其中包括RAW Stalls,WAW Stalls,WAR Stalls, Structural Stalls, Branch Taken Stalls和Branch misprediction Stalls。Code Size表示了代码的大小,用byte表示。

上图即为Statistics窗口的图示,其中表示了该程序有13个时钟周期,5条指令,CPI
为2.600,有4个RAW Stalls,代码大小为20个Bytes。
(三)、更多操作
首先,点击File/Reset MIPS64(ctrl + R)进行重置。如果你点击File/Full Reset,你将删除内存中的数据,这样你就不得不重新装载文件,所以点击File/Reload(F10)是一个很方便的重置的方法。
你可以一次推进多个时钟周期,方法是点击Execute/Multi cycle(F8),而多个时钟周期数是在Configure/Multi-step中设置的。
你也可以通过按F4一次完成整个程序的模拟。同时,你可以设置断点,方法是,在Code窗口中左键双击想要设置断点的指令,该指令会变成蓝色,然后点击F4,程序就会停在这条指令执行“ 取指”的阶段,如果想要清除断点,再次左键双击改行指令。
(四)、终端I/O的简单实例
通过上面对WinMIPS64的了解,我们可以开始简单的使用该工具了。
这里,需要我们编写一个简单的终端输出“Hello World!!”的小程序,运行并且截图。所以,我们需要了解如何将数据在终端中输出输入。
下图是I/O区域的内存映射,一个是控制字,一个是数据字:

所以我们需要先将CONTROL和DATA地址读取到寄存器,然后分别在这两个区域内存储相应的序列号(如上图所示)和要显示在Terminal窗口的数据,同时,设置CONTROL为9,我们能对其进行读取数据。
请编写完整程序,输出“Hello World!”字符串。helloworld.s文件如下:

然后通过asm.exe来检验该程序的语法正确性

然后在WinMIPS64中的File栏中open打开文件。最后一步步按F7,同时观察各个窗口。最终还要截取Terminal窗口,图如下:

证明你的程序结果输出了“Hello World!”。
(五)、编写排序算法
在这一部分,我们要求编写一个排序算法,对一组int型数据进行排序。该算法使用冒泡排序法,并且在其中嵌入一个swap函数过程(该算法在课本上有完整的程序,但是其中的数据初始化、寄存器映射、命令的映射以及I/O部分还需要自己手动编写)。编写完成后,在asm.exe中进行检测,然后运行。
初始数据要求为:“array: .word 8,6,3,7,1,0,9,4,5,2”
该程序需要对0到10,十个数进行了排序,其中使用了sort和swap两个函数过程,并且swap是嵌套在sort中的,在编写程序的时候一定要注意使用栈来保留寄存器的值,嵌套时还额外需要保存$ra的值。代码如下:
首先是数据字段和主函数,主函数里头,打印排序前的数组,然后调用冒泡排序,然后打印排序后的数组。


以下代码为冒泡函数,用于排序一个数组,参数为数组和数组长度。


以下是swap函数,用于交换两个数。

然后通过asm.exe来检验该程序的语法正确性:


(六)、结束语
本实验通过一个例子介绍了WinMIPS64的重要特性,使你对流水线和MIPS64的操作类型有了一定的了解。当然,你还必须学习更多的知识,才能更深入地了解WinMIPS64。请参阅在winmips.zip压缩文件中的相关资料。
实验总结与体会
- 通过本次实验,我学会了WinMIPS64的基本操作,例如如何载入程序、运行程序等。
- 通过本次实验,我还对流水线有了基本的认识,每个指令就像传送带的货物一样,五个节拍就像是处理货物的机器一般,每个货物在传送带一直往前,指令不断地进行每个节拍,如果有一个节拍暂时无法进行,那么将会等待直到可以执行为止,此时后面的指令都会被阻塞。
- 通过本次实验,我也认识到了流水线的优点:
①允许同时执行多条指令的不同阶段,从而提高了处理器的吞吐量和效率
②多条指令可以同时处于不同阶段,整体的指令执行时间会缩短。 - 通过编写冒泡排序程序,我有效地应用了所学到的MIPS指令集知识,巩固了我的编程能力。
实验代码
.data
arr: .word 61, 11, 65, 47, 9, 74, 79, 70, 91, 91, 97, 10, 65, 10, 3, 6, 20, 75, 29, 12, 95, 71, 85, 24, 42, 59, 55, 50, 23, 81, 64, 14, 9, 56, 15, 78, 96, 35, 57, 6
before: .asciiz "before sort the array is:\n"
after: .asciiz "after sort the array is:\n"
CONTROL: .word 0x10000
DATA: .word 0x10008
SP: .word 0x300 # 堆栈指针.text
main:ld r16, CONTROL(r0) ld r17, DATA(r0) # 打印提示信息 "Before sort the array is:\n"daddi r8, r0, 4 daddi r9, r0, before sd r9, (r17) sd r8, (r16) # 打印数组daddi r8, r0, 2 daddi r2, r0, 40 daddi r1, r0, 0
print1:# 打印 arr[i]dsll r3, r1, 3 ld r9, arr(r3) sd r9, (r17) sd r8, (r16) daddi r1, r1, 1 # i++bne r1, r2, print1 # 循环未结束,继续打印# 调用冒泡排序ld r29, SP(r0) # r29 <- M[SP], 用于维护堆栈指针daddi r4, r0, arr # 参数1: a[]daddi r5, r0, 40 # 参数2: njal bubbleSort # 跳转到bubbleSort函数# 打印提示信息 "After sort the array is:\n"daddi r8, r0, 4 daddi r9, r0, after sd r9, (r17) sd r8, (r16) # 打印数组daddi r8, r0, 2 daddi r2, r0, 40 daddi r1, r0, 0
print2:# 打印 arr[i]dsll r3, r1, 3 ld r9, arr(r3) sd r9, (r17) sd r8, (r16)daddi r1, r1, 1 # i++bne r1, r2, print2 # 循环未结束,继续打印halt# 冒泡排序
bubbleSort:# 分配栈帧,保存返回地址和寄存器数据daddi r29, r29, -24 sd $ra, 16(r29) sd r16, 8(r29) sd r17, 0(r29) dadd r22, r4, r0 # r22 = a[]daddi r23, r5, 0 # r23 = ndaddi r18, r0, 0 # r18 = i = 0
loop1:# for (int i = 0; i < n - 1; i++)daddi r10, r23, -1 # r10 = n - 1slt r11, r18, r10 # 当r18 < r10,r11 = 1beq r11, r0, end1 # 如果i >= n - 1,跳转到 end1daddi r19, r0, 0 # r19 = j = 0daddi r20, r23, -1 # r20 = n - 1dsub r20, r20, r18 # r20 = n - 1 - i
loop2:# for (int j = 0; j < n - 1 - i; j++)slt r11, r19, r20 # 当r19 < r20,r11 = 1 beq r11, r0, end2 # 如果j >= n - 1 - i,跳转到 end2dsll r12, r19, 3 # r12 = j * 8dadd r13, r22, r12 # r13 = a + j * 8ld r14, 0(r13) # r14 = M[r13] = a[j]ld r15, 8(r13) # r15 = M[r13 + 8] = a[j + 1]# if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);slt r11, r15, r14 # 当r15 < r14,r11 = 1beq r11, r0, no_swap # 如果不交换,跳转到 no_swap# 交换 a[j] 和 a[j + 1]dadd r4, r0, r13 # 参数1: a + j * 8 a[j]daddi r5, r13, 8 # 参数2: a + (j + 1) * 8 a[j + 1]jal swap no_swap:daddi r19, r19, 1 # j++ j loop2 # 循环到 loop2end2:daddi r18, r18, 1 # i++j loop1 # 循环到 loop1end1:# 恢复寄存器数据和堆栈帧ld r17, 0(r29) ld r16, 8(r29)ld $ra, 16(r29) daddi r29, r29, 24 jr $ra swap: # 交换 a[i] 和 a[j]ld r9, 0(r4) # r9 = a[i]ld r10, 0(r5) # r10 = a[j]sd r10, 0(r4) # a[i] = r10sd r9, 0(r5) # a[j] = r9jr $ra # 返回到M[PC]相关文章:
深圳大学-计算机系统(3)-实验一MIPS指令集实验
实验目标 a) 了解WinMIPS64的基本功能和作用; b) 熟悉MIPS指令、初步建立指令流水执行的感性认识; c) 掌握该工具的基本命令和操作,为流水线实验作准备。 实验内容 按照下面的实验步骤及说明,完成相关操作记录实验过程的截图&a…...
Java面试专题——面向对象
面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…...
知行合一:解决有心无力的问题,解决知易行难的问题,知行合一并不意味着事事都要合一,而是....
问题是什么? 想学习的时候,有手机阻碍我们。想戒掉手机短视频,卸载后,几天的时间,又下载了回来。制定了减肥计划,但就是不执行。明知道这样做是不对的,但依然行动不起来。 沉溺于各种各样的享…...
Qt中自定义信号与槽
在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体…...
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前,请确保你已经具备以下环境: Linux 系统(如 Ubu…...
深入了解 Java split() 方法:分割字符串的利器
Java 提供的 split() 方法是 String 类中一个常用的工具,它可以将一个字符串根据指定的分隔符切割成多个子字符串,并以字符串数组的形式返回。这个方法常用于字符串的处理、数据解析等场景。本文将详细介绍 Java 中 split() 方法的使用方式,并…...
pgsql中处理数组类型字段
1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...
如何正确定位前后端bug?
在平时的开发过程中,正确定位前后端bug是提高开发效率和项目质量的关键。以下是一些实用的方法。 一、前后端bug 特征 前端主要负责显示数据,后端主要负责处理数据、存储数据,前后端主要通过接口进行数据交换。 1.前端bug特征 界面显示类…...
mfc操作json示例
首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...
【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作
目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线,也是2025要继续的主线 1.今年的创作路线 今年的写作内…...
Dockerfile另一种使用普通用户启动的方式
基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件(如果有的话) COPY sources.list /etc/apt/sources.list # 创建…...
python的pushbullet库在设备之间发送通知链接文件
Pushbullet 是一个非常方便的 Python 库,可以帮助你在设备之间发送通知、链接、文件等。以下是 Pushbullet 的一些主要功能和使用方法: 功能 与你的 Pushbullet 账户关联的设备(需要下载对应的pushbullet手机APP、电脑客户端)之…...
STM32之FreeRTOS开发介绍(十九)
STM32F407 系列文章 - freertos(十九) 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...
用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...
DCGAN - 深度卷积生成对抗网络:基于卷积神经网络的GAN
深度卷积生成对抗网络(DCGAN,Deep Convolutional Generative Adversarial Network)是生成对抗网络(GAN)的一种扩展,它通过使用卷积神经网络(CNN)来实现生成器和判别器的构建。与标准…...
51c~SLAM~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM:A General SLAM Framework and Benchmark 开源代码:https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…...
优化使用 Flask 构建视频转 GIF 工具
优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中,我们将实现以下功能: 可设置每个 GIF 的帧率和大小:用户可以选择 GIF 的帧率和输出大小。改进的用户界面:使用更现代的设计使界面更美观、整洁。自定义…...
spring cloud如何实现负载均衡
在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...
leetcode19-删除链表的第n结点
leetcode 19 思路 要删除倒数第n个元素,那么就要找到倒数第n1个元素,那么我们需要两个指针来记录,首先快指针需要先走n1步,然后快慢指针一起进行移动,直到快指针为null的时候,此时慢指针恰好走到倒数第n…...
软件测试—— 接口测试(HTTP和HTTPS)
软件测试—— 接口测试(HTTP和HTTPS) HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头(Request Headers)示例请求标头 响应标头(Response Header…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
